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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3770|回復: 14
收起左側

單片機串口接收數據,程序不按照定義的模式發送,借助串口助手上顯示的也僅僅是發送

[復制鏈接]
ID:237942 發表于 2017-10-24 17:03 | 顯示全部樓層 |閱讀模式
51單片機串口接收數據,但是程序不按照定義的模式發送,借助串口助手上顯示的也僅僅是發送
#include <reg51.h>
typedef unsigned char u8;
typedef unsigned int u16;
u8 rec_buf[4];
u8 code str1[]={0x23,0x01,0x04,0x00,0x00,0x00,0x01,0x23};  
u8 code str2[]={0x23,0x01,0x04,0x00,0x00,0x00,0x02,0x23};
u8 code str3[]={0x23,0x01,0x04,0x00,0x00,0x00,0x03,0x23};
u8 code str4[]={0x23,0x01,0x04,0x00,0x00,0x00,0x04,0x23};
sbit led1=P0^0;
sbit led2=P0^1;
u16 m=3;
void InitUART(void)
{
    TMOD = 0x20;
    SCON = 0x50;
    TH1 = 0xFA;
    TL1 = TH1;
    PCON = 0x80;
    EA = 1;
    ES = 1;
    TR1 = 1;
}

void SendOneByte(unsigned char c)
{
    SBUF = c;
    while(!TI);
    TI = 0;
}
void main(void)
{
    InitUART();
}

void UARTInterrupt(void) interrupt 4
{
    if(RI)
    {
        RI = 0;
                          rec_buf[4]=SBUF;
                           if(rec_buf[m]==06)
                                         {
                                                 SendOneByte(str1);
           }
          else if(rec_buf[m]==19)
                                         {
                                                 SendOneByte(str2);
           }
            else if(rec_buf[m]==9)
                                         {
                                                 SendOneByte(str3);
           }
                                          else
                                                {
                                                        SendOneByte(str4);
                                                }
    }
    else
        TI = 0;
}

回復

使用道具 舉報

ID:7485 發表于 2017-10-24 20:59 | 顯示全部樓層
“51單片機串口接收數據,但是程序不按照定義的模式發送,借助串口助手上顯示的也僅僅是發送”
看不明白,能說得清楚點嗎?
回復

使用道具 舉報

ID:237942 發表于 2017-10-25 09:30 | 顯示全部樓層
我定義了4個數組(1,2,3,4)保存協議幀, 另外定義的四個數組(5,6,7,8)保存要使用的數據幀。當單片機接收的協議是(1,2,3,4)這四個數組中的任意一組時,單片機識別到對應的(5,6,7,8)中的任意一組協議,然后輸出出來。現在問題是我無論輸入什么,串口助手輸出的數據都是我輸入的數據。 我想是不是程序哪里出問題了, 還麻煩大家幫忙檢查一下,給點意見。 謝謝!

評分

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

查看全部評分

回復

使用道具 舉報

ID:213173 發表于 2017-10-25 10:40 | 顯示全部樓層
本帖最后由 wulin 于 2017-10-25 11:26 編輯

你定義了緩存數組u8 rec_buf[4];使用范圍只能是8位數據0~3,你定義了u16 m=3;,那么if(rec_buf[m]==06),這里數據類型不一致,而且接收到的數據被保存在一個不存在的位置rec_buf[4]=SBUF;。如果要發送數組內全部元素需要用循環
void UARTInterrupt() interrupt 4
{
        u8 i;
        if(RI)
        {
                RI = 0;
                rec_buf[3]=SBUF;
                if(rec_buf[m]==06)
                {
                        for(i=0;i<8;i++)
                        SendOneByte(str1);
                }

          ...........
          ...........

評分

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

查看全部評分

回復

使用道具 舉報

ID:237942 發表于 2017-10-25 11:16 | 顯示全部樓層
rec_buf[4]不存在么? 這個不是我定義的可以放4個數的數組么,這一點我覺得沒問題。比如我要收的為{0x7E,0x41,0x06,0x0D}  {0x7E,0x41,0x19,0x0D} {0x7E,0x41,0x09,0x0D} {0x7E,0x41,0x03,0x0D},當查詢到數組第三個數時,然后對應發送與之對應的數據 {0x23,0x01,0x04,0x00,0x00,0x00,0x01,0x23}   {0x23,0x01,0x04,0x00,0x00,0x00,0x02,0x23}   {0x23,0x01,0x04,0x00,0x00,0x00,0x03,0x23}   {0x23,0x01,0x04,0x00,0x00,0x00,0x04,0x23}  請問一下,具體我應該怎么修改
回復

使用道具 舉報

ID:237942 發表于 2017-10-25 11:20 | 顯示全部樓層
還有一點問題,8位數據0~3是指什么? 我的每一個數據都是16進制,應該定義成int類型的么,這4位數能放4個16進制的數么
回復

使用道具 舉報

ID:213173 發表于 2017-10-25 11:49 | 顯示全部樓層
本帖最后由 wulin 于 2017-10-25 12:08 編輯
GG276192978 發表于 2017-10-25 11:20
還有一點問題,8位數據0~3是指什么? 我的每一個數據都是16進制,應該定義成int類型的么,這4位數能放4個16 ...

你定義了緩存數組u8 rec_buf[4];就是這個數組有4個元素,使用時只能指定0~3,每個元素是8位2進制數0x00~0xff。如果要同時得到4個8位數字,要分4次中斷接收并存入緩存。見樓上回傳數據示例。

評分

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

查看全部評分

回復

使用道具 舉報

ID:213173 發表于 2017-10-25 11:54 | 顯示全部樓層
GG276192978 發表于 2017-10-25 11:20
還有一點問題,8位數據0~3是指什么? 我的每一個數據都是16進制,應該定義成int類型的么,這4位數能放4個16 ...

無標題.jpg 這是回傳數組str1
回復

使用道具 舉報

ID:213173 發表于 2017-10-25 12:17 | 顯示全部樓層
GG276192978 發表于 2017-10-25 11:20
還有一點問題,8位數據0~3是指什么? 我的每一個數據都是16進制,應該定義成int類型的么,這4位數能放4個16 ...

void UARTInterrupt() interrupt 4
{
        RI=0;
        rec_buf[ i]=SBUF;
        i++;
        if(i>=4)
        {
                i=0;        
                flag=1;//接收完成標志置1
                //其他運算放到主程序
        }
}

回復

使用道具 舉報

ID:237942 發表于 2017-10-26 15:36 | 顯示全部樓層
wulin 發表于 2017-10-25 12:17
void UARTInterrupt() interrupt 4
{
        RI=0;

你說的邏輯挺對的,我也按照你說的改了,但是修改后的程序的效果并不理想,串口助手接收的數據也沒有了。 下面是我按照你所講的修改的程序
  1. #include <reg51.h>
  2. typedef unsigned char u8;
  3. typedef unsigned int u16;
  4. u16 i;
  5. u8 rec_buf[4]={0,0,0,0};
  6. u8 code str1[]={0x23,0x01,0x04,0x00,0x00,0x00,0x01,0x23};  //¶¨òåËÄ×éμÆ1aD-òé
  7. u8 code str2[]={0x23,0x01,0x04,0x00,0x00,0x00,0x02,0x23};
  8. u8 code str3[]={0x23,0x01,0x04,0x00,0x00,0x00,0x03,0x23};
  9. u8 code str4[]={0x23,0x01,0x04,0x00,0x00,0x00,0x04,0x23};

  10. u8 code table1[4]={0x7E,0x41,0x06,0x0D};       //¶¨òåËÄ×éμã¸èÏμí3D-òé
  11. u8 code table2[4]={0x7E,0x41,0x19,0x0D};
  12. u8 code table3[4]={0x7E,0x41,0x09,0x0D};
  13. u8 code table4[4]={0x7E,0x41,0x03,0x0D};

  14. void InitUART(void)
  15. {
  16.     TMOD = 0x20;  //¶¨ê±Æ÷1¤×÷·½ê½2
  17.     SCON = 0x50; // ′®¿ú1¤×÷·½ê½1£¬ÔêDí½óêÕ
  18.     TH1 = 0xFA;
  19.     TL1 = TH1;
  20.     PCON = 0x80;  //2¨ìØÂê±¶Ôö
  21.     EA = 1;
  22.     ES = 1;
  23.     TR1 = 1;
  24. }

  25. void SendOneByte(unsigned char c)
  26. {
  27.     SBUF = c;
  28.     while(!TI);
  29.     TI = 0;
  30. }

  31. void main(void)
  32. {
  33.   InitUART();
  34.         if(rec_buf[4]==table1[4])
  35.                  {
  36.                          for(i=0;str1[i]!='\0';i++)
  37.                                         {
  38.                                                 SendOneByte(str1[i]);
  39.                                                 }
  40.            }
  41.           else if(rec_buf[4]==table2[4])
  42.                                          {
  43.                                                  for(i=0;str2[i]!='\0';i++)
  44.                                                 {
  45.                                                         SendOneByte(str2[i]);
  46.                                                 }
  47.            }
  48.            else if(rec_buf[4]==table3[4])
  49.                                          {
  50.                                                  for(i=0;str3[i]!='\0';i++)
  51.                                                 {
  52.                                                         SendOneByte(str3[i]);
  53.                                                 }
  54.            }
  55.                                           else
  56.                                                 {
  57.                                                         for(i=0;str4[i]!='\0';i++)
  58.                                                         {
  59.                                                         SendOneByte(str4[i]);
  60.                                                         }
  61.             }
  62.         while(1)
  63.         {
  64. }        
  65. }

  66. void UARTInterrupt(void) interrupt 4
  67. {
  68.     int j;
  69.            if(RI)
  70.         {
  71.                                         for(j=0;j<4;j++ )
  72.                              rec_buf[j]=SBUF;
  73.                                                 RI = 0;
  74.     }
  75.     else
  76.         TI = 0;
  77. }
復制代碼
回復

使用道具 舉報

ID:237942 發表于 2017-10-26 15:57 | 顯示全部樓層
我改好程序但不運行后,在匯編下看到是這個現象。 程序一直在R0和A之間循環
回復

使用道具 舉報

ID:237942 發表于 2017-10-26 15:59 | 顯示全部樓層
wulin 發表于 2017-10-25 11:54
這是回傳數組str1

回傳數組str1? 是翻譯成hex文件的6么?
回復

使用道具 舉報

ID:213173 發表于 2017-10-26 20:24 | 顯示全部樓層
無標題.jpg
你的主函數這樣寫根本就跑不起來,不斷重復初始化定時器,怎么能正常呢?
根據你的描述,給你大改動,程序運行正常,是不是完全是你想要的功能不得而知。
用串口助手分別發送4組數字:
7E 41 06 0D
7E 41 19 0D
7E 41 09 0D
7E 41 03 0D
回傳接收分別為4組數字:
23 01 04 00 00 00 01 23
23 01 04 00 00 00 02 23
23 01 04 00 00 00 03 23
23 01 04 00 00 00 04 23
  1. /************************************/
  2. #include <reg51.h>
  3. typedef unsigned char u8;
  4. typedef unsigned int u16;
  5. u8 rec_buf[4];
  6. u8 code str1[]={0x23,0x01,0x04,0x00,0x00,0x00,0x01,0x23};  
  7. u8 code str2[]={0x23,0x01,0x04,0x00,0x00,0x00,0x02,0x23};
  8. u8 code str3[]={0x23,0x01,0x04,0x00,0x00,0x00,0x03,0x23};
  9. u8 code str4[]={0x23,0x01,0x04,0x00,0x00,0x00,0x04,0x23};
  10. sbit led1=P0^0;
  11. sbit led2=P0^1;
  12. u8 m=2;
  13. u8 i=0;
  14. bit flag=0;
  15. void InitUART()
  16. {
  17.     TMOD = 0x20;
  18.     SCON = 0x50;
  19.     TH1 = 0xFA;
  20.     TL1 = TH1;
  21.     PCON = 0x80;
  22.     EA = 1;
  23.     ES = 1;
  24.     TR1 = 1;
  25. }

  26. void SendOneByte(u8 c)
  27. {
  28.     SBUF = c;
  29.     while(!TI);
  30.     TI = 0;
  31. }
  32. void main()
  33. {
  34.         u8 i;
  35.         InitUART();
  36.         while(1)
  37.         {
  38.                 if(flag==1)
  39.                 {
  40.                         ES=0;                //關串口中斷
  41.                         flag=0;
  42.                         if(rec_buf[m]==6)
  43.                         {
  44.                                 for(i=0;i<8;i++)
  45.                                 SendOneByte(str1[i]);
  46.                         }
  47.                         else if(rec_buf[m]==25)//0x19
  48.                         {
  49.                                 for(i=0;i<8;i++)
  50.                                 SendOneByte(str2[i]);
  51.                         }
  52.                         else if(rec_buf[m]==9)
  53.                         {
  54.                                 for(i=0;i<8;i++)
  55.                                 SendOneByte(str3[i]);
  56.                         }
  57.                         else
  58.                         {
  59.                                 for(i=0;i<8;i++)
  60.                                 SendOneByte(str4[i]);
  61.                         }
  62.                         ES=1;                //開串口中斷
  63.                 }
  64.         }
  65. }

  66. void UARTInterrupt() interrupt 4
  67. {
  68.         RI=0;
  69.         rec_buf[i]=SBUF;
  70.         i++;
  71.         if(i>=4)
  72.         {
  73.                 i=0;        
  74.                 flag=1;//接收完成標志置1
  75.                 //其他運算放到主程序
  76.         }
  77. }
復制代碼



回復

使用道具 舉報

ID:237942 發表于 2017-11-27 09:27 | 顯示全部樓層
多謝大神,我上面的函數怎么會一直在初始化里跳不出來呢 ?
還想問一點,rec_buf[m]==25這里我不是應該寫成rec_buf[m]==19么嗎
回復

使用道具 舉報

ID:213173 發表于 2017-11-27 10:37 | 顯示全部樓層
GG276192978 發表于 2017-11-27 09:27
多謝大神,我上面的函數怎么會一直在初始化里跳不出來呢 ?
還想問一點,rec_buf[m]==25這里我不是應該寫 ...

1.你的main函數結構不對。初始化程序要放在主循環外。例如:
void main(void)
{
        InitUART();
        while (1)
        {
                //需要執行的任務
        }
}
2.串口助手發送19是16進制0x19,解析時可以寫10進制25或16進制0x19。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕1区2区 | 国产良家自拍 | 99av成人精品国语自产拍 | 久久久噜噜噜久久中文字幕色伊伊 | 日本一区二区三区视频在线 | 国产精品观看 | 国产乱码精品一区二区三区五月婷 | 国产精品久久久久久久久久久久 | 欧美区精品 | 91久久国产综合久久 | 国产精品1区2区 | 国产精品美女一区二区 | 午夜网 | 成人福利网 | 一区视频| 久久99精品久久久久久噜噜 | 日日夜夜精品视频 | 精品国产一区二区三区久久 | 亚洲视频在线观看 | 一级欧美一级日韩片免费观看 | 久久久高清 | 国产 欧美 日韩 一区 | 国产精品99视频 | 欧美a级成人淫片免费看 | 色网站入口 | 777毛片| 国产高清视频 | 亚洲av毛片| 久久99深爱久久99精品 | 国产高清视频在线观看播放 | xxx国产精品视频 | 久久精品国产99国产精品 | 日本黄色短片 | 久久免费视频观看 | 成人福利电影 | 成人av片在线观看 | 欧美成人一区二区三区 | 色资源在线 | 成人在线免费观看 | 四虎成人免费电影 | 九九综合|