久久久久久久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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日日射影院 | 国产精品国产三级国产aⅴ原创 | av国产在线观看 | 黄网站在线播放 | 国产精品一区二区三区在线 | 人操人人干人 | 欧美亚洲激情 | 国产美女久久 | 久久这里只有精品首页 | 日韩欧美三区 | 男女免费观看在线爽爽爽视频 | www.国产精品 | 欧美成人免费 | 日本手机在线 | 国产精品久久久久永久免费观看 | 国产日韩欧美 | 色婷婷综合久久久久中文一区二区 | 免费美女网站 | 成人在线免费观看 | 亚洲国产一区在线 | 欧美成人激情视频 | 国产精品久久av | 综合二区 | 国产一区二区精品在线 | 亚洲成人精品 | 四虎影院在线观看av | 亚洲精品久久久久avwww潮水 | 毛片网站在线观看 | 青春草91 | 国产一级大片 | 亚洲一区 中文字幕 | 日韩欧美手机在线 | 久久久久久久久99 | 欧美精品一区二区三区蜜桃视频 | 伊人电影院av | 亚洲日本中文 | 成人夜晚看av | 在线91 | 久久一区二区av | 亚洲毛片 | 欧美国产日韩在线观看成人 |