欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1869|回復: 10
打印 上一主題 下一主題
收起左側

單片機串口接收端數據分離問題

[復制鏈接]
跳轉到指定樓層
樓主
大家好,占用大家寶貴時間請指點。

主機傳送,用串口助手接收正常的。在接收端似乎是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);
                }





在接收端接收到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. }
復制代碼

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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,然后用數碼管顯示出來。
回復

使用道具 舉報

5#
ID:1109793 發表于 2024-5-12 16:29 | 只看該作者
samxon 發表于 2024-5-12 16:22
把time110后面的110變成可以計算的110,然后用數碼管顯示出來。

ASCII好像是直接減去一個數字就變成數字了吧,好像是0x30,這樣直接拿去顯示就好了吧,不需要再整成一個變量,再分解BCD碼,多麻煩啊
回復

使用道具 舉報

6#
ID:73992 發表于 2024-5-12 18:08 來自觸屏版 | 只看該作者
數字asc碼,110三個字節。百位,十位,個位分別減0x30.百位得到值0x01再乘以100,十位得到值01再乘以10,個位得到值00。這三個字節數字的和就是可計算的值。
回復

使用道具 舉報

7#
ID:1034262 發表于 2024-5-12 18:38 | 只看該作者
ASCII編碼而已,直接按ASCII判斷就可以了。哪怕有中文,都一樣可以分離出來。
回復

使用道具 舉報

8#
ID:883242 發表于 2024-5-12 20:12 | 只看該作者
sprintf(%d)的長度是不固定的,可能是“1”、也可能是“10”,還可能是“110”,那就要從最后的\n開始向前分離數字,直到遇到字母為止。
回復

使用道具 舉報

9#
ID:161164 發表于 2024-5-13 10:24 | 只看該作者



回復

使用道具 舉報

10#
ID:844772 發表于 2024-5-13 15:32 | 只看該作者
你這句不就是分離的嗎?  for(i=5;i<8;i++)     temp=(char)temp*10+(str[i]-30);
但是有兩個問題:一是,i應該從4開始;二是,30 是十六進制,應該用48
回復

使用道具 舉報

11#
ID:705846 發表于 2024-5-15 13:02 來自觸屏版 | 只看該作者
應該是從4開始,但就取少一位。沒有搞明白是怎么回事。必須從5開始。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表