我寫了一個簡單的應用程序在C#2.0中使用.Net Framework 2.0 Serialport類通過COM1與控制器卡進行通信。什麼可能影響值由Serialport.Read()
最近發生的問題是Read方法返回的字節不正確。它返回了適量的字節,只有值不正確。用Delphi編寫的類似應用程序仍然返回了正確的值。
我用Portmon來記錄兩個應用程序的串行端口上的活動,比較兩個日誌,並在那裏顯示了一些(顯然)小的不同設置,我嘗試儘可能地模仿Delphi應用程序,但是沒有無濟於事。
那麼,什麼會影響Read方法返回的字節值呢?
這兩個應用程序之間的大部分設置都是相同的。
這裏是一個不同的Portmon日誌中的行的列表:
Delphi應用程序:
IOCTL_SERIAL_SET_CHAR的Serial0 SUCCESS EOF:直流 ERR:0 BRK:0 EVT :0 XON:11 XOFF:13
IOCTL_SERIAL_SET_HANDFLOW Serial0 SUCCESS Shake:0 替換: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面膜: RXCHAR RXFLAG TXEMPTY CTS DSR RLSD BRK ERR RING RX80FULL
C#應用程序:
IOCTL_SERIAL_SET_CHAR的Serial0 SUCCESS EOF:1A ERR:0 BRK:0 EVT:1A XON:11 XOFF:13 IOCTL_SERIAL_SET_HANDFLOW的Serial0 SUCCESS搖:0 替換: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面膜: RXCHAR RXFLAG CTS DSR RLSD BRK ERR RING
UPDATE:
正確返回的字節分別爲: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會遇到幀錯誤?
也許你可以給一些錯誤的數據的樣本,旁邊的是正確的。如果我們能看到什麼是不正確的,我們可能會猜到這個問題。 – ravenspoint 2008-09-22 22:30:47