工程师朋友,您好。
我用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