|
发表于 2017-6-4 17:40:13
|
显示全部楼层
本帖最后由 Super169 于 2017-6-4 17:55 编辑
不好意思, 想按回覆, 按错了反对. 怎麽没法取消的.
他最初的数据, 问题在於乱来 delay 做法.
两边执行再 delay 结果不同, 在一开始亦从没同步, 之後出现了一次积存了一份未读的数据, 在第2份发送同时, 开始读取.
结果就收到多於 14个数, 而因为读取时没 delay, 结果数值就分拆的读了.
再加上他没有在开始时清除 data, 就是没填满也会显示出 20 个数了.
重点在於写接收端时, 并不是根据接收的东西去处理, 而是用 delay 碰运气.
补充一点: 接收端每接收一个字符之后delay(2)保证数据不会遗漏
这不一定是好的, 而且也要计算因应发送速度改变.
以 9600bps 计算, 发送 8 bit 大约是 1ms, delay 1-2 ms 影响不大.
如果是再快一点的通讯, 以 115200 为例, 发送一个 8 bit 只需 0.07ms, 如果每个 bit 停 2ms, 发送端就已发出了28个 byte, 要看你的 buffer size, 如果是 64 byte 的 buffer, 而且发送是连续的, 你接收 3 个 byte 後就会出现 buffer overflow. 不能再接收了.
比较好方法, 是不作任何延迟, 而基於接收到的资料决定是否要再读下去.
比如数据的结束码是 "#", 在没收到 "#" 在前, 都是同一笔数据, 一直把接收到的填进 data 中就可以了. 直到收到 "#" 就进行处理, 次後重设一次, 准备等待下一次数据的到来.
另外, 发送端是不用 delay 的, 接收端加 delay, 是因为想多点时间让连续的数据可以一拼读取.
那发送端的 delay, 又有什麽作用? 只会把数据分散了, 读取的就更难处理. |
|