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

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

0

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);

1

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

1

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

0

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

0

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

0

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

0

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));
}

0

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

0

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

#include "stdlib.h"
...

char *pbuff;
char databuff[4];

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

...

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

相似问题

1
qt 子线程串口发送数据异常
1
利用ARM的UART 实现如下问题
2
STM32串口通信,串口调试助手中可以实现收发,自己编的串口助手就只能收不能发,有大神知道怎么办吗?
2
STM32 HAL库DMA第二次输入不能从buffer头存储
1
ESP8266 串口接收数据,当接收的数据中包含0xFF的时候,这个字节后的数据会被分成两次接收,如何解决?
1
ESP8266-SDK 串口中断 接收数据的FIFO有一个接收超时时间,请问接收超时时间在哪里设置?
3
ESP8266-SDK 串口中断 当串口接收到连续两个0xFF的时候,会触发多次中断,如何避免?
0
STM32通过Uart与ARM通讯,arm_uart接收数据漏码,怎么整?
0
STM32F105主板HAL库函数HAL_UART_Receive_IT()中第二个参数uint8_t *pData必须为无符号整型??
1
STM32串口如何实现一个发数据,另外一个接收数据
2
STM32+EC20 实现MQTT数据上传,发送一次数据后连接失败,原因?
1
野火 RTT 改的 三个串口 dma 接收 接收后处理数据,但是串口一直不能正常发送数据
1
nrf51802接收串口数据,导致系统重启
0
zigbee模块(CC2530)串口通信问题
0
如何在FPGA上将传感器采集到的数据通过串口发送?
0
甲醛传感器ZE08与ZIGbee串口调试是否有冲突。
0
esp8266模块执行不了stc8单片机发送的at指令
0
有没有计算STM32单片机UART波特率的软件?不是CAN
0
STM32 串口接收指令无反应。
0
STC15串口通信识别接收的消息需要发十次才有反应,求大佬帮忙看看.....?