C#新手求助:如何通过串口发送指定ASCII码?
C#发送Modbus ASCII指令的正确方法
你当前的代码错误在于:直接将十六进制字符串的字符转成了ASCII字节,而不是把每两位十六进制字符解析为对应的实际字节。比如原指令里的3A代表十六进制字节0x3A(对应ASCII的:),但你的代码会把字符3转成0x33、字符A转成0x41,完全偏离了目标指令;另外原指令已经包含0D 0A(即\r\n),你额外添加的\r\n会导致指令格式错误。
正确的做法是先将带空格的十六进制字符串转换为字节数组,再通过串口发送:
完整代码示例
// 从ModBus Poll获取的原始十六进制指令(带空格) string modbusHex = "3A 30 31 30 36 30 30 30 30 30 30 30 30 46 39 0D 0A"; // 第一步:去掉字符串中的空格 string cleanHex = modbusHex.Replace(" ", string.Empty); // 第二步:将每两位十六进制字符转换为一个字节 byte[] sendBuffer = new byte[cleanHex.Length / 2]; for (int i = 0; i < cleanHex.Length; i += 2) { // 截取两位十六进制字符串,转换为字节 sendBuffer[i / 2] = Convert.ToByte(cleanHex.Substring(i, 2), 16); } // 第三步:通过串口发送字节数组 serialPort1.Write(sendBuffer, 0, sendBuffer.Length);
额外注意事项
- 确保串口参数(波特率、奇偶校验、停止位、数据位)和开发板的Modbus ASCII配置完全匹配,通常Modbus ASCII采用偶校验、1停止位、8数据位。
- 发送前确认串口已正确打开(
serialPort1.IsOpen为true)。
内容的提问来源于stack exchange,提问作者ehsan Jahromi
相关产品推荐
相关产品推荐

