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

標題: 單片機串口通訊問題求助 讀出來的數據總不對 [打印本頁]

作者: roninli    時間: 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;
         }                        
}

請指教

作者: xws245925587    時間: 2022-3-4 08:44
那你就看看這6個值,每次來一幀報文時,第一個字節是不是都是一樣的;
此外,你這個串口接收代碼邏輯不對,不應該每次都判斷是否為0x2c,不是就退出
作者: yzwzfyz    時間: 2022-3-4 09:06
1、不要在【void uart() interrupt 4】進行數據處理。數據處理放在中斷外進行。
2、【void uart() interrupt 4】只管下載數據,且來者不拒,來一個收一個。建立一個緩沖區,收到這此數據。
這時處理的好處是:【void uart() interrupt 4】耗時最小,占用主程序的時間就少,卡機的可能性就小。
分析緩沖區中的數據,就能知道問題在哪里了,如果沒有問題,也不影響你計算目標值。
作者: wulin    時間: 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. }
復制代碼

作者: zhxiufan    時間: 2022-3-4 10:27
可能是波特率有問題,主從雙方不一致,或者波特率誤差較大所致,將晶振改為11.0592MHz試試。
作者: roninli    時間: 2022-6-17 23:33
wulin 發表于 2022-3-4 10:10
建議定義一個接收完成標志,接收與解析分開處理

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




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 特黄毛片 | 精品国产欧美一区二区三区成人 | 成人在线精品视频 | av一级一片 | 成人精品一区二区三区中文字幕 | 欧美13videosex性极品 | 狠狠影院 | 久久精品国产免费看久久精品 | 久久精品二区亚洲w码 | 欧产日产国产精品国产 | 99久久久久国产精品免费 | 日本韩国欧美在线观看 | 美女久久视频 | 日韩欧美在线观看视频 | 91精品国产综合久久久久久丝袜 | 91中文字幕在线 | 色婷婷一区二区三区四区 | 91成人免费电影 | 久久av网站| 神马影院一区二区三区 | 99久久免费精品视频 | 成人精品久久日伦片大全免费 | 亚洲精品一区二区三区 | 日韩视频专区 | 亚洲 欧美 日韩在线 | 午夜久久| 日本免费视频在线观看 | 欧美性生交大片免费 | 电影午夜精品一区二区三区 | 最新中文字幕第一页视频 | 日韩精品一区二区三区中文在线 | 99色在线| 午夜影院在线观看免费 | 久久国产一区 | 欧美一级高潮片免费的 | 日韩免| 日日夜夜精品 | 国产三级电影网站 | 久久久天天 | 日韩精品免费视频 | 亚洲国产伊人 |