单片机中常用的串口通信协议帧

  • 前言
  • 一、单片机串口简介
  • 二、常用的通信协议类型
    • 1.没有格式
    • 2.帧头帧尾+数据
    • 3.帧头帧尾+数据+附加功能码
    • 4.帧头帧尾+数据+附加功能码+目标地址
    • 5.帧头帧尾+数据+附加功能码+转发功能
    • 6.MODBUS RTU
    • 7.其它
  • 总结
  • 参考文献

前言

最近串口用的多,感觉有必要简单列一下用过的通信协议帧,这样可以总结下来和大家交流一下,有需要的可以直接参考

一、单片机串口简介

单片机中的串口(UART)是一种单字节收发的通信方式一般三根线就够了,标准线序对接的话是九针DB9类型,常用的对三线(rx tx gnd | A B gnd)使用简单方便,常用于短距离,较少连接器件的通信。
串口增加外部控制芯片会将串口变为RS232和RS485两种通信类型的电平,RS232的逻辑1和0分为对应+15V和-15V,RS485的逻辑1和0对应A B端口的电压差+2 ~ +6和-2 ~ -6。RS232不可以连接多个子设备,可实现全双工通信,RS485可实现多个器件的挂载,单双工通信。
因为是单字节收发,所以就需要一个规定好的通信格式来实现解析与发送,这个就是通信协议。

二、常用的通信协议类型

1.没有格式

没有格式有时候就是王道,许多器件厂商直接使用字符串命令式控制。比如

/s1000

设置速度为1000

/r0000

回复出厂设置。
这种有个好处就是在一些资源及性能一般的器件中可直接使用,不用队列,不用缓存,直接在中断中进行数据的读取与赋值,简单粗暴。switch case轻松解决。适用于简单短命令短数据场合。
缺点就是通信数据不能太长,容易出现误操作(谁手残乱发送数据碰巧改了核心数据就完犊子了)。

2.帧头帧尾+数据

帧头 数据长度 数据 校验位 帧尾
0XF5 0X4 0X01 0X02 0X03 0X04 0XC5 0X5F

简单常用的就是这种带帧头帧尾或者校验位的格式。通常在单片机中进行数据的接收然后存放到缓存队列中,然后主循环中根据帧头帧尾对缓存队列数据进行提取,一帧一帧的进行赋值操作。
校验的有很多,和校验、CRC等等,这里我觉得还可以实现加密,自己设置一个加密算法,校验位就用加密算法得出,别人拿不到加密算法只有通信协议也是不能驱动你的器件的。(骚操作,好多连校验位都没有,越简单越可靠)
此种有点是简单可靠,上下位机容易根据通信格式进行数据的交互,适合较长数据的传输。

3.帧头帧尾+数据+附加功能码

帧头 功能码 数据长度 数据 校验位 帧尾
0XF5 0X01 0X4 0X01 0X02 0X03 0X04 0XC5 0X5F

这种格式兼容第二种,可以处理不同类型的命令,比如读和写。
功能码可以无限添加,比如使用两个功能码一个指示对哪个变量操作,另一个指示读还是写操作。这种应该是最广泛使用的了吧,工作量也不是很大,自己调试调试也很容易实现。

4.帧头帧尾+数据+附加功能码+目标地址

帧头 地址 功能码 数据长度 数据 校验位 帧尾
0XF5 0XCC 0X01 0X4 0X01 0X02 0X03 0X04 0XC5 0X5F

这种加地址的就有意思了,具备了识别器件的能力。比如你随便拿了一个同类型不同地址的器件接入,你发送命令器件就不鸟你。这种适合用在485通信总线上,所有器件根据地址去识别是否去执行。
优点是具备器件识别功能有命令执行唯一性,适合485通信。
缺点是232使用的话有点鸡肋。目前我见过的大多是这种不管是485还是232通信(其实地址也算是一个功能码,问题不大)。

5.帧头帧尾+数据+附加功能码+转发功能

帧头 源长度 源地址 目标长度 目标地址 功能码 数据长度 数据 校验位 帧尾
0XF5 0X01 0XCC 0X02 0XDD 0XBB 0X01 0X4 0X01 0X02 0X03 0X04 0XC5 0X5F

这个是我使用过的最厉害的串口通信协议了,通过地址长度及地址域实现判别是否是需要转发下一级还是进行操作命令。
此条命令过程为:0XCC的器件发送命令帧给0XDD的器件,0XDD的器件发现自己不是最终目标,重新组帧发送给地址为0XBB的下一级器件,0XBB接收到命令后发现自己是最终目标因此执行命令。
这种的通信协议优点是功能俱全,可实现转发。
缺点就是解析帧的程序复杂,增加一个转发就会加一个重新组帧的时间,转发越多越费时间。(不过谁没事用串口串这么多子级呢,有病么,完全可以考虑使用其它通信方式了)
这种应该是将串口适配了其它通信方式(比如can、tcp/ip等),这样程序处理得当的话应该可以实现不同通信方式的混搭,比如主板通过串口发送,下一级通过CAN总线发送给更多的器件,也许CAN总线发送完了子器件又有子器件用串口发送接收,总之来说具备了转发就具备了一定的通信兼容性。
有点复杂串口还是用第4种方式就够了。

6.MODBUS RTU

这个很牛批,我没咋用过,简单说一下。这个单片机得用485通信了,牛就牛在是一种正规的统一标准,有现成的集成模块买过来就能用的那种,电气类工业控制中常用如PLC。
Modbus-RTU模式是指当控制器设为在Modbus网络上以RTU(远程终端模式)模式通信,在消息中的每个8Bit包含两个4Bit的十六进制字符。Markdown将文本转换为 HTML1
操作方式的话和4的差不多(但人家就是做成了认可的标准就是牛),多涉及一些寄存器的操作,寄存器一般都是按位操作,每一位都有每一位的功能,一下就扩展了很多用处。

7.其它

其它就是其它,可以混为一谈的一些方式,这些多半是上述几种的混搭型。有的有帧头,没有帧尾,有的有帧尾但用地址做帧头,有的不加校验,有的用固定长度实现帧尾的功能,有的奇葩还用地址做帧头,校验做帧尾还不固定长度。

总结

差不多了,一个串口基本的通信协议帧也就这些了,后续想到了再添加。不要一味的追求功能多,简单实用才是最可靠的。能不加通信协议就不加,最好。
突然间想到了一个点子,单片机程序是不是也可将上述协议帧中的每一个功能位模块化,做到一种完全的兼容,比如我用到了帧头我就调用一个添加程序添加帧头,用到了功能码就专门添加一个功能码位放功能码,外部再做一个大封装,这样会很容易一个通信模板兼容所有通信协议。(也许也没必要,大多数都很简单,提取的数据也不多,何况我的C++还一塌糊涂,等我有实力了在考虑吧,不慌)

参考文献


  1. Modbus通讯协议(二)—RTU. ↩︎

单片机中常用的串口通信协议帧相关推荐

  1. c语言单片机串口通讯,单片机C语言之串口通信协议

    串口通信概述 串口通信指串口按位(bit)发送和接收字节.尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据. 常用三种串口通信协议 1.RS-232 RS ...

  2. 51单片机如何跳出wile循环_单片机C语言之串口通信协议(代码分享)

    原标题:单片机C语言之串口通信协议(代码分享) 现实生活中, 我们总是要与人打交道,互通有无.单片机也一样,需要跟各种设备交互.例如汽车的显示仪表需要知道汽车的转速及电动机的运行参数,那么显示仪表就需 ...

  3. 通信协议基础以及常用的串口通信协议

    通信协议: 串行通信和并行通信 在数据的通信方式中根据数据传输方式的不同可以分为:串行通信和并行通信 串行通信:串行通信是指使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度. ...

  4. 单片机c语言串口通信协议实现,单片机C语言之串口通信协议

    串口通信概述 串口通信指串口按位(bit)发送和接收字节.尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据. 常用三种串口通信协议 1.RS-232 RS ...

  5. stm32串口接收不定长数据_基于STM32之UART串口通信协议--接收

    一.前言 1.简介 回顾上一篇UART发送当中,已经讲解了如何实现UART的发送操作了,接下来这一篇将会继续讲解如何实现UART的接收操作. 2.UART简介 嵌入式开发中,UART串口通信协议是我们 ...

  6. python中0x3f_单片机中0x3f代表什么意思

    展开全部 单片机中0x3f代表16进制数62616964757a686964616fe78988e69d83313334313566623F,即0011 1111B或63D(B代表二进制,D代表十进制 ...

  7. 51单片机下载完程序后不亮_程序如何下载到单片机中?单片机常用的四种烧写程序方式介绍...

    单片机是一种可编程控制器,搭好硬件电路后,可以利用程序实现很多非常复杂的逻辑功能,与纯硬件电路相比,简化了硬件外围的设计.方便了逻辑的设计.丰富了逻辑的输出.不同厂家的单片机需要不同编程IDE来实现编 ...

  8. STM8学习笔记---串口通信中如何自己定义通信协议

    在单片机刚开始学习的时候,串口通信是经常要用到的,但是实际产品中串口通信是需要通信协议的.好多人不明白为什么要用通信协议,如何定义通信协议,带通信协议的程序要怎么写.今天就来说一下如何串口通信协议是如 ...

  9. 51单片机学习篇-- --基于51单片机的串口通信协议

    开篇先说一句废话···· 本旺名字叫萨摩耶,,Please 叫我旺财,,,哈哈,招财进宝嘛! 开篇 计算机按照下行数据通信协议,串口发送数据,地址为自己的学号(十六进制),单片机收到后(收到的是数据, ...

最新文章

  1. JAVA 线上故障排查套路,从 CPU、磁盘、内存、网络到GC 一条龙!
  2. 直播系统搭建关键步骤与要点!
  3. GloVe:Global Vectors for Word Representation
  4. opencv精要(3)-win下codelite的opencv配置
  5. spark 连接mysql 命令_spark-submit命令包括mysql连接器
  6. c语言中二维数组中产生随机数,C语言中是如何进行随机数生成的[多图]
  7. [HAOI2015]树上染色
  8. 基于route-map的策略路由
  9. 论Postgres的“已提交的而且 xmin’比当前事务的XID小的记录对当前事务才是可见的”...
  10. python后台——asyncio,多进程+asyncio
  11. ${pageContext.request.contextPath}和request.context
  12. 程矢Axure夜话:Axure手机原型视频教程之图形解锁
  13. 10负3次方计算机语言,10的负3次方等于多少?
  14. python符号怎么打_「符号怎么打出来」```这个符号怎么打出来 - seo实验室
  15. 【C++常用函数】isalpha、isalnum、isdigit、islower、isupper用法
  16. Java-事务的传播特性和隔离级别
  17. matlab的特殊字符(上下标和希腊字母等)
  18. snmpwalk与snmpget的区别
  19. mastercam2020后处理_[后处理]Mastercam 四轴Fanuc系统MP9G后处理
  20. 软件著作权申请流程及注意事项,你知道多少?

热门文章

  1. 知识图谱问答的测评指标
  2. 万变不离其宗之ZYNQ串口介绍
  3. 正则表达式:密码必须为8~16位非空字符,并包含大小写字母、数字、特殊字符
  4. 不规则形状或图片添加阴影效果
  5. 【Python爬虫】(一)requests:verify关健字参数
  6. OpenHarmony啃论文俱乐部方法总结分析
  7. matlab如何表示抗混叠滤波,Matlab在多采样率信号处理教学中的应用
  8. webkit之webpage
  9. 办北京居住证,定制社保缴费记录,个人权益记录最近6个月的查询与打印,社保,北京市社会保险,北京市社会保险网上服务平台,北京市社会保险网上申报查询系统
  10. 微信小程序--------商品物流跟踪模板