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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3494|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

關(guān)于89C52單片機(jī)串口通信的一個(gè)莫名其妙的BUG

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:255063 發(fā)表于 2018-2-15 02:06 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
代碼如下,用 KEIL 仿真時(shí)沒有任何問(wèn)題,但是寫進(jìn)芯片的時(shí)候不知為何 data_len 的值就會(huì)變成 FF(還是其他的值不知道),然后單片機(jī)串口就一直發(fā)送 "Error: Command length too long!\r\nThe maximum allowable length is 10\r\n" ,當(dāng)我將 data_len 的值改成 1 的時(shí)候單片機(jī)一直給上位機(jī)發(fā) "Y",我初步懷疑是程序開始的時(shí)候不知道在哪個(gè)地方觸發(fā)了一次中斷,試了一晚上都試不出來(lái)結(jié)果,不得已才求助論壇。希望能解決這個(gè)問(wèn)題。
  1. /*
  2. 功能:帶協(xié)議的 51 串口通信
  3. 協(xié)議格式:數(shù)據(jù)長(zhǎng)度 + 數(shù)據(jù)
  4. 數(shù)據(jù)類型:字符型(不適用于 hex 數(shù)據(jù))
  5. 注意:一次接收的數(shù)據(jù)長(zhǎng)度不能大于 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];  // 接收數(shù)據(jù)緩沖區(qū), char 類型用于比較字符串, 長(zhǎng)度加 1 是為了加 \0
  13. uchar data_len=0;  // 指令長(zhǎng)度標(biāo)志位
  14. uchar data_len_bak=0;
  15. bit receive_complete=0;  // 數(shù)據(jù)接收完成標(biāo)志位

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

  22. void init(void)
  23. {
  24.         TMOD=0x20;  // 設(shè)置定時(shí)器1為工作方式2(8位自動(dòng)重載),高八位為重載常數(shù),溢出時(shí)低八位自動(dòng)從高八位取初值
  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.         // 發(fā)送一個(gè)數(shù)組
  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';  // 給接收到的數(shù)據(jù)最后加上 \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)  // 收到數(shù)據(jù)
  76.         {
  77.                 if(data_len==0)
  78.                 {
  79.                         data_len=SBUF;  // 如果 data_len 為0,即沒收到數(shù)據(jù),于是就初始化數(shù)據(jù)長(zhǎng)度
  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,即數(shù)據(jù)已接收完成
  87.                 }
  88.                 RI=0;
  89.         }
  90. }
復(fù)制代碼

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

使用道具 舉報(bào)

沙發(fā)
ID:255063 發(fā)表于 2018-2-15 17:01 | 只看該作者
我已經(jīng)解決了,是串口助手軟件的問(wèn)題,我自己重新寫了個(gè)串口助手的工具調(diào)試了下是沒有問(wèn)題的,主要是用其他的串口助手軟件不能方便地按照協(xié)議格式來(lái)發(fā)送數(shù)據(jù),我自己寫的串口助手程序可以根據(jù)自己的需要更改一些功能。

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

板凳
ID:255063 發(fā)表于 2018-2-16 14:44 | 只看該作者
現(xiàn)在還有一個(gè)問(wèn)題想求助一下廣大的朋友,這個(gè)程序在復(fù)位之后會(huì)發(fā)送一次 “Error: Command length too long!\r\nThe maximum allowable length is 10\r\n” ,實(shí)在想不出原因,各位幫忙看下哪里的錯(cuò)誤,謝謝。
新年快樂(lè)!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美激情a∨在线视频播放 成人免费共享视频 | 精品久久久久久亚洲综合网站 | 亚洲不卡视频 | 久久久久久亚洲精品不卡 | 91国产视频在线 | 日韩精品在线播放 | 久久噜噜噜精品国产亚洲综合 | 韩国av电影网 | 久久精品亚洲精品国产欧美 | 久久国产精品一区二区 | 中文字幕亚洲区一区二 | 日日av | 亚洲国产aⅴ成人精品无吗 欧美激情欧美激情在线五月 | 国产91丝袜在线播放 | 久久综合一区二区 | 91精品国产91久久久久久 | 天堂成人国产精品一区 | 99热播放| 国产欧美日韩综合精品一区二区 | 亚洲视频第一页 | 日韩免费看片 | 国产日韩精品一区 | 精品一级 | 久久久久久久综合色一本 | 91高清在线观看 | 免费午夜电影 | 欧美aⅴ | 免费久久久| 久热精品在线观看视频 | 国产精品一区二区在线观看 | 国产高清精品一区 | 国产成人免费视频网站高清观看视频 | 亚洲成人综合网站 | 精品国产一区二区三区久久久久久 | 免费a v网站 | 天天草天天 | 99热在线观看精品 | 国产情侣久久 | 欧美理论片在线 | 欧美啊v在线观看 | 天天久久 |