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

QQ登錄

只需一步,快速開始

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

單片機(jī)串口發(fā)送寫好的數(shù)據(jù),但用串口助手接收到的數(shù)據(jù)卻不一樣是怎么回事?

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:796670 發(fā)表于 2020-12-28 14:08 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
用串口發(fā)送數(shù)據(jù),然后用串口助手接收數(shù)據(jù),但接收到的數(shù)據(jù)和程序里寫的數(shù)據(jù)不一樣,請(qǐng)問這是怎么回事?串口發(fā)送的數(shù)據(jù):uchar send[8]={0x01,0x03,0x00,0x00,0x00,0x02,0xC4,0x0B}
這是串口助手接收到的數(shù)據(jù):跟程序里的數(shù)據(jù)不一樣,請(qǐng)問大家這是哪里錯(cuò)了?


后來我又把發(fā)送的數(shù)據(jù)全部改成了0X00,結(jié)果如下
結(jié)果接收到的是這個(gè)



這是完整程序:
  1. #include <stc12c5a.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. #include <math.h>
  6. #include <intrins.h>
  7. #define uchar unsigned char
  8. #define uint  unsigned int

  9. uchar rec[9];//接收
  10. uchar send[8]={0x01,0x03,0x00,0x00,0x00,0x02,0xC4,0x0B};//發(fā)送數(shù)據(jù)
  11. uchar num=0;
  12. int i;
  13. void delay(uint z)//延時(shí)函數(shù)
  14. {
  15.         uint x,y;
  16.         for(x=z;x>0;x--);
  17.                 for(y=110;y>0;y--);
  18. }


  19. void init()  //系統(tǒng)初始化
  20. {
  21. TMOD |=0X20;//定時(shí)器T1,方式2,波特率由PCON寄存器的SMOD決定
  22. SCON=0x50; //REN RI TI,RI為0,TI為0
  23. //串行口1方式1 SCON是串行口1的串行控制寄存器,REN為1,允許接收
  24. PCON=0x00;//各工作方式波特率加倍
  25. TH1=0xfD;//9600bps@11.0592
  26. TL1=0xfD;
  27. TR1=1; //定時(shí)器1中斷打開
  28. EA=1;//cpu總中斷允許位,1為開放中斷
  29. ES=1;// 1允許串行口中斷
  30. }

  31. void main()
  32. {
  33.         uchar m=0;
  34.         init();
  35.   while(1)
  36.         {
  37.          EA=0;//關(guān)中斷
  38.         
  39.          for(i=0;i<8;i++)
  40.                 {
  41.                   SBUF=send[i];//發(fā)送數(shù)據(jù)
  42.                         while(TI==0);
  43.       {
  44.                                          }                        //數(shù)據(jù)發(fā)送結(jié)束時(shí)TI自動(dòng)置1
  45.                         TI=0;        
  46.                 }
  47.                 EA=1;//開中斷
  48.                 delay(1000);        
  49.   }
  50. }

  51. void UART_1() interrupt 4
  52. {
  53.                 RI=0; //RI置0
  54.           rec[num]=SBUF;        
  55.         if(rec[0]==0x01)
  56.                 {
  57.        num++;
  58.                          if(num>=9)
  59.                          {
  60.                                  num=0;
  61.                          }
  62.                 }
  63. }
復(fù)制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:213173 發(fā)表于 2020-12-28 18:08 | 只看該作者
串口這點(diǎn)事學(xué)習(xí)一兩天就能搞定,你搞了一個(gè)多月還沒有搞定?測(cè)試串口功能只發(fā)不收不必開中斷。

  1. #include <stc12c5a.h>
  2. //#include <stdio.h>
  3. //#include <string.h>
  4. //#include <stdlib.h>
  5. //#include <math.h>
  6. //#include <intrins.h>
  7. #define uchar unsigned char
  8. #define uint  unsigned int

  9. uchar rec[9];//接收
  10. uchar send[8]={0x01,0x03,0x00,0x00,0x00,0x02,0xC4,0x0B};//發(fā)送數(shù)據(jù)
  11. uchar num=0;
  12. int i;
  13. void delay(uint z)//延時(shí)函數(shù)
  14. {
  15.         uint x,y;
  16.         for(x=z;x>0;x--);
  17.                 for(y=110;y>0;y--);
  18. }


  19. void init()  //系統(tǒng)初始化
  20. {
  21. TMOD|=0X20;//定時(shí)器T1,方式2,波特率由PCON寄存器的SMOD決定
  22. SCON=0x50; //REN RI TI,RI為0,TI為0
  23. //串行口1方式1 SCON是串行口1的串行控制寄存器,REN為1,允許接收
  24. PCON=0x00;//各工作方式波特率加倍
  25. TH1=0xfD;//9600bps@11.0592
  26. TL1=0xfD;
  27. TR1=1; //定時(shí)器1中斷打開
  28. // EA=1;//cpu總中斷允許位,1為開放中斷
  29. // ES=1;// 1允許串行口中斷
  30. }

  31. void main()
  32. {
  33. //        uchar m=0;
  34.         init();
  35.         while(1)
  36.         {
  37.                 EA=0;//關(guān)中斷       
  38.                 for(i=0;i<8;i++)
  39.                 {
  40.                         SBUF=send[i];//發(fā)送數(shù)據(jù)
  41.                         while(TI==0);//數(shù)據(jù)發(fā)送結(jié)束時(shí)TI自動(dòng)置1                       
  42.                         TI=0;        
  43.                 }
  44.                 EA=1;//開中斷
  45.                 delay(1000);        
  46.         }
  47. }
  48. /*       
  49. void UART_1() interrupt 4
  50. {
  51.         RI=0; //RI置0
  52.         rec[num]=SBUF;        
  53.         if(rec[0]==0x01)
  54.         {
  55.                 num++;
  56.                 if(num>=9)
  57.                 {
  58.                         num=0;
  59.                 }
  60.         }
  61. }*/
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

板凳
ID:267719 發(fā)表于 2020-12-28 18:22 | 只看該作者
上位機(jī)偶校驗(yàn),那串口配置就要用方式2
回復(fù)

使用道具 舉報(bào)

地板
ID:867594 發(fā)表于 2020-12-28 22:51 | 只看該作者
老哥,串口助手點(diǎn)擊那個(gè)文本模式,hex模式看不懂的
回復(fù)

使用道具 舉報(bào)

5#
ID:796670 發(fā)表于 2020-12-29 08:10 | 只看該作者
wulin 發(fā)表于 2020-12-28 18:08
串口這點(diǎn)事學(xué)習(xí)一兩天就能搞定,你搞了一個(gè)多月還沒有搞定?測(cè)試串口功能只發(fā)不收不必開中斷。

謝謝老哥指點(diǎn),謝謝指點(diǎn),小弟我再回去好好想想
回復(fù)

使用道具 舉報(bào)

6#
ID:814525 發(fā)表于 2020-12-29 08:43 | 只看該作者
把寄存器PCON修改為         PCON &= 0x7F;                //波特率不倍速
通常是不加倍的。
回復(fù)

使用道具 舉報(bào)

7#
ID:168857 發(fā)表于 2020-12-29 08:56 | 只看該作者
直接找個(gè)例程移植啊,不要糾結(jié)這些小玩意
回復(fù)

使用道具 舉報(bào)

8#
ID:869964 發(fā)表于 2020-12-29 09:01 | 只看該作者
用仿真器一步一步調(diào)試,寄存器配置要按照單片機(jī)數(shù)據(jù)手冊(cè)配置好了才行
回復(fù)

使用道具 舉報(bào)

9#
ID:390416 發(fā)表于 2020-12-29 09:51 | 只看該作者
#include "all.h"
bit Uart1_Flag=1;
u8 code Uart1_Up_Symbol_Buffer[30]={"\r\n溫度:  遙控解碼:  超聲波:mm"};
u8 xdata Uart1_Up_Num_Buffer[10];
void Uart1_Init()
{
        SM0=0;
        SM1=1;
        REN=1;
        //SCON|=0x50;
       
        PCON&=0x3f;
        AUXR|=0x01;
        AUXR|=0X14;
        T2H=0xfc;
        T2L=0xf3;
        ES=1;
}


void Uart1_Up_Data_Drive()
{
        static u8 xdata count=0;
        if(Uart1_Flag)
        {
                Uart1_Flag=0;
                count++;
                switch(count)
                {
                        case 1 : SBUF=Uart1_Up_Symbol_Buffer[0];break;
                        case 2 : SBUF=Uart1_Up_Symbol_Buffer[1];break;
                        case 3 : SBUF=Uart1_Up_Symbol_Buffer[2];break;
                        case 4 : SBUF=Uart1_Up_Symbol_Buffer[3];break;
                        case 5 : SBUF=Uart1_Up_Symbol_Buffer[4];break;
                        case 6 : SBUF=Uart1_Up_Symbol_Buffer[5];break;
                        case 7 : SBUF=Uart1_Up_Symbol_Buffer[6];break;
                        case 8 : SBUF=Uart1_Up_Num_Buffer[0];break;
                        case 9 : SBUF=Uart1_Up_Num_Buffer[1];break;
                        case 10 :SBUF=Uart1_Up_Num_Buffer[2];break;
                        case 11 :SBUF=Uart1_Up_Num_Buffer[3];break;
                       
                        case 12 : SBUF=Uart1_Up_Symbol_Buffer[7];break;
                        case 13 : SBUF=Uart1_Up_Symbol_Buffer[8];break;
                        case 14 : SBUF=Uart1_Up_Symbol_Buffer[9];break;
                        case 15 : SBUF=Uart1_Up_Symbol_Buffer[10];break;
                        case 16 : SBUF=Uart1_Up_Symbol_Buffer[11];break;
                        case 17 : SBUF=Uart1_Up_Symbol_Buffer[12];break;
                        case 18 : SBUF=Uart1_Up_Symbol_Buffer[13];break;
                        case 19 : SBUF=Uart1_Up_Symbol_Buffer[14];break;
                        case 20 : SBUF=Uart1_Up_Symbol_Buffer[15];break;
                        case 21 : SBUF=Uart1_Up_Symbol_Buffer[16];break;
                        case 22 : SBUF=Uart1_Up_Symbol_Buffer[17];break;
                        case 23 : SBUF=Uart1_Up_Num_Buffer[5];break;
                        case 24 : SBUF=Uart1_Up_Num_Buffer[6];break;
                       
                        case 25 : SBUF=Uart1_Up_Symbol_Buffer[18];break;
                        case 26 : SBUF=Uart1_Up_Symbol_Buffer[19];break;
                        case 27 : SBUF=Uart1_Up_Symbol_Buffer[20];break;
                        case 28 : SBUF=Uart1_Up_Symbol_Buffer[21];break;
                        case 29 : SBUF=Uart1_Up_Symbol_Buffer[22];break;
                        case 30 : SBUF=Uart1_Up_Symbol_Buffer[23];break;
                        case 31 : SBUF=Uart1_Up_Symbol_Buffer[24];break;
                        case 32 : SBUF=Uart1_Up_Symbol_Buffer[25];break;
                        case 33 : SBUF=Uart1_Up_Symbol_Buffer[26];break;
                        case 34 : SBUF=Uart1_Up_Num_Buffer[7];break;
                        case 35 : SBUF=Uart1_Up_Num_Buffer[8];break;
                        case 36 : SBUF=Uart1_Up_Num_Buffer[9];break;
                        case 37 : SBUF=Uart1_Up_Symbol_Buffer[27];break;
                        case 38 : SBUF=Uart1_Up_Symbol_Buffer[28];break;
                        case 39 :count=0;break;
                }
        }
}

void Uart1_Routine() interrupt 4
{
        static char Uart1_ser_n=0;
        if(RI)
        {
                RI=0;
                Uart1_Flag=1;
                if(SBUF==0x7f)//9600波特率
                {
                        Uart1_ser_n++;
                        if(Uart1_ser_n>=10)
                        {
                                Uart1_ser_n=0;
                                IAP_CONTR|=0xe0;
                        }
                }
        }
        if(TI)
        {
                TI=0;
                Uart1_Flag=1;
                Uart1_Up_Data_Drive();
        }
}

一、以上代碼是STC15W的,可能需要修改定時(shí)器參數(shù)。
二、主函數(shù)while大循環(huán)前面初始化IO口和Uart1_Init();
三、主函數(shù)每間隔大約500ms 執(zhí)行一次Uart1_Up_Data_Drive();這個(gè)函數(shù),確保數(shù)據(jù)能夠發(fā)送。
四、串口通信,電腦發(fā)送一個(gè)字節(jié)。才能讓單片機(jī)發(fā)送。
五、接收端波特率要正確,文本模式接收才能顯示漢字。
六、以上代碼由《人人學(xué)會(huì)單片機(jī)》視頻教程原創(chuàng),也就是我本人原創(chuàng),引用請(qǐng)備注代碼出處。
回復(fù)

使用道具 舉報(bào)

10#
ID:866834 發(fā)表于 2020-12-29 10:42 | 只看該作者
仿真器一步一步調(diào)試啊
回復(fù)

使用道具 舉報(bào)

11#
ID:95703 發(fā)表于 2020-12-29 16:07 | 只看該作者
波特率不對(duì)吧
回復(fù)

使用道具 舉報(bào)

12#
ID:241128 發(fā)表于 2022-4-18 19:43 | 只看該作者
11樓說出了正解,鑒定完畢
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表