在我们定义串口通讯协议的时候,肯定是首先要考虑通讯协议内容是以 ASCII码 还是 hex十六进制。

对于这两类的各有各的优点和缺点。

一、ASCII

优点:

1、简单直观。(比如在串口调试助手很容易看懂协议上传的数据)

2、数据起始标志位和结束标志位唯一,不与数据内容冲突。(比如起始位为SS,结束位为\r\n)

3、适用大小端MCU的协议通讯,8位单片机基本都是大端,32位及以上单片机和PC都是小端。(大小端MCU数据高低字节内存保存位置不同,只能通过转译成int数据才能处理)

缺点:

1、效率低。(把ASCII码转译成int类型进行协议处理)

2、发送数据也要转译。(把int转译成ASCII)

数据接收方式:

1、 单条协议接收;(常用)

2、队列接收数据。(最好)

模板:

数据与数据之间使用空格符分隔;协议的除了起始位和结束位以为都将转译成int类型,再进行进一步解析处理。

起始标志位:这个标志位自定义,SS;

指令:对应的控制的指令;为什么要把指令放在前,数据内容长度放后面的,其实这是有关系的,每个指令都有数据内容长度,一旦数据内容长度也代码定义的指令的数据内容长度代表协议错误。

数据内容个数(可选):数据内容int类型的个数;

数据内容:对应指令传递的数据;

CRC16(可选):计算的是转译后int类型的数据,指令和数据内容个数及数据内容这部分数据的CRC16;计算CRC16的时候一定要取消字节对齐。

结束标志位:一般用\r\n作为结束符。

二、hex十六进制 

优点:

1、高效。(接收到的数据无需转译,直接协议解析处理)

2、数据直接发送。

缺点:

1、数据不直观(比如在串口调试助手很难看懂协议上传的数据)

2、数据起始标志位和结束标志位不唯一,与数据内容冲突。(比如起始位为0xCC 0xDD,一旦数据内容出现0xCC 0xDD则可能会被认为是协议起始位,没有结束标志位)

3、不适用于大小端MCU的协议通讯,8位单片机基本都是大端,32位及以上单片机和PC都是小端。(大小端MCU数据高低字节内存保存位置不同,但是强行使用也可以注意数据高低字节颠倒)

数据接收方式:

1、单条协议接收;(使用这种方式的一定要把起始标志位和结束标志位或者数据长度定好,比如起始标志一定要多字节,起始标志字节越多和数据内容冲突的概率越低,结束标志位也一样)

2、个人只推荐队列(个人常用,稳定)。

队列模板:

起始标志位:起始标志位自定义,常用1个字节做起始标志位;两个字节及以上解析麻烦一点点,但是也有好处,冲突概率低很多。

指令:对应的控制的指令;

为什么指令要放在数据长度前面,不像其他人一样先把“数据长度”放在“指令”前面呢?

其实这是有好处的。

原因是每条“指令”在写代码都知道对应的“数据长度”,此时我们只需要判断通讯协议中的“指令”和“数据长度”是否一致,一致则继续接收,最后进行CRC16校验;否则释放当前起始标志,寻找下一个起始标志。

极端如果“数据长度”在前,万一出现0xFFFF这个数据长度,是否单片机要接收到数据长度为0xFFFF才进行校验,那要多少条数据,才能开始校验。

数据长度:数据内容的字节数;

CRC16:确保协议数据正确及完整,绝对不可省去。

为什么我个人只喜欢用队列呢?

原因是:hex十六进制通讯的时候不像ASCII码一样有起始标志有结束标志,可以知道一条数据开始和结束。

hex十六进制怎么知道一个条数据的完整呢?

第一步:现在队列找到起始标志位0xAA,队头不是0xAA的都出队。

第二步:找到队头后,等待获取指令和数据长度,若与代码固化的指令数据长度一致则从队列中获取数据长度的数据,进行CRC16校验。

若不一致则0xAA队头出队。

全篇完。

本人是一个嵌入式未入门小白,博客仅仅代表我个人主观见解,记录成长笔记。
笔记是以最简单的方式,只展示最核心的原理。
若有与 大神大大 见解有歧义,我绝对坚信 大神大大 见解是对的,我的是错的。
若无积分等无法下载源码,可加入QQ群657407920下载交流经验。感谢~!

STM32之如何定义串口通讯协议定义ASCII和hex相关推荐

  1. STM32的串口通讯协议

    目录 一.串口协议 1.1 串口通信协议简介 1.1-1 物理层 1.1-2 协议层 1.2 STM32的USART简介 二.USB/TTL转232串口方法 2.1 三种接口简介 2.2 转换方法 2 ...

  2. 计算机网口通讯协议,接口通讯协议定义.doc

    接口通讯协议定义 PAGE PAGE 37 接口通讯协议定义 篇一:通讯接口概念 通信接口协议综述 (收集多处资料集合原创,综合232.422.485.USB及网络通讯等) 在现场数据采集和数据传输中 ...

  3. 串口(USART)通信-串口通讯协议简介

    串口(USART)通信-串口通讯协议简介 物理层:规定通讯系统中具有机械.电子功能部分的特性,确保原始数据在物理媒体的传输.其实就是硬件部分. 协议层:协议层主要规定通讯逻辑,统一收发双方的数据打包. ...

  4. UART串口通讯协议解析

    UART串口通讯协议解析 概述 接口 通信协议 波特率 示例 最后 概述 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART ...

  5. 三菱FX系列PLC串口通讯协议整理

    三菱FX系列PLC串口通讯协议整理 记录原因 项目要求 工具与资料 通讯格式 读寄存器 写寄存器 PLC回复数据 最后附几张上位机截图 记录原因 因项目需求,要写上位机与PLC进行通讯,查了诸多资料与 ...

  6. Python的Serial串口通讯协议

    Python的Serial串口通讯协议 一.概述 pyserial模块封装了对串口的访问. 二.特性 在支持的平台上有统一的接口. 通过python属性访问串口设置. 支持不同的字节大小.停止位.校验 ...

  7. php打开rs232,PHP在RS232串口通讯协议的应用演示[测试环境WinXP/PHP5.1.4]

    二.测试环境的构建: 1. 参考上面的<(一)串行通讯电缆的制作>,首先把两台电脑通过串口连结起来. 当然,你也完全可以这么操作一台电脑上面的两个串口,而不需要两台电脑:如果你有两个串口的 ...

  8. 计算机接口9pin,RS232是PC上串口通讯的定义及连线

    RS232是PC上串口通讯的标准配置.如右图所示.通常是9Pin接口,有些设备还使用25Pin的公头接口.(注意:PC上还有一个25Pin的打印机接口,但其为母头接口,请仔细区分) RS232由于其简 ...

  9. STM32 IO口模拟串口通讯

    转自:http://ziye334.blog.163.com/blog/static/224306191201452833850647 前阵子,调项目时需要用到低波特率串口通讯(300的波特率),才发 ...

最新文章

  1. 正则表达式匹配多个字符(*、+、?、{m}、{m,n})
  2. 新华网泸州分频道报道IT诗人
  3. js 调用C#.NET后台方法 转载自:http://www.cnblogs.com/lizhao/archive/2010/11/23/1990436.html...
  4. red hat linux 7.1 使用手册!,Red Hat Linux 7.1使用手册(中)
  5. c mysql 设置字符集_C语言如何查看和修改MySQL使用的字符集
  6. Bad Request (Invalid Hostname)解决方法
  7. 开源开放 | 细粒度可循证医学文档知识融合表示和推理(CCKS2021)
  8. [设计模式-行为型]责任链模式(Chain of Responsibility)
  9. promiseKit 解析 iOS
  10. python 移动平均线_如何使用NumPy计算移动平均线?
  11. 如何将OFD文件转成Word?教你2种实用方法
  12. PySide从实战开始学习系列(一)认识PySide
  13. 计算机网络文化基础心得体会,提高计算机文化基础教学效果的几点心得
  14. 对d3d9里面的函数挂钩实现透视
  15. linux运维基础-rpm包校验-rpm包安全修复-rpm覆盖
  16. java好看的图形界面_java写出图形界面
  17. 暗棋单机版_中国象棋暗棋下载_中国象棋暗棋安卓版下载 v1.6.8 安卓单机版_飞飞巴士下载...
  18. 第一章 Vue基础入门
  19. 【解析】TensorBoard 可视化
  20. 初级硬件工程师必会的模拟电路之一:功率放大电路

热门文章

  1. 关于抖音文案的重要性以及如何分享好的抖音文案,详情已附上
  2. 微信小程序展览界面设计
  3. “百合杯“表彰典礼即将于电影频道播出
  4. 可以装在口袋的洗牙器,无论走到哪里都可以进行专业洗牙~丨钛空舱
  5. 机器学习中SVM+HOG实现对饮料瓶的识别
  6. 喜迎Java诞生24周年,写了几幅字,以示纪念
  7. 如何创建python虚拟环境
  8. java 接受输入不换行_java回车不换行
  9. linux定时任务 定时重启docker容器
  10. 云计算知识普及:云计算的历史、发展与未来