作者TroyLee (TroyLee)
看板Visual_Basic
标题Re: [.NET] rs232 读取字串乱码
时间Sat Apr 16 14:03:32 2011
※ 引述《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
1F:推 horngsh:大推回文详细 04/16 17:12
2F:推 Semisphere:Socket不也是要用这种方式写吗? 看来我多浪费资源xd 04/16 22:50
3F:→ TroyLee:我指的是 TCP/IP 的 Packet/Frame Header 那些.. 04/17 00:05
4F:→ TroyLee:不过我对 TCP/IP 不熟...所以也不是很清楚orz 04/17 00:06