You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 05:40:32