OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2658|回复: 6

usart串口怎样发送十六进制数给下位机

[复制链接]

4

主题

10

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-7-19
在线时间
13 小时
发表于 2018-7-20 16:26:06 | 显示全部楼层 |阅读模式
3金钱
将一个十六进制的指令发送给下位机,比如 A5 5A 06 83 01 11 01 21 31 用
for(t=0;t<8;t++)

{
USART_SendData(USART1,Head_mv[t]);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
}
这个程序发送,但串口助手收到如图1

好像是将这段十六进制数当做十进制数和字符来看待,串口发送的时候将它当做字符和数字翻译成十六进制数发送的,所以接收的数比发送的长很多。
但是如果用十六进制发送十六进制显示会出现如图2

问如果向下位机发送十六进制数,串口这块的程序应该怎样来写?
谢谢各位大佬


QQ图片20180720162304.png
QQ图片20180720161731.png

最佳答案

查看完整内容[请看2#楼]

一、就你上传的第一幅图没有问题,因为是勾选了发送新行以及16进制发送,所以最后加了ODOA; 二、串口发送的都是ASCII码,是由01010组成的,并没有十六进制和十进制区分,只是显示的时候转换得到而已。例如对于数字0,对应的ASCII码是00110000,那么串口发送00110000,你勾不勾选16进制发送,最后串口发送的都是00110000,这是我的理解,只是16进制显示的话表示0x30; 三、对于第二幅图,你没有勾选16进制发送,那么每个字符之间 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

87

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1435
金钱
1435
注册时间
2015-5-19
在线时间
132 小时
发表于 2018-7-20 16:26:07 | 显示全部楼层
本帖最后由 胖子阳 于 2018-7-20 17:40 编辑

一、就你上传的第一幅图没有问题,因为是勾选了发送新行以及16进制发送,所以最后加了ODOA;
二、串口发送的都是ASCII码,是由01010组成的,并没有十六进制和十进制区分,只是显示的时候转换得到而已。例如对于数字0,对应的ASCII码是00110000,那么串口发送00110000,你勾不勾选16进制发送,最后串口发送的都是00110000,这是我的理解,只是16进制显示的话表示0x30;
三、对于第二幅图,你没有勾选16进制发送,那么每个字符之间的空格也是需要发送的(A5 5A)之间的空格也是一个字符,他对应的ASCII码是00100000,也就是16进制0x20,共有8个空格,所以接收到的数据里面有8个0x20;然后空格前面的每一个字符A5,此时就表示了两个数据,你所对应的41 35;
不知是否解释清楚。

回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
发表于 2018-7-20 17:19:14 | 显示全部楼层
没毛病啊,你勾选了发送新行发送的数据后面就会加0D 0A,即\r\n换行
回复

使用道具 举报

4

主题

10

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-7-19
在线时间
13 小时
 楼主| 发表于 2018-7-20 17:50:45 | 显示全部楼层
胖子阳 发表于 2018-7-20 17:27
一、就你上传的第一幅图没有问题,因为是勾选了发送新行以及16进制发送,所以最后加了ODOA;
二、串口发送 ...

嗯嗯,懂了,谢谢大佬
回复

使用道具 举报

4

主题

10

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-7-19
在线时间
13 小时
 楼主| 发表于 2018-7-20 17:51:00 | 显示全部楼层
qiuzhicheng 发表于 2018-7-20 17:19
没毛病啊,你勾选了发送新行发送的数据后面就会加0D 0A,即\r\n换行

嗯嗯,懂了
回复

使用道具 举报

4

主题

10

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-7-19
在线时间
13 小时
 楼主| 发表于 2018-7-20 17:56:52 | 显示全部楼层
胖子阳 发表于 2018-7-20 17:27
一、就你上传的第一幅图没有问题,因为是勾选了发送新行以及16进制发送,所以最后加了ODOA;
二、串口发送 ...

还有个问题,就是为什么勾选了16进制发送,就会是按字符发送的(空格也包括)?
也就是说我对于串口助手它的发送原理还不是很清楚,麻烦您能给我解答一下么?
回复

使用道具 举报

9

主题

87

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1435
金钱
1435
注册时间
2015-5-19
在线时间
132 小时
发表于 2018-7-21 09:21:09 | 显示全部楼层
本帖最后由 胖子阳 于 2018-7-21 09:36 编辑
碌碌 发表于 2018-7-20 17:56
还有个问题,就是为什么勾选了16进制发送,就会是按字符发送的(空格也包括)?
也就是说我对于串口助手 ...

这个应该是这个串口助手设计的原因,勾选16进制发送后,每个16进制数之间必须有空格,不然发送不出去,报错,你可以试一试,然后发送的时候自动把空格去掉了,所以你单片机接收到的数据里面没有空格,再打印出来就那些数据,没有空格!当不勾选时候,串口助手把空格也当成要发送的东西,发送出去,单片机接收到后打印出来,就包含空格了,这只是我的理解,不知道对不对!验证很简单,串口助手发送,你看单片机接收的数据包含空格没,就可以验证了。把ASCII码表上传上来,你可以对应解释图2了,'A'对应0x41,‘5’对应0x35,就可以解释了。
勾选16进制后,每两位代表一个数据(或者讲字符),不勾选的话每一位代表一个数据(或者讲字符)。


ASCII码表

ASCII码表
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-17 11:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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