极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 29705|回复: 11

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

[复制链接]
发表于 2012-3-28 15:20:23 | 显示全部楼层 |阅读模式
我想通过Serial.write传输一组数,每个数都是2500左右,大于255,但Serial.write每次只能传1byte怎么办?谢谢
回复

使用道具 举报

发表于 2012-3-28 15:49:47 | 显示全部楼层
要是2500±127以内那就减去个2373在传输呗,再不然只能分几个字节再加标志位了……或者传字符串

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

使用道具 举报

发表于 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
http://www.geek-workshop.com/forum.php?mod=viewthread&tid=264

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

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

使用道具 举报

发表于 2012-3-28 17:05:55 | 显示全部楼层
比特错位是怎么回事?我从来没有遇见过。从波特率 9600 到 115200
按理说这个应该是由串口通讯协议来确保的,作为编程者无需关心的啊,除非是你要实现自己的串口通讯协议才会遇到啊




回复 支持 反对

使用道具 举报

发表于 2012-3-28 20:11:15 | 显示全部楼层
SS15 发表于 2012-3-28 17:05
比特错位是怎么回事?我从来没有遇见过。从波特率 9600 到 115200
按理说这个应该是由串口通讯协议来确保的 ...

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

使用道具 举报

发表于 2012-3-28 20:21:17 | 显示全部楼层
黑马 发表于 2012-3-28 20:11
比如发送的是00001111 00001111 00001111……
要是丢了一位没有收到,就变成了
00011110 00011110……后 ...

加个奇偶校验
回复 支持 反对

使用道具 举报

发表于 2012-3-28 20:28:56 | 显示全部楼层
Malc 发表于 2012-3-28 20:21
加个奇偶校验

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

使用道具 举报

发表于 2012-3-28 21:27:11 | 显示全部楼层
黑马 发表于 2012-3-28 20:28
就是没搞懂,接收端是怎么识别哪一个是数据位,哪一个是校验位,哪一个是停止位呢?

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

使用道具 举报

发表于 2015-7-9 21:45:18 | 显示全部楼层
SS15 发表于 2012-3-28 17:05
比特错位是怎么回事?我从来没有遇见过。从波特率 9600 到 115200
按理说这个应该是由串口通讯协议来确保的 ...

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

使用道具 举报

发表于 2015-7-10 09:03:00 | 显示全部楼层
黑马 发表于 2012-3-28 20:11
比如发送的是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.
回复 支持 反对

使用道具 举报

发表于 2015-8-11 23:01:06 | 显示全部楼层
初学者学习
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-16 09:18 , Processed in 0.038301 second(s), 25 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表