我想用stm32单片机的uart串口发送一个十进制的数据(例如adc转换的电压值)到上位机上面。请问怎么把一个十进制的数字发送出去,这个程序要怎么写。我查了一下资料,好像要发送的数据都要求是二进制的。求大佬
把十进制的数转为字符就可以发出去了,或者吧十进制的数转为十六进制发出就可以,例如十进制的数超过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;
}
/*
}
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码发送就行了
http://www.enmaking.com/material/ma_1K5O4bfE