qiuqiuaaa 发表于 2012-3-28 15:20:23

Arduino与其他单片机进行串口通信,传输内容大于1字节怎么办

我想通过Serial.write传输一组数,每个数都是2500左右,大于255,但Serial.write每次只能传1byte怎么办?谢谢

黑马 发表于 2012-3-28 15:49:47

要是2500±127以内那就减去个2373在传输呗,再不然只能分几个字节再加标志位了……或者传字符串

说实话我也很纠结这个问题,不知道有没有合适的库专门解决串口传数据的

SS15 发表于 2012-3-28 16:18:03

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[] 缓冲区数组

黑马 发表于 2012-3-28 16:27:52

SS15 发表于 2012-3-28 16:18 static/image/common/back.gif
http://www.geek-workshop.com/forum.php?mod=viewthread&tid=264

道理是一样的,最后来个for循环发送就 ...

SS兄,知不知道串口通信是怎么防止比特错位的?我传数据的时候时不时会有字节错位,想学习借鉴一下。

SS15 发表于 2012-3-28 17:05:55

比特错位是怎么回事?我从来没有遇见过。从波特率 9600 到 115200
按理说这个应该是由串口通讯协议来确保的,作为编程者无需关心的啊,除非是你要实现自己的串口通讯协议才会遇到啊




黑马 发表于 2012-3-28 20:11:15

SS15 发表于 2012-3-28 17:05 static/image/common/back.gif
比特错位是怎么回事?我从来没有遇见过。从波特率 9600 到 115200
按理说这个应该是由串口通讯协议来确保的 ...

比如发送的是00001111 00001111 00001111……
要是丢了一位没有收到,就变成了
00011110 00011110……后面的数据就全都无效了
问了下谷哥,似乎是靠一个停止位来判断的,就是没明白怎么区分停止位和数据位的
我按字节传数据的时候也有这个问题,索性在开头加一个标志,比如255表示开始,数据就只能是0-154

Malc 发表于 2012-3-28 20:21:17

黑马 发表于 2012-3-28 20:11 static/image/common/back.gif
比如发送的是00001111 00001111 00001111……
要是丢了一位没有收到,就变成了
00011110 00011110……后 ...

加个奇偶校验

黑马 发表于 2012-3-28 20:28:56

Malc 发表于 2012-3-28 20:21 static/image/common/back.gif
加个奇偶校验

就是没搞懂,接收端是怎么识别哪一个是数据位,哪一个是校验位,哪一个是停止位呢?

Malc 发表于 2012-3-28 21:27:11

黑马 发表于 2012-3-28 20:28 static/image/common/back.gif
就是没搞懂,接收端是怎么识别哪一个是数据位,哪一个是校验位,哪一个是停止位呢?

这个校验我也没怎么研究过
最简单的奇偶校验就是 8位 一字节,前7位为数据,最后为为校验
其他什么停止位、协议什么的不太懂

chellychen 发表于 2015-7-9 21:45:18

SS15 发表于 2012-3-28 17:05 static/image/common/back.gif
比特错位是怎么回事?我从来没有遇见过。从波特率 9600 到 115200
按理说这个应该是由串口通讯协议来确保的 ...

你好,我想问下,您知不知道要怎么写自己的串口通信协议?

liupangui 发表于 2015-7-10 09:03:00

黑马 发表于 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.

mondaywoo 发表于 2015-8-11 23:01:06

初学者学习
页: [1]
查看完整版本: Arduino与其他单片机进行串口通信,传输内容大于1字节怎么办