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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3801|回復: 14
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
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;
}

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

使用道具 舉報

沙發
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 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

5#
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}  請問一下,具體我應該怎么修改
回復

使用道具 舉報

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

使用道具 舉報

7#
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 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

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

這是回傳數組str1
回復

使用道具 舉報

9#
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
                //其他運算放到主程序
        }
}

回復

使用道具 舉報

10#
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. }
復制代碼
回復

使用道具 舉報

11#
ID:237942 發表于 2017-10-26 15:57 | 只看該作者
我改好程序但不運行后,在匯編下看到是這個現象。 程序一直在R0和A之間循環
回復

使用道具 舉報

12#
ID:237942 發表于 2017-10-26 15:59 | 只看該作者
wulin 發表于 2017-10-25 11:54
這是回傳數組str1

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

使用道具 舉報

13#
ID:213173 發表于 2017-10-26 20:24 | 只看該作者

你的主函數這樣寫根本就跑不起來,不斷重復初始化定時器,怎么能正常呢?
根據你的描述,給你大改動,程序運行正常,是不是完全是你想要的功能不得而知。
用串口助手分別發送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. }
復制代碼



回復

使用道具 舉報

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

使用道具 舉報

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品欧美 | 国产精品网页 | 国产欧美精品在线观看 | 免费久久视频 | 午夜精品视频 | 免费看黄色视屏 | 狠狠涩 | 中文字幕日韩一区 | 中文字幕人成乱码在线观看 | 亚洲乱码国产乱码精品精98午夜 | 亚洲成人av在线播放 | 亚洲一区久久久 | 在线中文视频 | 精品国产一区二区在线 | www.成人在线视频 | 国产福利在线看 | 欧美另类视频 | 欧美一级久久 | 成人免费看片 | 国产成人精品一区二区三区网站观看 | 日本成人在线播放 | 91精品国产综合久久久久 | 黄色在线播放视频 | 在线成人免费视频 | 亚洲网在线 | 日韩成人在线视频 | 国产黑丝av| 亚洲精品电影网在线观看 | 中文字幕在线观看一区二区 | 波多野吉衣在线播放 | 蜜桃传媒av| 日韩久久久久久 | 欧美一级特黄aaa大片在线观看 | 最新国产视频 | 啪啪av | 极品粉嫩国产48尤物在线播放 | 久久亚洲精品国产精品紫薇 | 亚洲逼院| 日本在线视频一区二区 | 亚洲综合精品 | 一区在线视频 |