Re: [.NET] rs232 讀取字串亂碼
※ 引述《Shinn0 (亂紅蓮)》之銘言:
: 這問題我已經解決,
: 卻發現每次讀取出來的字串會有兩種情況
: 1.完整預期的字串 OK這沒問題
: 2.斷頭or斷尾 也就是不完整的字串
: 我這邊是使用
: SerialPort1_DataReceived or Timer 這兩種方法自SerialPort1.ReadExisting
: 讀取資料
: 不過都發生上述的問題
: 要如何才能防止該狀況發生?
簡單的說, 接收 Serial Port 的時候不應該預期每次產生 DataReceived 事件的時候
你會得到他完整送來的封包, 因為 Serial Port 的接收是以 Byte 計,
他也不知道你整個送過來的封包 (字串) 有多長,
所以他接收到資料或是緩衝區滿了就會產生 DataReceived 事件 (實際狀況不清楚)
所以一般來說我的作法是我自己有一個 FIFO 的 Ring Buffer, 每次接收到東西先放進去
拷貝完這次所收到的資料之後開始掃 FIFO Buffer, 找到我封包的 Header 和 Tail
(以字串來說可能是 \r\n 看你們雙方怎麼定義)
確定整個封包都收到且 Checksum 正確才送去處理封包...
如果這次產生事件只有不完整的封包就等下一次產生事件繼續填到 FIFO Ring Buffer
然後再掃描一次直到確定整個封包都收到...
Serial Port 不像 TCP/IP 那樣, Driver/OS 會幫你處理這些東西
--
It is better to be approximately right than exactly wrong.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 122.116.91.238
推
04/16 17:12, , 1F
04/16 17:12, 1F
推
04/16 22:50, , 2F
04/16 22:50, 2F
→
04/17 00:05, , 3F
04/17 00:05, 3F
→
04/17 00:06, , 4F
04/17 00:06, 4F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 3 篇):