找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 781|回复: 10
收起左侧

单片机串口接收端数据分离问题

[复制链接]
ID:705846 发表于 2024-5-12 14:05 | 显示全部楼层 |阅读模式
大家好,占用大家宝贵时间请指点。

主机传送,用串口助手接收正常的。在接收端似乎是ASCII码的hex,请教各位,如何在从机端才能分离出110这个数字在数码管显示出来。
传送代码如下:
unsigned int        nbt=110;
                unsigned int        nct=10;
                unsigned int        ndt=20;
                unsigned int        net=140;
                            i=Read_key();  //读按键值
                if(i==7)
                {                                
                memset(num, 0, sizeof(char)*18);
                while(Read_key()==i);   //等待按键释放
                Write_DATA(0,tab[2]);               
                sprintf(num,"time%d\n",nbt);                             
                  SendString(num);                                
                delay(100);
                }


1q.JPG


在接收端接收到time110;现在time可以正常分离判断,110分离不了,请教各位,如何才能分离出110这个数字在数码管显示出来。
接收端代码:
  1. unsigned char Uart_recd_data(void){
  2. static char str[10];
  3. unsigned char i,temp;
  4. if(USART_RX_STA)        {
  5. for(i=0;i<Data_Length;i++)
  6. {
  7. str[i]=USART_RX_BUF[i];
  8. }
  9. USART_RX_STA=0;//接收完毕

  10. temp=0;

  11. if(strstr(str,"time"))                 {
  12. for(i=5;i<8;i++)                                {
  13. temp=(char)temp*10+(str[i]-30);
  14. }
  15. }
  16. ES=1;        }
  17. return temp;
  18. }


  19. void main{
  20.         while(1)
  21.         {
  22.                 temp = Uart_recd_data();
  23.                 num[0] = temp/100;        
  24.                 num[1] = temp/10%10;
  25.                 num[2] = temp %10;                                
  26.                 delay(1000);
  27.                 Write_DATA(0,tab[num[0]]);
  28.                 Write_DATA(2,tab[num[1]]);
  29.                 Write_DATA(4,tab[num[2]]);

  30.         }
  31. }
复制代码

回复

使用道具 举报

ID:237471 发表于 2024-5-12 15:58 | 显示全部楼层
如果数据长度是固定的,用一个数组接收数据,把time作为数据头,找到数据头,第五位就是你要的
回复

使用道具 举报

ID:1109793 发表于 2024-5-12 16:17 | 显示全部楼层
lxh2002 发表于 2024-5-12 15:58
如果数据长度是固定的,用一个数组接收数据,把time作为数据头,找到数据头,第五位就是你要的

楼主意思大概是把字符串110变成三个数字,1,1,0;
回复

使用道具 举报

ID:705846 发表于 2024-5-12 16:22 | 显示全部楼层
xiaobendan001 发表于 2024-5-12 16:17
楼主意思大概是把字符串110变成三个数字,1,1,0;

把time110后面的110变成可以计算的110,然后用数码管显示出来。
回复

使用道具 举报

ID:1109793 发表于 2024-5-12 16:29 | 显示全部楼层
samxon 发表于 2024-5-12 16:22
把time110后面的110变成可以计算的110,然后用数码管显示出来。

ASCII好像是直接减去一个数字就变成数字了吧,好像是0x30,这样直接拿去显示就好了吧,不需要再整成一个变量,再分解BCD码,多麻烦啊
回复

使用道具 举报

ID:73992 发表于 2024-5-12 18:08 来自手机 | 显示全部楼层
数字asc码,110三个字节。百位,十位,个位分别减0x30.百位得到值0x01再乘以100,十位得到值01再乘以10,个位得到值00。这三个字节数字的和就是可计算的值。
回复

使用道具 举报

ID:1034262 发表于 2024-5-12 18:38 | 显示全部楼层
ASCII编码而已,直接按ASCII判断就可以了。哪怕有中文,都一样可以分离出来。
回复

使用道具 举报

ID:883242 发表于 2024-5-12 20:12 | 显示全部楼层
sprintf(%d)的长度是不固定的,可能是“1”、也可能是“10”,还可能是“110”,那就要从最后的\n开始向前分离数字,直到遇到字母为止。
回复

使用道具 举报

ID:161164 发表于 2024-5-13 10:24 | 显示全部楼层
2024-05-13_102322.png
2024-05-13_102344.png

回复

使用道具 举报

ID:844772 发表于 2024-5-13 15:32 | 显示全部楼层
你这句不就是分离的吗?  for(i=5;i<8;i++)     temp=(char)temp*10+(str[i]-30);
但是有两个问题:一是,i应该从4开始;二是,30 是十六进制,应该用48
回复

使用道具 举报

ID:705846 发表于 2024-5-15 13:02 来自手机 | 显示全部楼层
应该是从4开始,但就取少一位。没有搞明白是怎么回事。必须从5开始。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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