OpenEdv-开源电子网

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

利用printf进行串口通信的问题

[复制链接]

11

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2018-2-24
在线时间
44 小时
发表于 2021-3-24 22:32:27 | 显示全部楼层 |阅读模式
       最近在做一个毕业设计级别的项目,对于一个菜鸟来说就是为了学习的。它是下位机采集陀螺仪的角度数据,通过蓝牙模块发送给上位机。然后上位机接收到数据以后,除了显示在LCD上以外,还有对数据进行判断处理,满足条件再执行其它程序。我遇到的问题是上位机通过串口接收到蓝牙的数据后,直接赋值给一个变量,然后对变量进行处理:acc=(uint8_t*)USART3_RX_BUF,这样做发现数据有问题,导致后面的程序无法正常工作,我是知道USART3_RX_BUF是一个数组而非变量的。
       百度,以及和朋友讨论发现,下位机通过串口printf打印的数据,其实是ASCII形式的,如图1。像我这样的新手容易直接拿来用,忽略了ASCII和十进制数据之间的转换。论坛内有人提出过这个问题,见贴:http://www.openedv.com/posts/list/33279.htm,但是这样用的前提是数据发送的格式要清楚,然后通过拆分数组USART3_RX_BUF[],对每一位进行数据格式转换再合并为想要的数据。这是必不可少的步骤,串口通信得到的数据是不能直接接收就用的。
      我的办法是这样:首先,发送的数据要规范格式,避免接收到的数据小数点左右移动,给LCD显示、数据格式转换带来麻烦。比如要发送的数据有正负,数据在0~几百范围内,那么下位机发送格式最好是:printf("%+06.1f",aa);   这样的数据第一位USART3_RX_BUF[0]一定是符号,USART3_RX_BUF[1]一定对应百位(高位补零),小数点也固定了,下位机接收数据时,就方便处理了。

1,串口接收数据

1,串口接收数据
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2018-2-24
在线时间
44 小时
 楼主| 发表于 2021-3-25 15:02:12 | 显示全部楼层
然后在LCD_ShowxNum这个函数这里又遇到了问题。有人说LCD_ShowxNum函数的第三个参数是无符号的 也就是只能显示正数,负数都是用的补码形式,所以负数显示出来就是很大的正数。可以加个判断如果小于0先取绝对值,然后先显示一个负号,后边再跟数字,如果是正数就直接显示数字。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-28 05:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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