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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3476|回復: 2
收起左側

關于89C52單片機串口通信的一個莫名其妙的BUG

[復制鏈接]
ID:255063 發表于 2018-2-15 02:06 | 顯示全部樓層 |閱讀模式
代碼如下,用 KEIL 仿真時沒有任何問題,但是寫進芯片的時候不知為何 data_len 的值就會變成 FF(還是其他的值不知道),然后單片機串口就一直發送 "Error: Command length too long!\r\nThe maximum allowable length is 10\r\n" ,當我將 data_len 的值改成 1 的時候單片機一直給上位機發 "Y",我初步懷疑是程序開始的時候不知道在哪個地方觸發了一次中斷,試了一晚上都試不出來結果,不得已才求助論壇。希望能解決這個問題。
  1. /*
  2. 功能:帶協議的 51 串口通信
  3. 協議格式:數據長度 + 數據
  4. 數據類型:字符型(不適用于 hex 數據)
  5. 注意:一次接收的數據長度不能大于 10
  6. */
  7. #include <reg52.h>
  8. #include <string.h>

  9. #define uchar unsigned char
  10. #define uint unsigned int

  11. uchar clock[4]={11,23,34,51};
  12. char recv[11];  // 接收數據緩沖區, char 類型用于比較字符串, 長度加 1 是為了加 \0
  13. uchar data_len=0;  // 指令長度標志位
  14. uchar data_len_bak=0;
  15. bit receive_complete=0;  // 數據接收完成標志位

  16. void delay(uint i)  // 1ms 延時
  17. {
  18.         uint j;
  19.         while(i--)
  20.                 for(j=0;j<192;j++);
  21. }

  22. void init(void)
  23. {
  24.         TMOD=0x20;  // 設置定時器1為工作方式2(8位自動重載),高八位為重載常數,溢出時低八位自動從高八位取初值
  25.         TH1=0xfd;  // 9600 波特率
  26.         TL1=0xfd;
  27.         TR1=1;
  28.         EA=1;
  29.         ES=1;  // 串口中斷允許
  30.         REN=1;
  31.         SM0=0;
  32.         SM1=1;
  33. }

  34. void send(uchar d)
  35. {
  36.         SBUF=d;
  37.         while(!TI);
  38.         TI=0;
  39. }

  40. void sendarr(uchar *pd, uchar len)
  41. {
  42.         // 發送一個數組
  43.         while(len--)
  44.         {
  45.                 send(*pd);
  46.                 pd++;
  47.         }
  48. }

  49. void main()
  50. {
  51.         init();
  52.         while(1)
  53.         {
  54.                 if(data_len_bak>10)
  55.                 {
  56.                         ES=0;
  57.                         sendarr("Error: Command length too long!\r\nThe maximum allowable length is 10\r\n", 69);
  58.                         delay(500);
  59.                         ES=1;
  60.                         data_len = 0;
  61.                         continue;
  62.                 }
  63.                 if(receive_complete)
  64.                 {
  65.                         ES=0;
  66.                         //recv[data_len_bak] = '\0';  // 給接收到的數據最后加上 \0 用于比較字符串
  67.                         //if(strcmp(recv, "clock")==0)  sendarr(clock, 4);
  68.                         send('Y');
  69.                         ES=1;
  70.                 }
  71.         }
  72. }

  73. void uart(void) interrupt 4 // 串口中斷
  74. {
  75.         if(RI)  // 收到數據
  76.         {
  77.                 if(data_len==0)
  78.                 {
  79.                         data_len=SBUF;  // 如果 data_len 為0,即沒收到數據,于是就初始化數據長度
  80.                         data_len_bak=data_len;
  81.                 }
  82.                 else
  83.                 {
  84.                         recv[data_len_bak - data_len] = SBUF;
  85.                         data_len--;
  86.                         if(data_len==0) receive_complete=1;  // 如果 data_len 減到0,即數據已接收完成
  87.                 }
  88.                 RI=0;
  89.         }
  90. }
復制代碼

回復

使用道具 舉報

ID:255063 發表于 2018-2-15 17:01 | 顯示全部樓層
我已經解決了,是串口助手軟件的問題,我自己重新寫了個串口助手的工具調試了下是沒有問題的,主要是用其他的串口助手軟件不能方便地按照協議格式來發送數據,我自己寫的串口助手程序可以根據自己的需要更改一些功能。

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:255063 發表于 2018-2-16 14:44 | 顯示全部樓層
現在還有一個問題想求助一下廣大的朋友,這個程序在復位之后會發送一次 “Error: Command length too long!\r\nThe maximum allowable length is 10\r\n” ,實在想不出原因,各位幫忙看下哪里的錯誤,謝謝。
新年快樂!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品福利在线 | 亚洲一区二区三区高清 | 99视频在线播放 | 亚洲一级毛片 | 国产一区二区三区免费 | 中文天堂网 | 久久69精品久久久久久国产越南 | 国产1区2区| 羞视频在线观看 | 91 久久| 午夜影院在线观看 | 精品国产色 | 亚洲第一天堂无码专区 | 成年人在线电影 | 一区二区三区在线免费 | 国产三级 | 日本成人在线网址 | 少妇诱惑av | 欧洲一级视频 | 亚洲午夜精品视频 | 99久久精品国产一区二区三区 | 国产成人aⅴ | 日韩国产欧美视频 | 99re在线免费视频 | 国产免费看 | 国产区在线观看 | 亚洲第一成人影院 | 亚洲国产精品一区二区第一页 | 亚洲三区在线观看 | 一区二区三区四区在线 | 日韩欧美综合 | 成人av免费 | 国产久| 永久免费在线观看 | 在线男人天堂 | 日本a级大片 | 在线免费观看a级片 | h视频在线免费 | 中文字幕免费视频 | 久在线| 亚洲高清在线 |