久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

關于單片機串口接收轉發程序的問題分析

[復制鏈接]
跳轉到指定樓層
樓主
ID:230975 發表于 2019-9-27 17:04 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
各們老師請幫我看一下,我在做串口接收,再轉發實驗。把從上位機接收到的七個字符到數組里。然后再把這個數組里面的數據發送回去給上位機。?
現在能過上位機如果發送長度正好是七個字符,是沒問題的。如果發送的長度不到七個字符,那么返回到上位的數據,就會被打亂。如何做出判斷,只接收長度夠七的字符串呢?(比如,我發送 10 20 30 40 50 60 70 那么可以正解的返回給上位機,但是如果我只發送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.       }
復制代碼

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

使用道具 舉報

沙發
ID:213173 發表于 2019-9-27 20:55 | 只看該作者
簡單的方法是收到一個字節立即發還上位機,復雜一點的方法是相隔一定時間沒有收到數據判斷為結束,計算字節長度后發還上位機。
回復

使用道具 舉報

板凳
ID:351097 發表于 2019-9-27 22:50 | 只看該作者
你上位機大概多久發送一輪數據?如果可以確定每輪發送數據的時間,那可以開一個定時器監控每輪接收數據的字節數,如果數據不足7個字節,則把接收的數據丟掉,不發送給上位機。只有數據達到7個字節,才發送給上位機
回復

使用道具 舉報

地板
ID:111517 發表于 2019-9-28 09:56 | 只看該作者
我提供給你另外要給思路,你可以自己定義一個首字母標識,當你接收端識別出來你接收這個字母的時候就一定是第一個
回復

使用道具 舉報

5#
ID:230975 發表于 2019-9-28 15:26 | 只看該作者
wulin 發表于 2019-9-27 20:55
簡單的方法是收到一個字節立即發還上位機,復雜一點的方法是相隔一定時間沒有收到數據判斷為結束,計算字節 ...

收發時間不固定
回復

使用道具 舉報

6#
ID:230975 發表于 2019-9-28 15:27 | 只看該作者
滄浪 發表于 2019-9-28 09:56
我提供給你另外要給思路,你可以自己定義一個首字母標識,當你接收端識別出來你接收這個字母的時候就一定是 ...

接收的首字節是固定的。
回復

使用道具 舉報

7#
ID:230975 發表于 2019-9-28 15:27 | 只看該作者
沒有你 發表于 2019-9-27 22:50
你上位機大概多久發送一輪數據?如果可以確定每輪發送數據的時間,那可以開一個定時器監控每輪接收數據的字 ...

時間不固定。很隨機的
回復

使用道具 舉報

8#
ID:230975 發表于 2019-9-28 15:29 | 只看該作者
wulin 發表于 2019-9-27 20:55
簡單的方法是收到一個字節立即發還上位機,復雜一點的方法是相隔一定時間沒有收到數據判斷為結束,計算字節 ...

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

使用道具 舉報

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

命令是固定的,返回的信息也是固定的。
只是有的命令返回的是七個字節的信息,有的命令返回的是4個字節的信息。
不知道如何只接收七個字節的信息,而不接收4個字節的信息。如果這樣可行嗎。在發送反回4個字節命令之前,把串口接收關了,等到發送七個字節信息的時候再把串口接打開。
回復

使用道具 舉報

10#
ID:123289 發表于 2019-9-28 16:25 | 只看該作者
用串行通訊協議解決。
回復

使用道具 舉報

11#
ID:213173 發表于 2019-9-28 22:53 | 只看該作者

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

  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;//關閉定時器
  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. }
復制代碼
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品国产一区二区在线 | 国产精品久久久久aaaa九色 | 香蕉婷婷 | 国产欧美精品在线观看 | 91九色婷婷 | 久久久久久久久久影视 | 91精品欧美久久久久久久 | 麻豆精品国产免费 | 国产精品福利视频 | 国产精品国产成人国产三级 | 日韩中文在线视频 | 国产精品亚洲成在人线 | 97成人在线 | 久久精品视频网站 | 日韩av中文 | 一区在线视频 | 五月综合激情在线 | 日韩高清一区 | 免费视频99 | 久久99精品久久久久婷婷 | 成人自拍av | 精品九九 | 欧美精品一区二区三区四区 | 中文字幕日韩欧美一区二区三区 | 欧美精品a∨在线观看不卡 欧美日韩中文字幕在线播放 | 国产探花 | 欧美精品久久久 | 成人中文字幕在线观看 | 亚洲三区视频 | 欧美日韩一区二区视频在线观看 | 日韩在线不卡 | 少妇一区在线观看 | 美国av毛片| 国产一区欧美一区 | 久久91av| 91国在线观看 | 成人在线视频一区 | 国产精品1区2区3区 一区中文字幕 | 日韩有码在线观看 | 久久青 | 韩国av一区二区 |