Visual Studio 2017串口读取丢失字符19的技术问题求助
问题根源与解决方案
字符19(十进制)是ASCII标准中的XOff控制字符(设备控制3,十六进制0x13)。.NET的SerialPort类如果启用了XOnXOff流控制,会自动将该字符识别为流控制指令(用于暂停数据传输),不会将其作为普通数据放入接收缓冲区,这就是你读取不到它的核心原因。
即使你的代码里没显式设置Handshake属性,Visual Studio窗体设计器中的SerialPort控件可能默认开启了XOnXOff握手模式,导致字符被自动过滤。
解决步骤
1. 显式禁用流控制
在串口初始化代码中添加一行,强制关闭所有流控制:
SerialPort1.Handshake = IO.Ports.Handshake.None
修改后的完整初始化代码如下:
SerialPort1.PortName = "COM" & CStr(NumericUpDown9.Value) SerialPort1.BaudRate = 57600 SerialPort1.Encoding = System.Text.Encoding.GetEncoding(1252) SerialPort1.Parity = IO.Ports.Parity.None SerialPort1.StopBits = IO.Ports.StopBits.One SerialPort1.DataBits = 8 SerialPort1.Handshake = IO.Ports.Handshake.None ' 新增此行
2. 用字节数组读取验证
为了排除编码转换的干扰,建议直接读取原始字节数组确认是否收到字符19:
Dim buffer(1023) As Byte Dim bytesRead As Integer = SerialPort1.Read(buffer, 0, buffer.Length) ' 遍历读取到的字节,检查是否包含19 For i As Integer = 0 To bytesRead - 1 If buffer(i) = 19 Then Console.WriteLine("成功捕获字符19(十六进制0x13)") End If Next
3. 需保留XOnXOff流控制的特殊情况
如果你的设备必须使用XOnXOff流控制,但又需要接收字符19,.NET自带的SerialPort类无法满足需求——它会自动过滤流控制字符。此时可以使用第三方串口库(比如SerialPortStream),这类库支持区分流控制指令和普通数据字节。
补充说明
RealTerm默认不会处理XOnXOff流控制,会直接将所有收到的字节作为原始数据显示,这就是它能完整展示包含字符19的字符串的原因。
内容的提问来源于stack exchange,提问作者AlG1973
相关产品推荐
相关产品推荐

