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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

關于單片機串口接收一幀數據,收不到數據

[復制鏈接]
跳轉到指定樓層
樓主
兩個單片機通過串口相互通信,一個單片機不停向另一個單片機傳送數據,

發送數據的單片機:

oid Usart_Int(uint32_t BaudRatePrescaler)
{
         SCON  = 0x50;//1位起始位,8位數據位,1位停止位,異步,使能接收
         TMOD |= 0x20;//定時器1,工作方式2,8位自動重裝計數值
        //例9600,28800/9600=3,TH1=253=FD;
     TH1   =256-(28800/BaudRatePrescaler);
         TL1   =256-(28800/BaudRatePrescaler);
     TCON |=0x40;//啟動定時器1
         IE   |=0x90;//打開串口中斷,MCU總中斷
}
//發送一個字節
uint8_t send_ok=0,Receive_ok=0,TEMP_data[9]={0};
void USART_send_byte(uint8_t Tx_data)
{
        while(send_ok);//等待發送緩存為空
         SBUF = Tx_data;
        send_ok=1;//緩存標志置1
}
//發送Length-1個數據+1個數據累加和
void USART_Send(uint8_t *Buffer, uint8_t Length)
{
        uint8_t i=0;
        while(i<Length)
        {
                if(i<(Length-1))
                Buffer[Length-1]+=Buffer;
                USART_send_byte(Buffer[i++]);
        }
}
//發送一幀數據
void send_out(int16_t *Data,uint8_t length,uint8_t send)
{
        uint8_t TX_DATA[13],i=0,k=0;
        memset(TX_DATA,0,(2*length+5));//清空發送數據
        TX_DATA[i++]=0X5A;//幀頭
        TX_DATA[i++]=0X5A;//幀頭
        TX_DATA[i++]=send;//功能字節
        TX_DATA[i++]=2*length;//數據個數
        for(k=0;k<length;k++)//存入數據到緩存TX_DATA數組
        {
                TX_DATA[i++]=(uint16_t)Data[k]>>8;
                TX_DATA[i++]=(uint16_t)Data[k];
        }
        USART_Send(TX_DATA,(2*length+5));//發送一幀數據        
}

模塊輸出格式,每幀包含 10 個字節(十六進制):
①.Byte0: 0x5A 幀頭標志
②.Byte1: 0x5A 幀頭標志
③.Byte2: 0X45 本幀數據類型( 0x45:溫度數據)
④.Byte3: 0x04 數據量(以下 4 個數據 2 組為例)
⑤.Byte4: 0x00~0xFF 數據 1 高 8 位
⑥.Byte5: 0x00~0xFF 數據 1 低 8 位
⑦.Byte6: 0x00~0xFF 數據 2 高 8 位
⑧.Byte7: 0x00~0xFF 數據 2 低 8 位
⑨.Byte8: 0x00~0xFF 校驗和(前面數據 Byte0-7 累加和, 僅留低 8 位)
⑩. Byte9: 0x01~0x15 ID 號,范圍 0x01~0x15 可以修改,默認是 0x14




我接收單片機是這樣的寫的,怎么就是收不到數據呢,大家幫我看看,
void Usart_Int(uint32_t BaudRatePrescaler)
{
         SCON  = 0x50;//1位起始位,8位數據位,1位停止位,異步,使能接收
         TMOD |= 0x20;//定時器1,工作方式2,8位自動重裝計數值
        //例9600,28800/9600=3,TH1=253=FD;
     TH1   =256-(28800/BaudRatePrescaler);
         TL1   =256-(28800/BaudRatePrescaler);
     TCON |=0x40;//啟動定時器1
         IE   |=0x90;//打開串口中斷,MCU總中斷
}

main(void)
{
        float TO=0,TA=0;
     u8 sum=0,i=0;
        int datas[2]={0};
        Usart_Int(9600);
        send_com(0x45);//發送讀方位角指令
         while(1)
        {
                if(Receive_ok)//串口接收完畢
                {
                        for(sum=0,i=0;i<(TEMP_data[3]+4);i++)//TEMP_data[3]=4
                        sum+=TEMP_data;
                        if(sum==TEMP_data)//校驗和判斷
                        {
                                TO=(float)((TEMP_data[4]<<8)|TEMP_data[5])/100;//得到真實溫度
                                TA=(float)((TEMP_data[6]<<8)|TEMP_data[7])/100;//得到真實溫度
                     LED = 1;//讓LED燈亮來判斷數據接收完整,//小燈一真沒亮過。不知道程序哪里不對,求解
                        }
                        Receive_ok=0;//處理數據完畢標志
                }
        }
}


void USART_IRQHandler(void)interrupt 4
{
        static uint8_t i=0,rebuf[9]={0};
        uint8_t sum=0;
    if(TI)//發送完成標志
        {
          TI=0;//清發送完成標志
          send_ok=0;//緩存標志置0
        }
        if(RI)//接收完成標志
        {
                rebuf[i++]=SBUF;
                RI=0;//清中斷接收標志
                if (rebuf[0]!=0x5a)//幀頭不對
                        i=0;        
                if ((i==2)&&(rebuf[1]!=0x5a))//幀頭不對
                        i=0;
        
        if(i>3)//i等于4時,已經接收到數據量字節rebuf[3]
                {
                        if(i!=(rebuf[3]+5))//判斷是否接收一幀數據完畢
                                return;        
                        switch(rebuf[2])//接收完畢后處理
                        {
                                case 0x45:
                                        if(!Receive_ok)//當數據處理完成后才接收新的數據
                                        {
                                                memcpy(TEMP_data,rebuf,9);//拷貝接收到的數據
                                                Receive_ok=1;//接收完成標志
                                        }
                                        break;
                                case 0x15:break;
                                case 0x35:break;
                        }
                        i=0;//緩存清0
                }
        
        }


}




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

使用道具 舉報

沙發
ID:152475 發表于 2016-12-6 10:24 | 只看該作者
你先自己試一下簡單的通信,你這樣就貼一大段代碼也不知道硬件有沒有問題,一步一步慢慢調試,代碼都是調出來的
回復

使用道具 舉報

板凳
ID:152524 發表于 2016-12-6 11:03 | 只看該作者
你先自己試一下簡單的通信,你這樣就貼一大段代碼也不知道硬件有沒有問題,一步一步慢慢調試,代碼都是調出來的
回復

使用道具 舉報

地板
ID:111634 發表于 2016-12-6 11:21 | 只看該作者
本帖最后由 zl2168 于 2016-12-6 11:29 編輯

實例77  雙機串行通信方式1


已知甲乙機以串行方式1進行數據傳送,fOSC=11.0592MHz,波特率為1200b/sSMOD=0。甲機發送16個數據(設為16進制數09AF的共陽字段碼),間隔1秒,發送后,輸出到P1口顯示;乙機接收后輸出到P2口顯示。

Proteus仿真一下,確認有效。
實例77 雙機通信方式1.rar (40.4 KB, 下載次數: 29)

以上摘自張志良編著80C51單片機仿真設計實例教程——基于Keil CProteus》清華大學出版社ISBN 978-7-302-41682-1,內有常用的單片機應用100案例,用于仿真實驗操作,電路與程序真實可靠可信可行書中電路和程序設計有詳細說明,程序語句條條有注解。

回復

使用道具 舉報

5#
ID:111634 發表于 2016-12-6 11:25 | 只看該作者
本帖最后由 zl2168 于 2016-12-6 11:27 編輯

實例78  雙機串行通信方式2


已知甲乙機以串行方式2進行數據傳送,fOSC=12MHz,SMOD=0,TB8/RB8作為奇偶校驗位。甲機每發送一幀數據(設為09共陽字段碼,存在外ROM中),同時在P1口顯示;用P2.7(驅動LED燈)顯示奇偶校驗位(10暗);接到乙機回復信號后,顯示暗0.5秒(作為幀間隔);然后發送下一數據,直至10個數據串送完畢;顯示再暗0.5秒(作為周期間隔),然后重新開始第二輪重復循環操作。乙機接收甲機發送的一幀數據后,送P2口顯示;用P1.1顯示第9位數據(10暗),用P1.0顯示接收數據的奇偶性(奇亮偶暗);并進行奇偶校驗,向甲機發送回復信號(00H表示校驗正確,FFH表示出錯)。若正確,甲機繼續串行發送(共10幀);若出錯,甲機再重發一遍,直至乙機發回正確回復信號。
Proteus仿真一下,確認有效。
實例78 雙機通信方式2.rar (46.57 KB, 下載次數: 19)

以上摘自張志良編著80C51單片機仿真設計實例教程——基于Keil CProteus》清華大學出版社ISBN 978-7-302-41682-1,內有常用的單片機應用100案例,用于仿真實驗操作,電路與程序真實可靠可信可行。書中電路和程序設計有詳細說明,程序語句條條有注解。
回復

使用道具 舉報

6#
ID:111634 發表于 2016-12-6 11:29 | 只看該作者
本帖最后由 zl2168 于 2016-12-6 11:36 編輯

實例79  雙機串行通信方式3
Proteus仿真一下,確認有效。
實例79 雙機通信方式3.rar (45.3 KB, 下載次數: 16)

以上摘自張志良編著80C51單片機仿真設計實例教程——基于Keil CProteus》清華大學出版社ISBN 978-7-302-41682-1,內有常用的單片機應用100案例,用于仿真實驗操作,電路與程序真實可靠可信可行。書中電路和程序設計有詳細說明,程序語句條條有注解。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产高清一区二区三区 | 在线a视频网站 | 久久亚洲国产精品 | 黄色av网站在线免费观看 | 精品亚洲一区二区三区 | 99视频在线免费观看 | 黄色毛片视频 | 又爽又黄axxx片免费观看 | 国产一区二区三区四区在线观看 | 亚洲一区二区精品视频在线观看 | 久久99久久| 日韩另类 | 亚洲成人黄色 | 亚洲一区二区三区在线 | 国产黄色在线 | 亚洲三区视频 | 日韩综合网| av在线免费播放 | 亚洲一区精品视频 | 亚洲a级 | 精品欧美一区二区久久久伦 | 久久精品16 | 男人天堂99 | 九九成人 | av黄色片在线观看 | 日本电影一区二区 | 免费看淫片 | 粉嫩粉嫩芽的虎白女18在线视频 | 在线视频国产一区 | 免费成人高清在线视频 | 日韩精品免费 | 欧美日本在线观看 | 日韩高清在线观看 | 亚洲欧美日韩中文在线 | 亚洲一区二区三区四区五区中文 | 蜜桃视频在线观看www社区 | 国产成人黄色 | 亚洲最大成人综合 | 亚洲欧美日韩电影 | 黄色成人在线网站 | 成人一区二区电影 |