yujunkan
yujunkan
2018-06-22 06:33
采纳率: 6.3%
浏览 3.3k

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

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

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

10条回答 默认 最新

  • weixin_42208897
    水上的树 2018-06-22 06:58

    把十进制的数转为字符就可以发出去了,或者吧十进制的数转为十六进制发出就可以,例如十进制的数超过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);

    点赞 评论
  • caixida
    caixida 2018-06-22 16:26

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

    点赞 评论
  • u013921592
    fdssdf456 2018-07-02 00:00

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

    点赞 评论
  • vigorshaka
    vigorshaka 2018-07-02 04:05

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

    #include "stdlib.h"
    ...

    char *pbuff;
    char databuff[4];

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

    ...

    点赞 评论
  • zhangxiang_net
    zhangxiang_net 2018-07-02 07:25

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

    点赞 评论
  • bless_you0_0
    bless_you0_0 2018-07-04 04:00

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

    点赞 评论
  • ppcc8786
    ppcc8786 2018-07-16 11:09

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

    点赞 评论
  • xf_lii
    xf_lii 2018-08-23 02:21

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

    点赞 评论
  • A_A_0
    A_A_0 2018-10-15 13:58

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

    点赞 评论
  • bxbxbxbd
    bxbxbxbd 2021-07-31 17:30

    http://www.enmaking.com/material/ma_1K5O4bfE

    点赞 评论

相关推荐