VS2022 窗体应用中串口接收数据异常

iMI 20 信誉分
2025-04-06T02:18:31.4566667+00:00

工程师朋友,您好。

我用VS2022工具创建了一个基于.NET Framework(4.7.2)的Windows窗体应用,一切都不错,直到我遇到如下问题:

应用中将使用串口与外部进行数据交换,我使用了 工具->组件->SerialPort 和 Timer 两个控件。

作为测试的第一步,我使用一个基于CH340的USB_串口转换器,并将其RX与TX短接,也就是做自发自收测试;通过Timer控件,定时发送1byte数据,并在串口的 DataReceived 事件中将收到的数据存储起来。

程序运行是没错的,除了发送数据为 26(0X1AH)时,程序会自动结束运行并退出。如下的测试后,还没有找到Buger在何处:

1.更改串口属性,包括数据格式、波特率等等,结果依然;

2.将USB_串口转换器插入不同的USB接口,也就是更改COMx串口号,结果依然;

3.在不同的电脑上测试,结果依然;

4.使用中断方式调试运行,当接收到数据为26时,在数据接收处,

SerialPort_B.Read(cDateRx, 0, 1)

触发了运行异常:由于线程退出或应用程序请求,I/O 操作已中止。

5.将上面的数据读操作注销,异常消失;可见异常就在数据读出这里,而且只针对26这个数据出现异常;作为对比,在发送端屏蔽26这个数据后,一切正常。

在ASCII码中,26为 控制符:^Z

我感到非常奇怪,特请教各位。

谢谢!

接收端:

   Private Sub SerialPort_B_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles SerialPort_B.DataReceived

       SerialPort_B.Read(cDateRx, 0, 1)
       'cBuffRx = SerialPort.ReadByte()
       SerialPort_B.DiscardInBuffer()

   End Sub

发送端,定时发送:

   Private Sub Appif_Tx_pro()

 

       If cBuffTx >= dc8Max Then cBuffTx = 0
       cBuffTx = cBuffTx + 1

       'If cBuffTx = 26 Then cBuffTx = cBuffTx + 1

       cDateTx(0) = cBuffTx

       SerialPort_B.Write(cDateTx, 0, 1)

   End Sub
Entity Framework Core
Entity Framework Core
实体框架数据访问技术的轻量型、可扩展、开源、跨平台版本。
53 个问题
0 个注释 无注释
{count} 票

接受的答案
  1. Hongrui Yu-MSFT 5,255 信誉分 Microsoft 外部员工
    2025-04-08T09:20:07.0733333+00:00

    你好,@iMI。欢迎来到 Microsoft 问答。

    根据您描述的情况以及代码行为,问题的根源很可能与ASCII值为26的控制符(Z)有关。在Windows系统中,Z被视为文件结束符(EOF),在串口通信或某些I/O操作中,可能会触发特殊的行为,导致运行异常。

    一般性的解决思路:

    1.对ASCII值26进行特殊处理: 您可以在接收端代码中加入额外的判断,避免直接读取ASCII值为26的数据或在发送端避免直接发送ASCII值为26。

    2.替代方法: 如果问题依然无法解决,可以尝试使用其他的第三方串口库。

    在该篇文档中有针对该问题更详细的描述你可以参考一 下:https://stackoverflow.com/questions/36423786/reading-byte-value-26-in-serialport-vb-net


    如果答案是正确的,请点击“接受答案”并点赞。 如果您对此答案还有其他疑问,请点击“评论”。

    注意:如果您想接收相关电子邮件,请按照我们的文档中的步骤启用电子邮件通知 此线程的通知。

    1 个人认为此答案很有帮助。
    0 个注释 无注释

0 个其他答案

排序依据: 非常有帮助

你的答案

问题作者可以将答案标记为“接受的答案”,这有助于用户了解已解决作者问题的答案。