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

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

QQ登錄

只需一步,快速開始

搜索
查看: 3883|回復(fù): 14
收起左側(cè)

單片機(jī)串口接收數(shù)據(jù),程序不按照定義的模式發(fā)送,借助串口助手上顯示的也僅僅是發(fā)送

[復(fù)制鏈接]
ID:237942 發(fā)表于 2017-10-24 17:03 | 顯示全部樓層 |閱讀模式
51單片機(jī)串口接收數(shù)據(jù),但是程序不按照定義的模式發(fā)送,借助串口助手上顯示的也僅僅是發(fā)送
#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;
}

回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

ID:237942 發(fā)表于 2017-10-25 09:30 | 顯示全部樓層
我定義了4個(gè)數(shù)組(1,2,3,4)保存協(xié)議幀, 另外定義的四個(gè)數(shù)組(5,6,7,8)保存要使用的數(shù)據(jù)幀。當(dāng)單片機(jī)接收的協(xié)議是(1,2,3,4)這四個(gè)數(shù)組中的任意一組時(shí),單片機(jī)識(shí)別到對(duì)應(yīng)的(5,6,7,8)中的任意一組協(xié)議,然后輸出出來,F(xiàn)在問題是我無論輸入什么,串口助手輸出的數(shù)據(jù)都是我輸入的數(shù)據(jù)。 我想是不是程序哪里出問題了, 還麻煩大家?guī)兔z查一下,給點(diǎn)意見。 謝謝!

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

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

你定義了緩存數(shù)組u8 rec_buf[4];使用范圍只能是8位數(shù)據(jù)0~3,你定義了u16 m=3;,那么if(rec_buf[m]==06),這里數(shù)據(jù)類型不一致,而且接收到的數(shù)據(jù)被保存在一個(gè)不存在的位置rec_buf[4]=SBUF;。如果要發(fā)送數(shù)組內(nèi)全部元素需要用循環(huán)
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);
                }

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

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:237942 發(fā)表于 2017-10-25 11:16 | 顯示全部樓層
rec_buf[4]不存在么? 這個(gè)不是我定義的可以放4個(gè)數(shù)的數(shù)組么,這一點(diǎn)我覺得沒問題。比如我要收的為{0x7E,0x41,0x06,0x0D}  {0x7E,0x41,0x19,0x0D} {0x7E,0x41,0x09,0x0D} {0x7E,0x41,0x03,0x0D},當(dāng)查詢到數(shù)組第三個(gè)數(shù)時(shí),然后對(duì)應(yīng)發(fā)送與之對(duì)應(yīng)的數(shù)據(jù) {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}  請(qǐng)問一下,具體我應(yīng)該怎么修改
回復(fù)

使用道具 舉報(bào)

ID:237942 發(fā)表于 2017-10-25 11:20 | 顯示全部樓層
還有一點(diǎn)問題,8位數(shù)據(jù)0~3是指什么? 我的每一個(gè)數(shù)據(jù)都是16進(jìn)制,應(yīng)該定義成int類型的么,這4位數(shù)能放4個(gè)16進(jìn)制的數(shù)么
回復(fù)

使用道具 舉報(bào)

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

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

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2017-10-25 11:54 | 顯示全部樓層
GG276192978 發(fā)表于 2017-10-25 11:20
還有一點(diǎn)問題,8位數(shù)據(jù)0~3是指什么? 我的每一個(gè)數(shù)據(jù)都是16進(jìn)制,應(yīng)該定義成int類型的么,這4位數(shù)能放4個(gè)16 ...

無標(biāo)題.jpg 這是回傳數(shù)組str1
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2017-10-25 12:17 | 顯示全部樓層
GG276192978 發(fā)表于 2017-10-25 11:20
還有一點(diǎn)問題,8位數(shù)據(jù)0~3是指什么? 我的每一個(gè)數(shù)據(jù)都是16進(jìn)制,應(yīng)該定義成int類型的么,這4位數(shù)能放4個(gè)16 ...

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

回復(fù)

使用道具 舉報(bào)

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

你說的邏輯挺對(duì)的,我也按照你說的改了,但是修改后的程序的效果并不理想,串口助手接收的數(shù)據(jù)也沒有了。 下面是我按照你所講的修改的程序
  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. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

回傳數(shù)組str1? 是翻譯成hex文件的6么?
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2017-10-26 20:24 | 顯示全部樓層
無標(biāo)題.jpg
你的主函數(shù)這樣寫根本就跑不起來,不斷重復(fù)初始化定時(shí)器,怎么能正常呢?
根據(jù)你的描述,給你大改動(dòng),程序運(yùn)行正常,是不是完全是你想要的功能不得而知。
用串口助手分別發(fā)送4組數(shù)字:
7E 41 06 0D
7E 41 19 0D
7E 41 09 0D
7E 41 03 0D
回傳接收分別為4組數(shù)字:
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;                //關(guān)串口中斷
  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;//接收完成標(biāo)志置1
  75.                 //其他運(yùn)算放到主程序
  76.         }
  77. }
復(fù)制代碼



回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

1.你的main函數(shù)結(jié)構(gòu)不對(duì)。初始化程序要放在主循環(huán)外。例如:
void main(void)
{
        InitUART();
        while (1)
        {
                //需要執(zhí)行的任務(wù)
        }
}
2.串口助手發(fā)送19是16進(jìn)制0x19,解析時(shí)可以寫10進(jìn)制25或16進(jìn)制0x19。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产免费一二三区 | 国产精品成人一区二区三区夜夜夜 | 中文福利视频 | 伊人色综合久久久天天蜜桃 | 亚洲精品乱码久久久久久蜜桃91 | 国产一区二区电影 | 91www在线观看 | 国产资源在线观看 | 国产精品视频二区三区 | 精品国产乱码久久久久久1区2区 | 日韩亚洲视频 | 91精品国产综合久久久久久 | 麻豆精品国产91久久久久久 | 精品粉嫩超白一线天av | 狠狠干天天干 | 在线亚洲一区二区 | 久久久99国产精品免费 | 欧美一区二区三区一在线观看 | 久久久久久久久久久久久久国产 | 一级毛片网 | 午夜天堂精品久久久久 | 久久最新 | 久久久久久九九九九 | 成人精品国产一区二区4080 | 黑人巨大精品欧美一区二区一视频 | 欧美一区二区三区在线看 | 日日操操| 黄a免费网络 | 亚洲成人精 | 毛片在线看看 | 午夜免费福利片 | 国产激情视频网 | 激情一区二区三区 | 国产精品久久久久久久久久三级 | 中文字幕在线一区二区三区 | 亚洲高清成人 | www成年人视频 | 欧美一级二级视频 | 99色综合 | 亚洲一区二区三区免费在线观看 | 欧美福利在线 |