用C#写的串口通信程序接收数据出错
MAMM 2009-03-12 10:37:18 事件背景:
给定了利用RS485协议的下位机和RS232的下位机,要求按照一定的通信协议用C#2.0实现上位机程序(以下简称上位机),串口的波特率为2400,8位无校验,1停止位。
使用硬件平台:
使用PCI串口(RS232)卡的电脑,RS485与RS232的转换电路
软件:
VS2005,非独占模式的串口监视软件COMgrasp,串口调试助手(MFC+WinAPI编写成的)
程序:
使用C#中内建的SerialPort类进行串口通信并用标准的Invoke方法调用数据处理函数(也就是显示数据),设计了一个直接写在Write方法里的byte数组为第一缓冲区,另有一个将第一缓冲区收到数据拼成完整数据的第二缓冲区(似乎SerialPort类一次最多接受8字节所以要开这个缓冲区)。
过程:
1、为RS232的下位机编写上位机,经测试一切正常;
2、为RS485的下位机编写上位机,尚未使用第二缓冲区,显示返回数据不符合通信协议规范,数据包字节数少且数据本身的值基本全错;
3、用串口调试助手按照通信协议规范发送通信数据包,回显数据符合通信协议,正常;
4、利用串口监视软件监视收发数据,发现无论是正在编写的上位机程序还是串口调试助手,发送给下位机的数据完全相同且符合通信协议,但收回的数据中,两者差别很大,串口调试助手中是逐字节接收而上位机程序是一次接收多字节且每次接收的个数无规律;
5、用一拖二的线把信号引至同一串口卡的另一串口(机器上就这俩串口),同时用上位机程序和串口调试助手监视两个串口,用调试助手向下位机发送数据,调试助手回显数据正常上位机不显示,用上位机向下位机发送数据,调试助手回显数据正常上位机有显示但不正常,串口监视软件的监视情况和两个软件的显示情况相同;
6、在上位机中加入ErrorReceived事件的处理函数,显示错误类型为FRAME,MSDN说明为“硬件检测到一个组帧错误”,出现此错误的时间也是随机的,有的时候回显的数据也不对,但是不报任何错。
俺要求助的问题:
1、C#的SerialPort类,能直接访问输入和输出缓冲区不,要是能的话是哪个方法?我没查到......
2、串口调试助手中对串口接收数据的处理是每收到一个字节就抛出一个WM_RXCHAR消息,在C#中也设置了ReceivedBytesThreshold属性为1字节,为什么收数据的时候触发一次事件就收到不止一字节的数据,关键是还不规律?
3、2400也不算高速,为啥用MFC(或者叫WinAPI)正常而C#收到的数据既丢帧值也错误?所谓的Frame错误又从何而来?
4、如何对SerialPort类进行编程才能纠正上述各种错误,使其能起到和串口调试助手相同的作用?
5、如果解决方案是C#内嵌WinAPI的话,该用哪些函数或类,又该怎么处理线程和事件?