Re: [.NET] rs232 讀取字串亂碼

看板Visual_Basic作者 (TroyLee)時間13年前 (2011/04/16 14:03), 編輯推噓2(202)
留言4則, 3人參與, 最新討論串3/3 (看更多)
※ 引述《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
Socket不也是要用這種方式寫嗎? 看來我多浪費資源xd
04/16 22:50, 2F

04/17 00:05, , 3F
我指的是 TCP/IP 的 Packet/Frame Header 那些..
04/17 00:05, 3F

04/17 00:06, , 4F
不過我對 TCP/IP 不熟...所以也不是很清楚orz
04/17 00:06, 4F
文章代碼(AID): #1DgJ4wI4 (Visual_Basic)
文章代碼(AID): #1DgJ4wI4 (Visual_Basic)