单片机学习小组
登录
直播中
斯克迪亚
12年用户
415经验值
私信
关注
ASCII和hex十六进制的优缺点是什么?
开启该帖子的消息推送
ASCII
ASCII具有哪些优缺点?
hex十六进制的优缺点是什么?
回帖
(1)
邢待湘
2022-2-18 09:50:15
在我们定义串口通讯协议的时候,肯定是首先要考虑通讯协议内容是以 ASCII码 还是 hex十六进制。
对于这两类的各有各的优点和缺点。
一、ASCII
优点:
1、简单直观。(比如在串口调试助手很容易看懂协议上传的数据)
2、数据起始标志位和结束标志位唯一,不与数据内容冲突。(比如起始位为SS,结束位为rn)
3、适用大小端MCU的协议通讯,8位单片机基本都是大端,32位及以上单片机和PC都是小端。(大小端MCU数据高低字节内存保存位置不同,只能通过转译成int数据才能处理)
缺点:
1、效率低。(把ASCII码转译成int类型进行协议处理)
2、发送数据也要转译。(把int转译成ASCII)
数据接收方式:
1、 单条协议接收;(常用)
2、队列接收数据。(最好)
模板:
数据与数据之间使用空格符分隔;协议的除了起始位和结束位以为都将转译成int类型,再进行进一步解析处理。
起始标志位:
这个标志位自定义,SS;
指令:
对应的控制的指令;为什么要把指令放在前,数据内容长度放后面的,其实这是有关系的,每个指令都有数据内容长度,一旦数据内容长度也代码定义的指令的数据内容长度代表协议错误。
数据内容个数(可选):
数据内容int类型的个数;
数据内容:对应指令传递的数据;
CRC16(可选):
计算的是转译后int类型的数据,指令和数据内容个数及数据内容这部分数据的CRC16;计算CRC16的时候一定要取消字节对齐。
结束标志位:
一般用rn作为结束符。
二、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队头出队。
在我们定义串口通讯协议的时候,肯定是首先要考虑通讯协议内容是以 ASCII码 还是 hex十六进制。
对于这两类的各有各的优点和缺点。
一、ASCII
优点:
1、简单直观。(比如在串口调试助手很容易看懂协议上传的数据)
2、数据起始标志位和结束标志位唯一,不与数据内容冲突。(比如起始位为SS,结束位为rn)
3、适用大小端MCU的协议通讯,8位单片机基本都是大端,32位及以上单片机和PC都是小端。(大小端MCU数据高低字节内存保存位置不同,只能通过转译成int数据才能处理)
缺点:
1、效率低。(把ASCII码转译成int类型进行协议处理)
2、发送数据也要转译。(把int转译成ASCII)
数据接收方式:
1、 单条协议接收;(常用)
2、队列接收数据。(最好)
模板:
数据与数据之间使用空格符分隔;协议的除了起始位和结束位以为都将转译成int类型,再进行进一步解析处理。
起始标志位:
这个标志位自定义,SS;
指令:
对应的控制的指令;为什么要把指令放在前,数据内容长度放后面的,其实这是有关系的,每个指令都有数据内容长度,一旦数据内容长度也代码定义的指令的数据内容长度代表协议错误。
数据内容个数(可选):
数据内容int类型的个数;
数据内容:对应指令传递的数据;
CRC16(可选):
计算的是转译后int类型的数据,指令和数据内容个数及数据内容这部分数据的CRC16;计算CRC16的时候一定要取消字节对齐。
结束标志位:
一般用rn作为结束符。
二、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队头出队。
举报
更多回帖
rotate(-90deg);
回复
相关问答
ASCII
hex
十六进制
是怎么知道一个条数据的完整呢
2021-12-02
842
字符串十
进制
转
十六进制
2014-05-26
5073
请问
十六进制
怎么转换成
ascii
码函数?
2020-03-10
3091
怎么以
十六进制
格式发送UART
2018-10-26
3164
怎么将
十六进制
发送到uart
2019-08-30
1755
请问lora定向传输模式数据只能是
十六进制
吗?
2019-01-25
3298
如何使用labview向串口发送像0xff这样无对应
ASCII
码字符的二位
十六进制
数?
2019-04-28
3490
请问如何将普通的英特尔
十六进制
写入闪存?
2022-12-09
297
如何将SPI Master转换为
十六进制
数?
2019-09-30
2386
新手求问,labview的
进制
转换问题
2018-03-23
4546
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
英国威廉希尔公司网站
william hill官网 版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分