OpenEdv-开源电子网

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

STM8串口数据传输头疼的问题

[复制链接]

72

主题

153

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2014-1-1
在线时间
223 小时
发表于 2021-5-16 23:59:11 | 显示全部楼层 |阅读模式
10金钱
在搞8S时,下机的短整数,发给上机,PRINTF函数太大用不了,网找了,用优化也一样,5K多空间,
编译不过,我就是个三位数,于是,用循环,可是,数据转换字符时,ITOA也用不了,没有这个函数,
用格式化SPRINTF也是空间大,我都无语了,这个就过不去了
哪个兄弟有方法,教一个,
短整数,发给上位机。8S的,

最佳答案

查看完整内容[请看2#楼]

b度,我找到家0的意思了,和加0x30是一个道理的。谢谢了,当初c也没有好好学,就这么糊弄过去。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

72

主题

153

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2014-1-1
在线时间
223 小时
 楼主| 发表于 2021-5-16 23:59:12 | 显示全部楼层
b度,我找到家0的意思了,和加0x30是一个道理的。谢谢了,当初c也没有好好学,就这么糊弄过去。
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8207
金钱
8207
注册时间
2020-5-11
在线时间
3702 小时
发表于 2021-5-17 11:08:52 | 显示全部楼层
本帖最后由 LcwSwust 于 2021-5-17 11:21 编辑

仅供参考
  1. code U8 NUMTAB[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  2. //------------------------------------------------
  3. //数字转为字符串
  4. //最大位数为10
  5. //s:字符串
  6. //base:进制
  7. //size:用于限制字符串的长度,若为0,则字符串的位数等于数据的位数
  8. //------------------------------------------------
  9. void Num2Str(U32 n,U8 *s,U8 base,U8 size)        //reentrant
  10. {
  11.         S8 i;
  12.         U8 buf[10];
  13.         for(i=0;i<10;i++)
  14.         {
  15.                 buf[i]=NUMTAB[n%base];//取个位,并转为字符
  16.                 n=n/base;//右移一位
  17.                 if(n==0)break;
  18.         }
  19.         if(i>=10)i=9;
  20.         if(size>0)
  21.         {
  22.                 size--;               
  23.                 for(;size>i;size--)*(s++)='0';//数据位不够的在前补0
  24.                 i=size;
  25.         }
  26.         for(;i>=0;i--)//i=9876543210
  27.         {
  28.                 *(s++)=buf[i];
  29.         }
  30.         *s=0;//字符串结尾
  31. }
复制代码
另一个版本:
  1. //-----------------------------------------------
  2. //字节转为10进制位字符串
  3. //-----------------------------------------------
  4. void uartsendnum10(INT16U n)
  5. {
  6. INT8U i,d[6];

  7. for(i=0;i<5;i++)
  8. {
  9.   d[4-i]=n%10+0x30;                //取个位转换为ASCII
  10.   n=n/10;
  11. }
  12. d[5]=0;
  13. uartsendstr1(d);
  14. }
复制代码

还可以更加精简,比如
uart_sendbyte(n/100%10+'0');
uart_sendbyte(n/10%10+'0');
uart_sendbyte(n%10+'0');

专治疑难杂症
回复

使用道具 举报

72

主题

153

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2014-1-1
在线时间
223 小时
 楼主| 发表于 2021-5-17 16:10:26 | 显示全部楼层
为什么后面要加个零,必须以零结尾。作为字符串发送吗?
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8207
金钱
8207
注册时间
2020-5-11
在线时间
3702 小时
发表于 2021-5-28 22:56:05 | 显示全部楼层
nmgbtzyf 发表于 2021-5-17 16:10
为什么后面要加个零,必须以零结尾。作为字符串发送吗?

自己写一个发送字符串的函数试试,
考虑一下什么时候结束?
专治疑难杂症
回复

使用道具 举报

0

主题

42

帖子

0

精华

高级会员

Rank: 4

积分
626
金钱
626
注册时间
2020-11-21
在线时间
123 小时
发表于 2021-8-28 16:35:18 | 显示全部楼层
本帖最后由 xiaoqi976633690 于 2021-8-28 16:39 编辑
  1. <div class="blockcode"><blockquote>
  2. #include <iostm8s003F3.h>
  3. #include "usart.h"
  4. #include "stdio.h"
  5. #define        uint         unsigned    int
  6. #define        uchar        unsigned    char
  7. #define        ulong        unsigned    long

  8. uint x;
  9. void delay_ms(ulong i)
  10. {
  11.   while(i--);
  12.   
  13. }
  14. int main( void )
  15. {
  16.   CLK_CKDIVR_HSIDIV = 0; //时钟初始化 16mhz不分频
  17.   UART1_Init(); //串口初始化
  18.   UART1_Send_Str("hello world!\n\r");
  19.   asm("rim");
  20.   uint x=0,i;
  21.   unsigned char number[]={'0','1','2','3','4','5','6','7','8','9'};
  22.   uint n[]={1000,100,10,1};
  23.   while(1)
  24.   {
  25.     x++;
  26.     delay_ms(65535);
  27.     UART1_Send_Str("x的值为:");
  28.     for(i=0;i<4;i++)
  29.     {
  30.        switch(x/(n[i])%10) //提取千百十个位的数
  31.        {
  32.         case (0) : UART1_Send_Date8(number[0]);break;
  33.         case (1) : UART1_Send_Date8(number[1]);break;
  34.         case (2) : UART1_Send_Date8(number[2]);break;
  35.         case (3) : UART1_Send_Date8(number[3]);break;
  36.         case (4) : UART1_Send_Date8(number[4]);break;
  37.         case (5) : UART1_Send_Date8(number[5]);break;
  38.         case (6) : UART1_Send_Date8(number[6]);break;
  39.         case (7) : UART1_Send_Date8(number[7]);break;  
  40.         case (8) : UART1_Send_Date8(number[8]);break;
  41.         case (9) : UART1_Send_Date8(number[9]);break;
  42.        }
  43.       
  44.     }
  45.     UART1_Send_Str("\n\r");

  46.    }

  47. }




复制代码


参考数码管的比较简单容易理解串口打印内容如下
[2021-08-28 16:37:24.764]
RX:x的值为:0234

[2021-08-28 16:37:25.033]
RX:x的值为:0235

[2021-08-28 16:37:25.310]
RX:x的值为:0236

[2021-08-28 16:37:25.579]
RX:x的值为:0237

[2021-08-28 16:37:25.856]
RX:x的值为:0238

[2021-08-28 16:37:26.127]
RX:x的值为:0239

[2021-08-28 16:37:26.402]
RX:x的值为:0240

[2021-08-28 16:37:26.688]
RX:x的值为:0241




回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-25 16:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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