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

標題: 關(guān)于單片機串口接收轉(zhuǎn)發(fā)程序的問題分析 [打印本頁]

作者: hmgqljz111    時間: 2019-9-27 17:04
標題: 關(guān)于單片機串口接收轉(zhuǎn)發(fā)程序的問題分析
各們老師請幫我看一下,我在做串口接收,再轉(zhuǎn)發(fā)實驗。把從上位機接收到的七個字符到數(shù)組里。然后再把這個數(shù)組里面的數(shù)據(jù)發(fā)送回去給上位機。?
現(xiàn)在能過上位機如果發(fā)送長度正好是七個字符,是沒問題的。如果發(fā)送的長度不到七個字符,那么返回到上位的數(shù)據(jù),就會被打亂。如何做出判斷,只接收長度夠七的字符串呢?(比如,我發(fā)送 10 20 30 40 50 60 70 那么可以正解的返回給上位機,但是如果我只發(fā)送10 20 30 40 那么返回給上位的就是10 20 30 40 10 20 30 。如何讓單片機只返回正解的字符串)謝謝。

單片機源程序如下:
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. uchar flag,a,i,j;
  6. uchar buf[7];
  7. void init()
  8.     {
  9.     SCON=0X50;
  10.    TMOD =0X20;
  11.    TH1=0XFD;
  12.    TL1=0XFD;
  13.    TR1=1;
  14.    EA=1;
  15.    ES=1;
  16.     }
  17. void main()
  18.     {
  19.    init();
  20.    while(1)
  21.       {
  22.      if(flag==1)
  23.         {
  24.       j=0;
  25.       ES=0;
  26.       for(i=0;i<7;i++)
  27.          {
  28.        SBUF=buf[i];
  29.      while(!TI);
  30.      TI=0;
  31.       }
  32.       ES=1;
  33.       flag=0;
  34.       
  35.      }
  36.    }

  37. }
  38. void ser() interrupt 4
  39.      {
  40.       uchar temp;
  41.            RI=0;   
  42.            temp=SBUF;
  43.            buf[j++]=temp;
  44.                  if(j==7)
  45.                    {
  46.                      flag=1;
  47.                      ES=0;
  48.                     }
  49.      else
  50.         {
  51.       flag=0;
  52.      }
  53.       }
復制代碼


作者: wulin    時間: 2019-9-27 20:55
簡單的方法是收到一個字節(jié)立即發(fā)還上位機,復雜一點的方法是相隔一定時間沒有收到數(shù)據(jù)判斷為結(jié)束,計算字節(jié)長度后發(fā)還上位機。
作者: 沒有你    時間: 2019-9-27 22:50
你上位機大概多久發(fā)送一輪數(shù)據(jù)?如果可以確定每輪發(fā)送數(shù)據(jù)的時間,那可以開一個定時器監(jiān)控每輪接收數(shù)據(jù)的字節(jié)數(shù),如果數(shù)據(jù)不足7個字節(jié),則把接收的數(shù)據(jù)丟掉,不發(fā)送給上位機。只有數(shù)據(jù)達到7個字節(jié),才發(fā)送給上位機
作者: 滄浪    時間: 2019-9-28 09:56
我提供給你另外要給思路,你可以自己定義一個首字母標識,當你接收端識別出來你接收這個字母的時候就一定是第一個
作者: hmgqljz111    時間: 2019-9-28 15:26
wulin 發(fā)表于 2019-9-27 20:55
簡單的方法是收到一個字節(jié)立即發(fā)還上位機,復雜一點的方法是相隔一定時間沒有收到數(shù)據(jù)判斷為結(jié)束,計算字節(jié) ...

收發(fā)時間不固定
作者: hmgqljz111    時間: 2019-9-28 15:27
滄浪 發(fā)表于 2019-9-28 09:56
我提供給你另外要給思路,你可以自己定義一個首字母標識,當你接收端識別出來你接收這個字母的時候就一定是 ...

接收的首字節(jié)是固定的。
作者: hmgqljz111    時間: 2019-9-28 15:27
沒有你 發(fā)表于 2019-9-27 22:50
你上位機大概多久發(fā)送一輪數(shù)據(jù)?如果可以確定每輪發(fā)送數(shù)據(jù)的時間,那可以開一個定時器監(jiān)控每輪接收數(shù)據(jù)的字 ...

時間不固定。很隨機的

作者: hmgqljz111    時間: 2019-9-28 15:29
wulin 發(fā)表于 2019-9-27 20:55
簡單的方法是收到一個字節(jié)立即發(fā)還上位機,復雜一點的方法是相隔一定時間沒有收到數(shù)據(jù)判斷為結(jié)束,計算字節(jié) ...

您看我這個思路可以嗎?能過REN這位來控制,接收還是不接收。發(fā)送不想接收返回信息的命令的時候,把REN=0,要接收的返回信息時,REN=1.這樣可嗎

作者: hmgqljz111    時間: 2019-9-28 15:37
滄浪 發(fā)表于 2019-9-28 09:56
我提供給你另外要給思路,你可以自己定義一個首字母標識,當你接收端識別出來你接收這個字母的時候就一定是 ...

命令是固定的,返回的信息也是固定的。
只是有的命令返回的是七個字節(jié)的信息,有的命令返回的是4個字節(jié)的信息。
不知道如何只接收七個字節(jié)的信息,而不接收4個字節(jié)的信息。如果這樣可行嗎。在發(fā)送反回4個字節(jié)命令之前,把串口接收關(guān)了,等到發(fā)送七個字節(jié)信息的時候再把串口接打開。
作者: yzwzfyz    時間: 2019-9-28 16:25
用串行通訊協(xié)議解決。
作者: wulin    時間: 2019-9-28 22:53
hmgqljz111 發(fā)表于 2019-9-28 15:26
收發(fā)時間不固定

在你的程序基礎上改寫成利用定時器T0判斷串口1幀數(shù)據(jù)(1~7字節(jié))收發(fā)程序,供參考。

  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. uchar i,j=0;
  6. bit Lock=0;
  7. uchar buf[7];
  8. void init()
  9. {
  10.         SCON=0X50;
  11.         TMOD =0X21;
  12.         TH0=0xfe;
  13.         TL0=0x0b;
  14.         TH1=0XFD;
  15.         TL1=0XFD;
  16. //        TR0=1;
  17.         TR1=1;
  18.         EA=1;
  19.         ET0=1;
  20.         ES=1;
  21. }
  22. void main()
  23. {
  24.         init();
  25.         while(1)
  26.         {
  27.                 if(Lock==1)
  28.                 {
  29.                         Lock=0;
  30.                         EA=0;
  31.                         for(i=0;i<j;i++)
  32.                         {
  33.                                 SBUF=buf[i];
  34.                                 while(!TI);
  35.                                 TI=0;
  36.                         }
  37.                         j=0;                               
  38.                         EA=1;
  39.                 }
  40.         }
  41. }
  42. void T0_time() interrupt 1 //0.5ms定時中斷
  43. {
  44.         TH0=0xfe;
  45.         TL0=0x0b;
  46.         TR0=0;//關(guān)閉定時器
  47.         Lock=1; //開自鎖標志
  48. }
  49. void ser() interrupt 4
  50. {
  51.         RI=0;   
  52.         if(j<7)
  53.         j++;
  54.         buf[j-1]=SBUF;
  55.         TR0=1;       
  56. }
復制代碼





歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1