Arduino与其他单片机进行串口通信,传输内容大于1字节怎么办
我想通过Serial.write传输一组数,每个数都是2500左右,大于255,但Serial.write每次只能传1byte怎么办?谢谢 要是2500±127以内那就减去个2373在传输呗,再不然只能分几个字节再加标志位了……或者传字符串说实话我也很纠结这个问题,不知道有没有合适的库专门解决串口传数据的 http://www.geek-workshop.com/forum.php?mod=viewthread&tid=264
道理是一样的,最后来个for循环发送就可以了
for(i = 0; i < m_nSndBufLen; i++) // 发送普通帧
Serial.write(m_pSndBuf);
m_pSndBuf[] 缓冲区数组 SS15 发表于 2012-3-28 16:18 static/image/common/back.gif
http://www.geek-workshop.com/forum.php?mod=viewthread&tid=264
道理是一样的,最后来个for循环发送就 ...
SS兄,知不知道串口通信是怎么防止比特错位的?我传数据的时候时不时会有字节错位,想学习借鉴一下。 比特错位是怎么回事?我从来没有遇见过。从波特率 9600 到 115200
按理说这个应该是由串口通讯协议来确保的,作为编程者无需关心的啊,除非是你要实现自己的串口通讯协议才会遇到啊
SS15 发表于 2012-3-28 17:05 static/image/common/back.gif
比特错位是怎么回事?我从来没有遇见过。从波特率 9600 到 115200
按理说这个应该是由串口通讯协议来确保的 ...
比如发送的是00001111 00001111 00001111……
要是丢了一位没有收到,就变成了
00011110 00011110……后面的数据就全都无效了
问了下谷哥,似乎是靠一个停止位来判断的,就是没明白怎么区分停止位和数据位的
我按字节传数据的时候也有这个问题,索性在开头加一个标志,比如255表示开始,数据就只能是0-154 黑马 发表于 2012-3-28 20:11 static/image/common/back.gif
比如发送的是00001111 00001111 00001111……
要是丢了一位没有收到,就变成了
00011110 00011110……后 ...
加个奇偶校验 Malc 发表于 2012-3-28 20:21 static/image/common/back.gif
加个奇偶校验
就是没搞懂,接收端是怎么识别哪一个是数据位,哪一个是校验位,哪一个是停止位呢? 黑马 发表于 2012-3-28 20:28 static/image/common/back.gif
就是没搞懂,接收端是怎么识别哪一个是数据位,哪一个是校验位,哪一个是停止位呢?
这个校验我也没怎么研究过
最简单的奇偶校验就是 8位 一字节,前7位为数据,最后为为校验
其他什么停止位、协议什么的不太懂 SS15 发表于 2012-3-28 17:05 static/image/common/back.gif
比特错位是怎么回事?我从来没有遇见过。从波特率 9600 到 115200
按理说这个应该是由串口通讯协议来确保的 ...
你好,我想问下,您知不知道要怎么写自己的串口通信协议? 黑马 发表于 2012-3-28 20:11 static/image/common/back.gif
比如发送的是00001111 00001111 00001111……
要是丢了一位没有收到,就变成了
00011110 00011110……后 ...
串口协议已经定义了起始位,数据位,停止位。区分停止位和数据位很简单,就靠数个数。
传输线默认状态是1,起始位是0,那么只要来一个下降沿,就可以认为是传输开始了。
然后就按照设置好的波特率数比特,比如是8数据位的就读8个比特,然后最后应该是个1,就是结束位。
但是异步串口因为没有时钟信号(只能靠约定好的波特率各自用各自的时钟),信号形状不好的情况下确实可能出现收到数据比特反转的情况。
所以串口协议本身提供了最简单的奇偶校验,说白了就是计算数据里面1的个数是偶数个还是奇数个。
奇偶校验只能检验出奇数个比特位反转的错误,比如1个,3个,5个比特错了。如果是偶数个比特反转,就无能为力了。
如果你想要更近一步保证数据的正确性,就要加更多的校验,至少是CRC。那么你就有必要在串口协议之上定义你自己的协议,最简单的就是定义一个数据帧结构。
比如,传8个字节作为一个帧,第一个字节固定是 0xA5, 收到 0xA5 就认为是正常数据帧,然后 6个字节是有效数据,然后第7个字节放CRC校验码,然后最后一个字节是0x5A ....
这样你就能加入你自己的校验信息,只用用什么校验,CRC,哈希,各种纠错码,各种冗余校验...随便你啦。
你也可以参考其它协议的帧结构定义你自己的通信协议。
还有一种简单但是费时的方式,你把一个数据传两次,如果一样就认为是ok. 或者接受方把收到的数据传回给发送方,发送方比较一下,如果一样就认ok.
初学者学习
页:
[1]