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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

關于單片機串口數據解析

[復制鏈接]
跳轉到指定樓層
樓主
50黑幣
由串口接收回的數據存儲在u8 USART2_RX_BUF[];下面是串口接收中斷函數
void  USART2_IRQHandler(void)
{
      
        u8 Res;
        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  //接收中斷(接收到的數據必須是0x0d 0x0a結尾)
                        {
                        Res =USART_ReceiveData(USART2);        //讀取接收到的數據
                  Res&=0x7F;
                       
                        if((USART2_RX_STA&0x8000)==0)//接收未完成
                                {
                                if(USART2_RX_STA&0x4000)//接收到了0x0d
                                        {
                                        if(Res!=0x0a)USART2_RX_STA=0;//接收錯誤,重新開始
                                        else USART2_RX_STA|=0x8000;        //接收完成了
                                        }
                                else //還沒收到0X0D
                                        {      
                                        if(Res==0x0d)USART2_RX_STA|=0x4000;
                                        else
                                                {
                                                USART2_RX_BUF[USART2_RX_STA&0X3FFF]=Res ;
                                                USART2_RX_STA++;
                                                if(USART2_RX_STA>(USART2_REC_LEN-1))USART2_RX_STA=0;//接收數據錯誤,重新開始接收         
                                                }                 
                                        }
                                }                    
                         }
}

USART2_RX_BUF[]的數據格式如圖所示,紅框標注為有效數據,紅框內數據前8位是壓力值,后8位是濃度值,數據類型為浮點型

我想1、將有效數據截取出來
2、將浮點數據轉為正常的數值
3、可從串口輸出

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

使用道具 舉報

沙發
ID:301191 發表于 2022-8-3 03:52 | 只看該作者
頂一下
回復

使用道具 舉報

板凳
ID:94031 發表于 2022-8-3 06:24 | 只看該作者
數據內容里是3個數:
42 c8 5c 29 對應壓力值:   100.18  (浮點數);
00 10         對應模塊狀態:0x0010 (16進制數);
41 44 cc cd 對應濃度值:   12.3     (浮點數);
回復

使用道具 舉報

地板
ID:123289 發表于 2022-8-3 09:25 | 只看該作者
1、研讀、了解通訊協議,按協議分解數據。
2、弄通浮點數的組數方式。
這樣你就會象板櫈一樣明白了。
回復

使用道具 舉報

5#
ID:1041056 發表于 2022-8-3 10:37 | 只看該作者
yzwzfyz 發表于 2022-8-3 09:25
1、研讀、了解通訊協議,按協議分解數據。
2、弄通浮點數的組數方式。
這樣你就會象板櫈一樣明白了。

轉浮點是先將8位16進制轉成32位的二進制數,再對二進制進行計算,我現在完成了轉二進制,但是二進制數在單片機里也是十六進制表示的,又不會算了
回復

使用道具 舉報

6#
ID:195496 發表于 2022-8-3 10:50 | 只看該作者
這個不難,要自已把接收數據程序改一下,中斷接收采用超時方法進行,接收到有效數據后,置位一個標志位,在主程序中查詢,進行數據解析,不要所有工作都在串口中斷程序中進行。
回復

使用道具 舉報

7#
ID:1034262 發表于 2022-8-3 11:45 | 只看該作者
協議不完善吧?沒有轉義字符?如果數據域中出現冒號或回車換行相同的數據,怎么辦?
這是字符同步通訊,我會設置3個特殊字符:命令開始字符、結束字符、轉義字符。數據域中出現等于這3個控制字符的數據時,使用轉義字符轉換一下。
回復

使用道具 舉報

8#
ID:883242 發表于 2022-8-3 13:06 | 只看該作者
coody_sz 發表于 2022-8-3 11:45
協議不完善吧?沒有轉義字符?如果數據域中出現冒號或回車換行相同的數據,怎么辦?
這是字符同步通訊,我 ...

扯淡,這種協議從0x0~0xff任何字符都可能出現,如果設冒號回車換行這些轉義字符就亂套了。

很簡單,用超時,比如MODBUS/RTU規定超過3.5個字節的總線空閑就是幀頭標志。
回復

使用道具 舉報

9#
ID:161164 發表于 2022-8-3 13:14 | 只看該作者
首先你要確保USART2_RX_BUF[0]是':'
然后就簡單了

float *YaLi;
float *LongDu;

YaLi = (float*)&USART2_RX_BUF[4]);
LongDu = (float*)&USART2_RX_BUF[10]);

printf("YaLi = %0.2f, LongDu = %0.2f\r\n",*YaLi,*LongDu);
回復

使用道具 舉報

10#
ID:401564 發表于 2022-8-3 17:41 | 只看該作者
這個像是Modbus通訊
1,當串口接收到第1個數據時,啟動定時器,并把數據保存到緩沖池中
2,接收到結束符,并且一定時間之后,如果再沒接收到新的數據,就認為這是一個完整的數據幀
3,把緩沖池的數據復制到另一個緩沖池中,在主程序對另一個緩沖池的數據進行處理,因為有可能你在處理的時候,來了新的數據,緩沖池的數據結構就不一樣了,讀取出來的就不一定是原始的數據了

我一般用的是結構struct                                           //串口Buffer結構
{
unsigned char buf_uart[32];                //留32個地址來存放串口的數據
unsigned char cnt_Byte;        //接收到的字節數量
}Buffer0,Buffer1;        //兩個結構變量,讓串口接收和保存不相互影響

接收到一個完整的數據幀之后,就直接

Buffer1=Buffer0;//把串口緩存的數據復制過來
memset(&Buffer0,0,sizeof(Buffer0));//清除串口接收緩沖
STM32有足夠的能力處理串口這點小數據的

讀取數據出來不就是很簡單的事情嗎?就是直接讀取數組的數據而已,9#已經給出方法了
回復

使用道具 舉報

11#
ID:401564 發表于 2022-8-3 17:51 | 只看該作者
coody_sz 發表于 2022-8-3 11:45
協議不完善吧?沒有轉義字符?如果數據域中出現冒號或回車換行相同的數據,怎么辦?
這是字符同步通訊,我 ...

這個數據看著像modbus
兩個簡單的起始符和結束符意義并不大,接收到的數據中隨時有可能就出現了,搞不好數據還沒有接收完就結束了
回復

使用道具 舉報

12#
ID:883242 發表于 2022-8-3 17:53 | 只看該作者
Y_G_G 發表于 2022-8-3 17:41
這個像是Modbus通訊
1,當串口接收到第1個數據時,啟動定時器,并把數據保存到緩沖池中
2,接收到結束符,并且 ...

根本就不是什么MODBUS,要么用超時來做幀頭標記,中間可以是0x0~0xff任意數字,這是MODBUS/RTU的實現方法。要么用特殊字符比如:做幀頭,\r\n做幀尾標記,中間只能出現'0'~'9'、‘A’~‘Z’這類可打印的ASCII字符,絕對不可以在數據幀中間出現: \r \n這幾個幀標志,這是MODBUS/ASC的做法。

這個協議的制定者顯然是個不懂裝懂的半瓶醋,才會搞出這種有邏輯漏洞的東西。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久久国产a级 欧美日韩国产免费 | 岛国毛片在线观看 | 一级毛片视频在线观看 | 一区二区免费在线观看 | 欧美日韩成人一区二区 | 一区二区三区精品在线 | 三级黄视频在线观看 | 天天操夜夜操 | 国产成人精品网站 | 日韩成人在线观看 | 97精品一区二区 | 日韩在线不卡视频 | 亚洲一区二区三区福利 | 国产网站在线免费观看 | 成人av播放| 天天看天天操 | 欧洲精品视频一区 | 久久精品av | 欧美黄色免费网站 | 久久综合九色综合欧美狠狠 | 午夜精品久久久久久久久久久久久 | 好姑娘影视在线观看高清 | 羞羞视频网站 | 成人av播放 | 中文字幕中文字幕 | 欧洲一级毛片 | 国产91丝袜在线18 | av网站在线看 | 国产三区视频在线观看 | 看特级黄色片 | 精品日韩 | 国产乱性| 欧美1—12sexvideos| 91在线精品视频 | 拍真实国产伦偷精品 | 涩涩视频在线看 | 国产精品美女一区二区三区 | 日本精品在线播放 | 99热精品在线 | 热久久国产| 国产精品久久亚洲 |