OpenEdv-开源电子网

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

串口数据发送的问题

[复制链接]

6

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2016-3-30
在线时间
28 小时
发表于 2016-7-7 11:05:50 | 显示全部楼层 |阅读模式
1金钱
有一个问题   关于串口通信的;
1,stm32AD得到的数是十进制,为什么在串口助手上得到的是十六进制,而且是两位?除了用printf,其他方法怎么实现接收到的是十进制?

2 串口通信的两个单片机为什么接收到的是字符形式,我想直接利用接收到的数字,这个怎么实现?

最佳答案

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

多谢您百忙之中帮我解答问题,我现在已经解决了,终究是串口助手把我弄晕了,在串口助手里我看到的是十六进制数,我还以为程序里串口发的是十六进制呢。其实我在串口发的是数字,另一边接收到的也是数字,是这个意思吧,
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2016-3-30
在线时间
28 小时
 楼主| 发表于 2016-7-7 11:05:51 | 显示全部楼层
憨厚诚实大叔 发表于 2016-7-7 14:44
printf("0xFF");
送的是4个字节,也就是4个u8的数据,而不是1个。

多谢您百忙之中帮我解答问题,我现在已经解决了,终究是串口助手把我弄晕了,在串口助手里我看到的是十六进制数,我还以为程序里串口发的是十六进制呢。其实我在串口发的是数字,另一边接收到的也是数字,是这个意思吧,
回复

使用道具 举报

58

主题

6293

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11476
金钱
11476
注册时间
2014-4-1
在线时间
1297 小时
发表于 2016-7-7 11:12:53 | 显示全部楼层

连十进制也不是。。。。是二进制。

机器只认二进制,其他事都是人在做,和机器无关。



回复

使用道具 举报

6

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2016-3-30
在线时间
28 小时
 楼主| 发表于 2016-7-7 12:39:02 | 显示全部楼层
本帖最后由 spark_zhang 于 2016-7-7 12:46 编辑
xuande 发表于 2016-7-7 11:12
连十进制也不是。。。。是二进制。

机器只认二进制,其他事都是人在做,和机器无关。

我用USART_SendData发数据,但是串口助手上显示的是16进制,这是为什么?怎么让他接收到数字,而不是字符
回复

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
683
金钱
683
注册时间
2016-1-27
在线时间
184 小时
发表于 2016-7-7 12:46:30 | 显示全部楼层
你勾选了十六进制显示吧
回复

使用道具 举报

6

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2016-3-30
在线时间
28 小时
 楼主| 发表于 2016-7-7 12:52:03 | 显示全部楼层
不吃鱼的老鼠 发表于 2016-7-7 12:46
你勾选了十六进制显示吧

不勾选的话串口助手上显示不正常,出现的是小方框或乱码形式
回复

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
683
金钱
683
注册时间
2016-1-27
在线时间
184 小时
发表于 2016-7-7 12:59:28 | 显示全部楼层
spark_zhang 发表于 2016-7-7 12:52
不勾选的话串口助手上显示不正常,出现的是小方框或乱码形式

打印数据类型搞错了吧,怎么用的printf?
回复

使用道具 举报

6

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2016-3-30
在线时间
28 小时
 楼主| 发表于 2016-7-7 13:01:27 | 显示全部楼层
不吃鱼的老鼠 发表于 2016-7-7 12:59
打印数据类型搞错了吧,怎么用的printf?

USART_SendData(USART1, result[t]);
用的这个,不是printf
回复

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
683
金钱
683
注册时间
2016-1-27
在线时间
184 小时
发表于 2016-7-7 13:11:01 | 显示全部楼层
spark_zhang 发表于 2016-7-7 13:01
USART_SendData(USART1, result[t]);
用的这个,不是printf

result[t]是什么数据类型的?
你的波特率设置对了吗?
回复

使用道具 举报

6

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2016-3-30
在线时间
28 小时
 楼主| 发表于 2016-7-7 13:43:06 | 显示全部楼层
不吃鱼的老鼠 发表于 2016-7-7 13:11
result[t]是什么数据类型的?
你的波特率设置对了吗?

波特率9600,是对的。数据类型就是unsigned int,AD采的数据
回复

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
683
金钱
683
注册时间
2016-1-27
在线时间
184 小时
发表于 2016-7-7 13:48:39 | 显示全部楼层
spark_zhang 发表于 2016-7-7 13:43
波特率9600,是对的。数据类型就是unsigned int,AD采的数据

好好看看手册吧,USART_SendData是发什么数据类型的
回复

使用道具 举报

6

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2016-3-30
在线时间
28 小时
 楼主| 发表于 2016-7-7 14:10:18 | 显示全部楼层
不吃鱼的老鼠 发表于 2016-7-7 13:48
好好看看手册吧,USART_SendData是发什么数据类型的

我想知道怎么发送数字?
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-7-7 14:22:53 | 显示全部楼层
本帖最后由 憨厚诚实大叔 于 2016-7-7 14:29 编辑

串口发送的是8位的二进制数据,是八位是二进制数据,只发送这一种。你如果说出10进制也是,范围0-255的十进制。
你调试的显示什么的,看你自己的勾选,把这个八位的二进制数据怎么显示,是直接显示,还是转换成字符显示,都是你的事情。
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-7-7 14:28:41 | 显示全部楼层
另外,十进制和二进制,用那种进制是你的事情。比如0x0F和你十进制的15不是同一个数么???你让他是10进制就是15,让他是16进制就是0x0F,你设置那种进制是你自己的事情,他们都是同一个数。
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-7-7 14:44:51 | 显示全部楼层
printf("0xFF");
送的是4个字节,也就是4个u8的数据,而不是1个。
回复

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
683
金钱
683
注册时间
2016-1-27
在线时间
184 小时
发表于 2016-7-7 14:49:42 | 显示全部楼层
spark_zhang 发表于 2016-7-7 14:10
我想知道怎么发送数字?

参考楼上吧
想发数字1,USART_SendData(USART1,1的ASCII码)
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-7-7 15:00:09 | 显示全部楼层
不吃鱼的老鼠 发表于 2016-7-7 14:49
参考楼上吧
想发数字1,USART_SendData(USART1,1的ASCII码)

他们总是用printf函数,连这个函数发送的是字符串而不是直接的数字都不清楚
回复

使用道具 举报

6

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2016-3-30
在线时间
28 小时
 楼主| 发表于 2016-7-7 16:12:41 | 显示全部楼层
憨厚诚实大叔 发表于 2016-7-7 15:00
他们总是用printf函数,连这个函数发送的是字符串而不是直接的数字都不清楚

看这前俩图是串口助手看到的结果,第三个图是程序,波特率选的都是9600

选择16进制显示

选择16进制显示

什么也不选

什么也不选

程序

程序
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-7-7 16:15:10 | 显示全部楼层
我现在都不清楚,你要问的什么,是发的数据和接到是不一样,还是别的
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-7-7 16:15:14 | 显示全部楼层
我现在都不清楚,你要问的什么,是发的数据和接到是不一样,还是别的
回复

使用道具 举报

2

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
392
金钱
392
注册时间
2016-5-26
在线时间
35 小时
发表于 2016-7-7 16:25:50 | 显示全部楼层
憨厚诚实大叔 发表于 2016-7-7 16:15
我现在都不清楚,你要问的什么,是发的数据和接到是不一样,还是别的

我明白楼主想干什么,因为我之前也小白的这么干过,他想借用USART-SendData去打印某个变量,这个变量可能是数字,我之前想用它来打印计数器的结果来着,后来仔细看了手册才发现不可以,我估计楼主应该差不多的情况。
回复

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
683
金钱
683
注册时间
2016-1-27
在线时间
184 小时
发表于 2016-7-7 16:36:25 | 显示全部楼层
spark_zhang 发表于 2016-7-7 16:12
看这前俩图是串口助手看到的结果,第三个图是程序,波特率选的都是9600

1、之前提醒你了,USART_SendData发的是u8类型的数据,你的result[t]你说是unsigned int数据类型的
2、你想用USART_SendData发送数字,比如发十进制1,显示1,是要发数字1的ASCII码(0x31),我之前也讲到了
3、如果要发送的数是多位的,如十进制123,要拆成0x31(1的ASCII码)、0x32(2的ASCII码)、0x33(3的ASCII码),用USART_SendData来依次发送
回复

使用道具 举报

6

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2016-3-30
在线时间
28 小时
 楼主| 发表于 2016-7-7 16:36:29 | 显示全部楼层
星丶落 发表于 2016-7-7 16:25
我明白楼主想干什么,因为我之前也小白的这么干过,他想借用USART-SendData去打印某个变量,这个变量可能 ...

差不多这个意思,我用串口助手就是想看我收到的数据是什么。我做的是两个单片机的通信,一个把处理好的数据(三个数)发送出去,另一个将收到的三个数直接给三路PWM控制RGB。现在我的问题是我收到的是字符形式,不能直接给PWM
回复

使用道具 举报

2

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
392
金钱
392
注册时间
2016-5-26
在线时间
35 小时
发表于 2016-7-7 16:38:51 | 显示全部楼层
spark_zhang 发表于 2016-7-7 16:36
差不多这个意思,我用串口助手就是想看我收到的数据是什么。我做的是两个单片机的通信,一个把处理好的数 ...

你可以把你想发送的数字转换成对应的ASCII码值发送试试
回复

使用道具 举报

6

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2016-3-30
在线时间
28 小时
 楼主| 发表于 2016-7-7 16:42:31 | 显示全部楼层
不吃鱼的老鼠 发表于 2016-7-7 16:36
1、之前提醒你了,USART_SendData发的是u8类型的数据,你的result[t]你说是unsigned int数据类型的
2、 ...

那我另一个单片机接收到的是什么形式的?ASCII的还是数字?
回复

使用道具 举报

13

主题

186

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
441
金钱
441
注册时间
2016-6-30
在线时间
97 小时
发表于 2016-7-7 16:46:37 | 显示全部楼层
还是不理解楼主想说明什么。是说串口显示当前的PWM值吗?
回复

使用道具 举报

13

主题

186

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
441
金钱
441
注册时间
2016-6-30
在线时间
97 小时
发表于 2016-7-7 16:56:19 | 显示全部楼层
想不要用printf 可以在10进制数的每个位+48就可以了  比如 1+48  也就是ASCII 的 0x31
回复

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
683
金钱
683
注册时间
2016-1-27
在线时间
184 小时
发表于 2016-7-7 16:58:07 | 显示全部楼层
spark_zhang 发表于 2016-7-7 16:42
那我另一个单片机接收到的是什么形式的?ASCII的还是数字?

你还是没明白我的意思,USART_SendData这个函数的原型是void USART_SendData(USART_TypeDef* USARTx, u8 Data),它发送的是8位的数据,比如你想发1,你可以写成USART_SendData(USART1,1);或者USART_SendData(USART1,0x01);单片机只能懂0和1,所以你的1或者0x01在它眼里都是0000 0001这8位数据,然后它一位一位的发出去
按照你说的你的result[t]是unsigned int类型的,是32位的数据,最大值是2^32-1,你给它传递的参数就错了
接收端收到的什么数据,取决于你发的什么数据,你发个1,收到的就是0x01,数据类型是unsigned char类型的8位数据,二进制表示为0000 0001,十进制表示为1,十六进制表示为0x01,表示方法不一样而已
回复

使用道具 举报

6

主题

94

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1581
金钱
1581
注册时间
2016-7-2
在线时间
277 小时
发表于 2016-7-7 17:00:34 | 显示全部楼层
给我整懵了
回复

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
683
金钱
683
注册时间
2016-1-27
在线时间
184 小时
发表于 2016-7-7 17:05:32 | 显示全部楼层
spark_zhang 发表于 2016-7-7 16:42
那我另一个单片机接收到的是什么形式的?ASCII的还是数字?

你的32位的数据想通过USART_SendData显示到串口助手上是要拆分的,比如你想发送显示12345,是要把个位十位百位千位万位都拎出来,一个个显示的
你现在是想看result[t]的值是吧,简单点就用printf吧,想准确点就仿真看吧
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-7-7 17:19:47 | 显示全部楼层
不吃鱼的老鼠 发表于 2016-7-7 16:58
你还是没明白我的意思,USART_SendData这个函数的原型是void USART_SendData(USART_TypeDef* USARTx, u8  ...

我都没留意到他传的u32的数据,话说,u32拆分成4个u8不就可以了,比传什么ASCII处理方便多了
回复

使用道具 举报

6

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2016-3-30
在线时间
28 小时
 楼主| 发表于 2016-7-7 18:40:16 | 显示全部楼层
yijinxiaoyou 发表于 2016-7-7 16:46
还是不理解楼主想说明什么。是说串口显示当前的PWM值吗?

在串口调试助手上只是想看看我收到的数据什么,然而这个数据我是要用在PWM上。就这个意思
回复

使用道具 举报

6

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2016-3-30
在线时间
28 小时
 楼主| 发表于 2016-7-7 18:59:26 | 显示全部楼层
不吃鱼的老鼠 发表于 2016-7-7 16:58
你还是没明白我的意思,USART_SendData这个函数的原型是void USART_SendData(USART_TypeDef* USARTx, u8  ...

多谢百忙之中帮我解答问题,我把串口接收到的数据直接给了PWM,现在LED也在随发送数值的变化亮度也在变。我感觉我一开始不应该用串口调试助手,串口调试助手按原始数据又读不出来,选十六进制后我还以为我串口发送的数字变十六进制了,所以一直迷惑到这了。
回复

使用道具 举报

6

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2016-3-30
在线时间
28 小时
 楼主| 发表于 2016-7-7 19:06:07 | 显示全部楼层
yijinxiaoyou 发表于 2016-7-7 16:46
还是不理解楼主想说明什么。是说串口显示当前的PWM值吗?

通过串口发送数字给另一个单片机做PWM用,串口助手用来监测发送的是什么数据
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-7-7 19:12:41 | 显示全部楼层
spark_zhang 发表于 2016-7-7 19:03
多谢您百忙之中帮我解答问题,我现在已经解决了,终究是串口助手把我弄晕了,在串口助手里我看到的是十六 ...

十六进制和十进制只是进制不一样,USART_SendData(USART1,0x0F)和USART_SendData(USART1,15)他们发送的数据都是一样的
回复

使用道具 举报

13

主题

186

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
441
金钱
441
注册时间
2016-6-30
在线时间
97 小时
发表于 2016-7-7 19:27:29 | 显示全部楼层
spark_zhang 发表于 2016-7-7 19:06
通过串口发送数字给另一个单片机做PWM用,串口助手用来监测发送的是什么数据

这简单啊 你要几位数弄几位就行了  串口助手显示 字符串
USART_SendData(USART1,result[t]%1000/100+48);//百位
USART_SendData(USART1,result[t]%100/10+48);//十位
USART_SendData(USART1,result[t]%10+48);   //个位
回复

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
683
金钱
683
注册时间
2016-1-27
在线时间
184 小时
发表于 2016-7-8 09:58:03 | 显示全部楼层
憨厚诚实大叔 发表于 2016-7-7 17:19
我都没留意到他传的u32的数据,话说,u32拆分成4个u8不就可以了,比传什么ASCII处理方便多了

传给单片机的话,拆分成4个u8数据就可以,但是看他的意思应该是要用串口助手显示,监测数据吧
回复

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
683
金钱
683
注册时间
2016-1-27
在线时间
184 小时
发表于 2016-7-8 10:02:46 | 显示全部楼层
spark_zhang 发表于 2016-7-7 18:59
多谢百忙之中帮我解答问题,我把串口接收到的数据直接给了PWM,现在LED也在随发送数值的变化亮度也在变。 ...

共同进步嘛!楼主可以了解一下单片机方面的基础知识,对以后的学习还是很有帮助的
回复

使用道具 举报

6

主题

50

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2016-6-29
在线时间
58 小时
发表于 2016-7-8 10:28:17 | 显示全部楼层
确实,本小白之前也被串口这部分弄糊涂了好久。其实现在再想感觉就是 怎么发和怎么收的问题。数据传输肯定都是2进制的,接收到的二进制的数,把他看做ASCII 或者十进制数或者十六进制数你看到的接收结果可能不同,可能是乱码可能是数据不对,但是收到的二进制数是没错的,只是你解析的方式不一样罢了。所以只要弄清楚你发的是什么,然后再考虑收到怎么解析能得到你想要的数就可以了。
回复

使用道具 举报

9

主题

32

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2016-3-16
在线时间
10 小时
发表于 2016-8-23 15:37:35 | 显示全部楼层
串口只能8位,最大255! 16进制显示!否则乱码~~
回复

使用道具 举报

0

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2022-3-14
在线时间
13 小时
发表于 2022-3-29 19:58:14 | 显示全部楼层
Clivia 发表于 2016-7-8 10:28
确实,本小白之前也被串口这部分弄糊涂了好久。其实现在再想感觉就是 怎么发和怎么收的问题。数据传输肯定 ...

不错,今天刚学,想到了这个问题,感谢解决我的疑惑
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 17:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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