我使用.Net Framework 2.0 Serialport类在C#2.0中编写了一个简单的应用程序,通过COM1与控制器卡进行通信.
最近出现的问题是Read方法返回的字节不正确.它返回了正确的字节数,只有值不正确.用Delphi编写的类似应用程序仍返回正确的值.
我使用Portmon来记录两个应用程序的串行端口上的活动,比较两个日志和那里的一些(显然)次要的不同设置,我试图尽可能地模仿Delphi应用程序,但无济于事.
那么,什么会影响Read方法返回的字节值?
两个应用之间的大多数设置都是相同的.
以下是Portmon日志中不同行的列表:
德尔福应用:
IOCTL_SERIAL_SET_CHAR Serial0 SUCCESS EOF:dc
ERR:0 BRK:0 EVT:0 XON:11 XOFF:13
IOCTL_SERIAL_SET_HANDFLOW Serial0 SUCCESS Shake:0
Replace:0 XonLimit:256
XoffLimit:256 IOCTL_SERIAL_SET_TIMEOUTS Serial0 SUCCESS RI:-1
RM:100 RC:1000 WM:100 WC:1000 IOCTL_SERIAL_SET_WAIT_MASK Serial0 SUCCESS Mask:
RXCHAR RXFLAG TXEMPTY CTS DSR RLSD
BRK ERR RING RX80FULL
C#App:
IOCTL_SERIAL_SET_CHAR Serial0 SUCCESS EOF:1a
ERR:0 BRK:0 EVT:1a XON:11 XOFF:13
IOCTL_SERIAL_SET_HANDFLOW Serial0 SUCCESS Shake:0
Replace:0 XonLimit:1024
XoffLimit:1024 IOCTL_SERIAL_SET_TIMEOUTS Serial0 SUCCESS RI:-1
RM:-1 RC:1000 WM:0 WC:1000 IOCTL_SERIAL_SET_WAIT_MASK Serial0 SUCCESS Mask:
RXCHAR RXFLAG CTS DSR RLSD BRK ERR
RING
更新:
正确的返回字节是:91,1,1,3,48,48,50,69,66,51,70,55,52,93(14字节).
最后一个值是一个简单的校验和.
返回的错误值是:91,241,254,252,242,146,42,201,51,70,55,52,93(13字节).
如您所见,返回的第一个和最后五个字节对应.
ErrorReceived事件表示发生了帧错误,这可以解释错误的值.但问题是,当Delphi应用显然没有时,为什么SerialPort会遇到帧错误?
最佳答案 好吧,好像问题已经解决了(至少目前是这样).
显然,帧错误导致返回不正确的值.我编写了一个VB6应用程序,使用MSComm控件,工作正常,并比较了Portmon生成的日志文件.
我发现了以下不同之处
VB6应用程序:
IOCTL_SERIAL_SET_HANDFLOW Serial0
SUCCESS Shake:1 Replace:0
XonLimit:256 XoffLimit:256
C#App:
IOCTL_SERIAL_SET_HANDFLOW Serial0
SUCCESS Shake:0 Replace:0
XonLimit:1024 XoffLimit:1024
玩弄设置,我发现如果我设置
_serialPort.DtrEnable = true
C#App生成以下日志条目:
IOCTL_SERIAL_SET_HANDFLOW Serial0
SUCCESS Shake:1 Replace:0
XonLimit:1024 XoffLimit:1024
这似乎可以防止框架错误,应用程序似乎工作正常.