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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機串口通訊問題求助 讀出來的數據總不對

[復制鏈接]
跳轉到指定樓層
樓主
ID:382944 發表于 2022-3-4 07:12 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
讀一個傳感器,串口通訊,讀出來的數據總不對
cpu stc9c52  晶振11.0592   
接口定義 URAT        

端口名
接口用途
端口 1
接電源負極 (-)
端口 2
接電源正極 (+)
端口 3
A( RX
端口 4
B( TX
通訊協議
波特率
9600bps
數據位
8
停止位
1
校驗位
串口數據流格式

B1
B2
B3
B4
B5
B6
模塊地址
TVOC 高
TVOC 低
滿量程高
滿量程低
校驗和
2Ch
   0XXh
    0XXh
    03h   
    0FFh
    0XXh

說明: B1 的內容 2Ch 是模塊固定地址。校驗和(B6)=unit_8(B1+B2+B3+B4+B5)
污染氣體濃度值(mg/m3)=(TVOC 濃度高(B2)*256+TVOC 濃度低(B3))


程序:
void uart_init(u8 baud)
{
        TMOD|=0X20;        //設置計數器工作方式2
        SCON=0X50;        //設置為工作方式1
        PCON=0X00;        
        TH1=0XFD;        //計數器初始值設置
        TL1=0XFD;
        ES=1;                //打開接收中斷
        EA=1;                //打開總中斷
        TR1=1;                //打開計數器               
}


void uart() interrupt 4 //串口通信中斷函數
{
        u8 rec_data;

        RI = 0;                        //清除接收中斷標志位
        rec_data=SBUF;        //存儲接收到的數據
         
        if (0x2c != rec_data)      --》這里0x2c是設備的地址,固定值,目前一直讀不到這個值 ,每次都能都出6個數值,但一直沒有0x2c
                {
                  
                        return;
                }
        uart_co2[uart_cou++]=rec_data;
        if (uart_cou == 6)
        {
                if(uart_co2[5]==uart_co2[0]+uart_co2[1]+uart_co2[2]+uart_co2[3]+uart_co2[4])
                                  temp_co2 = uart_co2[1]*256+uart_co2[2];
                 uart_cou = 0;
                 co2_ok = 1;
         }
         else
         {
                  uart_cou = 0;
         }                        
}

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

使用道具 舉報

沙發
ID:311903 發表于 2022-3-4 08:44 | 只看該作者
那你就看看這6個值,每次來一幀報文時,第一個字節是不是都是一樣的;
此外,你這個串口接收代碼邏輯不對,不應該每次都判斷是否為0x2c,不是就退出
回復

使用道具 舉報

板凳
ID:123289 發表于 2022-3-4 09:06 | 只看該作者
1、不要在【void uart() interrupt 4】進行數據處理。數據處理放在中斷外進行。
2、【void uart() interrupt 4】只管下載數據,且來者不拒,來一個收一個。建立一個緩沖區,收到這此數據。
這時處理的好處是:【void uart() interrupt 4】耗時最小,占用主程序的時間就少,卡機的可能性就小。
分析緩沖區中的數據,就能知道問題在哪里了,如果沒有問題,也不影響你計算目標值。
回復

使用道具 舉報

地板
ID:213173 發表于 2022-3-4 10:10 | 只看該作者
建議定義一個接收完成標志,接收與解析分開處理
  1. void uart() interrupt 4 //串口通信中斷函數
  2. {
  3.         static uchar i=0;        //靜態計數變量
  4.         RI=0;                                //接收中斷請求標志位清0
  5.         uart_co2[i]=SBUF;        //接收到的數據串保存在緩存數組
  6.         if(uart_co2[0]==0x2c)//驗證數據頭(起始位)否則被后續數據覆蓋
  7.         {
  8.                 i++;
  9.                 if(i>=6)
  10.                 {
  11.                         flag=1;                        //接收完成標志置1
  12.                         i=0;                        //計數變量清0
  13.                 }
  14.         }
  15. }

  16. void parsing()//解析函數放在主函數中調用
  17. {
  18.         uchar i;       
  19.         if(flag)
  20.         {
  21.                 flag=0;
  22.                 if(uart_co2[5]==uart_co2[0]+uart_co2[1]+uart_co2[2]+uart_co2[3]+uart_co2[4])//驗證
  23.                         temp_co2 = uart_co2[1]<<8|uart_co2[2];//獲取有效數據
  24.                 for(i=0;i<6;i++)
  25.                         uart_co2[i]=0;//清除緩存數組
  26.         }                     
  27. }
復制代碼
回復

使用道具 舉報

5#
ID:121859 發表于 2022-3-4 10:27 | 只看該作者
可能是波特率有問題,主從雙方不一致,或者波特率誤差較大所致,將晶振改為11.0592MHz試試。
回復

使用道具 舉報

6#
ID:382944 發表于 2022-6-17 23:33 | 只看該作者
wulin 發表于 2022-3-4 10:10
建議定義一個接收完成標志,接收與解析分開處理

感謝大神指點,問題已解決,波特率設置問題。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本精品一区二区三区在线观看视频 | 亚洲狠狠爱 | 精品少妇一区二区三区在线播放 | 伊人影院在线观看 | 欧美一级二级三级视频 | 91国产视频在线观看 | 最新中文字幕在线 | 一区二区三区视频 | 男人天堂网址 | 91久久国产综合久久91精品网站 | 色综合色综合色综合 | 午夜网 | 成人午夜精品 | 一级在线观看 | 亚洲欧美中文日韩在线v日本 | 欧美精品成人 | 成人在线视频观看 | 激情久久久久 | 日韩欧美国产精品 | 欧美精品在线免费观看 | 欧美 视频 | 久久88 | 国产精品亚洲二区 | 成人精品视频在线观看 | 日韩欧美在线一区 | 午夜精品视频 | av片网站 | heyzo在线 | 亚洲高清在线视频 | 久久99深爱久久99精品 | 亚洲二区在线 | 精品免费视频 | 精品在线一区 | 午夜a级理论片915影院 | 91在线精品一区二区 | 狠狠爱网址 | 久久久久久免费毛片精品 | 91精品国产乱码久久久久久久久 | 色资源av| 日韩一及片| 国产精品久久久久久久久久久久冷 |