小白求教,串口通信,帧头帧尾校验和的问题

LYuer_ 2018-07-02 09:53:18
串口通信,
1.帧头帧尾校验和是自己定的么?这算是一个协议么?
2.我看到有的协议有帧头没有帧尾但是有校验和,帧尾是可以有可以没有么?
3.帧尾就是校验和么?帧尾和校验和有一个就可以吗?
4.帧头跟帧尾都必须有吗还是帧头必须有帧尾不必须有?
作为小白,网上查着查着就乱了,求大神解释上面问题
...全文
5652 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
liweining71 2018-07-22
  • 打赏
  • 举报
回复
如果没有特殊要求,选一种现成的通讯协议比自己从头做简单
of123 2018-07-10
  • 打赏
  • 举报
回复 3
从信息论的角度,你只需问自己以下几个问题:

1 我怎么知道报文的开始(何时开始接收)?
可以有多种选择:
* “帧头”(引出新的问题:我怎么将帧头与报文中的实意字符区分开来?)
* 空闲(可以看作是一种特殊的字符,虽然不需要发送)

2 我怎么知道报文结束(接收多长)?
也可以有多种选择:
* “帧尾”(同帧头)
* 包头中有长度域
* 下一个空闲

3 我怎么知道接收的本文正确(完整性,即没有被干扰等意外篡改)
* 校验码(如 CRC)
* 附加的 MAC(message authentication code,报文认证码,主要用于防备人为篡改)
* 不必考虑(环境安全可靠)
我是Trustintruth 2018-07-07
  • 打赏
  • 举报
回复
这种协议如果是自己和自己通信的话只要收发匹配就可以了。很多时候校验位甚至可以没有,即使没有串口也可以读。 发送是可以第一位吧信号线拉低,然后后一位开始读数据。结尾可以按照位数来判断。
of123 2018-07-02
  • 打赏
  • 举报
回复
所谓串口通讯,是指通用串行接口通讯协议(UART),是一个物理层的协议。即便在这个物理层协议中,也有可选项,如是否有奇偶位,以及波特率。

你所说的,是顶层的数据链路层协议,也可以理解为应用协议的一部分。也就是解析数据包时遵从的规则。这个是完全可以自定义的,只要发送和接收方采用相同协议规则即可。

帧头:实际上就是包起始字符,表示一个数据包的开始。一般用于轮询方式接收时,便于识别报文的起始点,抛弃不完整的包。不是必需的。常见于发送方连续不断发送且不接收应答的场合。
帧尾,即包结束字符,表示报文的结束。常用于不定长报文。

以上起始和结束字符,有一个必要前提,即不会与报文中的实意数据混淆。例如,报文是可打印字符 ASCII 编码,起始和结束是非可打印的控制字符。或者,在报文中出现与起始字符相同的实意数据字符时,将其重写一次,即用两个相同的字符来表示一个字符。那么,在搜索起始字符时,如遇到重写,就跳过。

在报文的起始段插入长度域,也是通用的做法。此情况下,就可以没有结束字符了。因为接收端通过长度域已知应接收的实际长度。

校验码域,通常用于传输条件较差或有可能被篡改的通讯情况。用来检查所收到的报文包是否正确有效。

所有这些,都不是必不可少的,完全取决于你的传输需求。
Votangroom 2018-07-02
  • 打赏
  • 举报
回复
推荐你编个程序下到单片机里,然后连到串口助手上实际体会一下(这种情况一般不存在异常,因为距离比较短),其实这种玩意都是人规定出来,规避一些外界影响的,其实你如果短距离而且需要发送的数据只有1个的时候,完全不需要什么枕头枕尾,校验和,长度巴拉巴拉的。你就直接发送你要发送的数据,比如说我发个1灯亮,发个0灯灭,你就直接发1 或者0 ,绝对不存在外界影响
Votangroom 2018-07-02
  • 打赏
  • 举报
回复 2
1.枕头和枕尾看你什么情况。如果你是自己开始做一个东西,开始指定协议,枕头枕尾你可以随便定义,如果已经有上位机或者别的单片机什么的要和你通信且他们接收的枕头枕尾程序写好了,你就要和他们的要求写成一样。至于校验和由除了枕头枕尾的其他数据帧的和来决定。
2.枕尾可以没有,看你是应答式通信还是持续性通信了。如果是应答式(比如说上位机发来一个信号,注意是一个,然后单片机接收处理做出相应动作,然后回复上位机操作结果,这是应答式),可以没有枕尾,因为他只需要判断枕头即可接收程序。而持续式(其实就是上位机不间断地给单片机发送命令,单片机需要将信息分段接收)则需要你单片机分辨出一段完整的信息,此时则必须得检测枕头枕尾来检查这个帧的完整性(还是最简单的),而且这种方式丢帧严重,这样的话就更得有枕头枕尾了..
3.相信你看了上面的就知道了,枕尾和校验和不是同一个东西..校验和的功能就是检查你发送的这个帧是否受到外部影响而改变了其本身的值或者丢帧断帧等不正常现象。比如说有一段帧:枕头0x51 数据0x01 0x30 校验和 0x31 枕尾0xfb。校验和就等于除去枕头枕尾的两个数据加起来的值,即0x01+0x30=0x31。如果此时受到外部影响数据的值改变了,成了0x02 0x30,那在你单片机端接收到这一帧数据后就编程检查0x02+0x30是否等于他发过来的校验和,一加发现等于0x32不等于他发过来的0x31,那单片机就知道了,这是个异常帧,直接丢掉了,然后如果是应答式的话可以请求上位机再发一次帧数据,持续式的话直接等待检测下一帧就行了。所有说枕尾和校验和的功能都不一样,怎么能是同一个东西呢
4.看2,讲的很清楚了
figoxwm 2018-07-02
  • 打赏
  • 举报
回复
我的理解
1.帧头帧尾校验和是自己定的,这可以说是一个协议。
2.我看到有的协议有帧头没有帧尾但是有校验和,帧尾是可以有可以没有么?可以没有帧尾啊,这都是自己定的
3.帧尾就是校验和么?帧尾和校验和有一个就可以吗?帧尾不是校验和,只是告诉你,这是一个数据包结束的标志。
4.帧头跟帧尾都必须有吗还是帧头必须有帧尾不必须有?我现在用的是:帧头+数据长度+校验 当然每个人的应用不一样,格式也不一样
SupermanTm 2018-07-02
  • 打赏
  • 举报
回复
你的协议里帧头之后加个长度字节就不用帧尾啦,接收端自己数就行了,数完了还校验的。
其实也有协议是有帧尾无帧头的,同样的原理,接收端循环一直在收,接收到帧尾符时就立刻截取缓冲区里的多少个字节去解释

27,508

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧