关于stm32UART串口发送数据的问题 5C

我想用stm32单片机的uart串口发送一个十进制的数据(例如adc转换的电压值)到上位机上面。请问怎么把一个十进制的数字发送出去,这个程序要怎么写。我查了一下资料,好像要发送的数据都要求是二进制的。求大佬

9个回答

把十进制的数转为字符就可以发出去了,或者吧十进制的数转为十六进制发出就可以,例如十进制的数超过U8 或者short

int num =65530;
unsigned char data[4]={0}
memcpy(data,&num,4);
上位机再处理一下就可以
int recevieNum=0;
unsgiend char receviceData[4];
memcpy(&recevieNum,receviceData,4);

根据其固件库参考代码,自己修改,再用串口助手模拟调试下。

传送数据时,是按位传送数据的。在接收端会自动按位接收数据。只要匹配好发送端和接收端的模式就可以了

你是想用单片机串口给上位机的串口终端发一个数据,并让它显示成10进制数吧?
那可以用标准库stdlib.h中转换函数itoa,大致代码如下:

#include "stdlib.h"
...

char *pbuff;
char databuff[4];

pbuff = itoa(AdcValue,databuff,10); /*AdcValue是你实际要发送的数据变量*/
UartSendString(pbuff);/*UART发送函数改成你自己的,参数为转换后的发送数据首地址*/

...

把要发送的数用C库函数转换成十进制的数后,再把相应的函数用串口发送出去

串口发送的时候都是以ASCII形式发送的,如果想要传十进制数,就要写一个解析函数,比如要发123,就要先把123转化成字符(每次除以10求余),解析完成分别发送‘1’‘2’‘3’,到上位机在进行解析重新变成10进制数

串口发送一般以字符串的形式发送,所以可以把十进制的数先转换为字符。
char sbuf[512];
int data; //123
sprintf(sbuf,"%d",data); //123转换为“123”
Uart_send(sbuf);

stm用的是C语言,没有只有atoi, 没有 itoa(C++的stdlib.h).
有2个办法:
1: 如果你的usart支持printf(),可以用格式化输出
int i = 33.
printf("%d",i); // 输出是字符"33"
printfln("第一个数:%4d, 第二个数:%d", i, 55); //输出结果: 第一个数:33, 第二个数:55
printfln("十进制:%4d,十六进制:%x", i, i); //输出结果: 十进制: 33,十六进制:21 (十进制和33中间有2个空格,%4d,是4个位置)

"%" [index ":"] ["-"] [width] ["." prec] type

type: d 整数, u有符号整数(用这个有很大问题-2不会显示-2的). f 浮点 x十六进制
另外,整数和浮点前边可以加l 或 h ld 长整型 hd短整型

width: 显示的宽度, 是个数字
具体网上搜: c语言 format 或printf格式化

第2: 自己写个itoa int to ASCII编码

//反转字符串
char *reverse(char *s)
{
char temp;
char *p = s; //p指向s的头部
char *q = s; //q指向s的尾部
while(*q)
++q;
q--;
//交换移动指针,直到p和q交叉
while(q > p)
{
temp = *p;
*p++ = *q;
*q-- = temp;
}
return s;
}

/*

  • 功能:整数转换为字符串
  • char s[] 的作用是存储整数的每一位 */ char *m_itoa(int n) { int i = 0,isNegative = 0; static char s[100]; //必须为static变量,或者是全局变量 if((isNegative = n) < 0) //如果是负数,先转为正数 { n = -n; } do //从各位开始变为字符,直到最高位,最后应该反转 { s[i++] = n%10 + '0'; n = n/10; }while(n > 0); if(isNegative < 0) //如果是负数,补上负号 { s[i++] = '-'; } s[i] = '\0'; //最后加上字符串结束符 return reverse(s); // 顺序是反的,需要反序排列

}

main()
{
int i = 33;
char *str;
str = m_itoa(i); // str ="33"
printf(m_itoa(55));
}

本质上,单片机的数据都是二进制的呀,把十进制的10或十六进制的0x0a赋值给发送buff,在硬件上串口的TXD引脚都是发送00001010B的高低电平信号。
上位机接收到的也是这个数据,一般串口助手上都可以选择显示数据格式,可以是HEX或ASCII码,所以如果选择HEX显示,就要把要发送的数据转换成
BCD码,如把十进制的10转换成0x10再发送,网上这种转换程序很多;或者上位机显示ASCII码,那么要发送十进制10就转换成10+‘0’,即转换
成10的ASCII码发送就行了

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问