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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

防止傳感器串口數據紊亂將數據打包,關于包頭包尾概念?

  [復制鏈接]
跳轉到指定樓層
樓主
ID:819146 發表于 2022-1-14 23:14 來自觸屏版 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
想把多個傳感器的數據通過串口上傳到上位機上,為了防止數據紊亂,我在網上找到的解決方案就是將數據打包,一包一包的將數據上傳到上位機上,沒有找到相關的教程,就是想問一下包頭包尾具體要怎么創建,使用的時候要注意些什么(問題可能有點蠢,萌新,請見諒)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:213173 發表于 2022-1-15 07:19 | 只看該作者
串口傳輸數據的基本單元是一個字節,所謂打包是按通信協議把一串字節集中傳輸。假設某設備需要準確實時傳輸3個字節有效數據。那么制定一個自定義通信協議,由7個字節組成:0xaa、0x07、0x01、0x02、0x04、0x0d、0x55。數據頭,數據長度,3個有效數據,數據和得到的驗證碼,數據尾。當串口收到0xaa,表示有傳輸要求,接著收到0x07表示數據長度7個字節。當收完7個字節并且最后是0x55,就可以解析數據了。把除第6外其它6個字節相加,溢出部分拋棄,再與第6字節比較驗證,相同回復正確信息并執行相應任務,不同回復要求重發信息。簡單敘述,實際應用中驗證方式多種多樣,不一而足。
回復

使用道具 舉報

板凳
ID:57657 發表于 2022-1-15 07:36 | 只看該作者
串口數據包就是所有字節緊挨著發送,超過規定時間沒有接收到字節就開始解析,所謂的包頭包尾就是固定的值 比如A5 5A。
回復

使用道具 舉報

地板
ID:807591 發表于 2022-1-15 12:15 | 只看該作者
如果不是很復雜很長的數據,無需所謂包頭包尾,最后一個字節設為CRC校驗即可,傳輸那么多包頭尾完全是浪費時間
回復

使用道具 舉報

5#
ID:879809 發表于 2022-1-18 19:17 | 只看該作者
上位機實時性非常差的,利用超時標記幀頭是非常不靠譜的。可以利用MODBUS/ASC的做法,幀頭是":",幀尾是"\r\n",中間的數據不能出現這三個字符即可。
回復

使用道具 舉報

6#
ID:824490 發表于 2022-1-18 21:18 | 只看該作者
給你一張圖參考一下:




回復

使用道具 舉報

7#
ID:879809 發表于 2022-1-19 01:53 | 只看該作者
名字不是重點 發表于 2022-1-18 21:18
給你一張圖參考一下:

你這個邏輯上有問題的,要保證中間數據不會出現55AA、0D0A這樣的組合,否則會認錯幀頭幀尾的。
回復

使用道具 舉報

8#
ID:311903 發表于 2022-1-19 08:23 | 只看該作者
發表于 2022-1-19 01:53
你這個邏輯上有問題的,要保證中間數據不會出現55AA、0D0A這樣的組合,否則會認錯幀頭幀尾的。

這種簡單的協議如果擔心數據里面有特殊值(包頭/包尾),就把數據部分出現包頭/包尾的做個轉義也可以
回復

使用道具 舉報

9#
ID:824490 發表于 2022-1-19 09:27 | 只看該作者
發表于 2022-1-19 01:53
你這個邏輯上有問題的,要保證中間數據不會出現55AA、0D0A這樣的組合,否則會認錯幀頭幀尾的。

不管用什么數值作同步,這個問題都會存在。但用代碼可以輕松解決:
我之前用過的如下:
同步頭:
如果接收計數==1,且接收(計數-1)==0x55 &&  接收(計數)== 0xaa ,則接收計數+1,
否則 接收計數=0;
幀尾:
連續收到0x0d && 0x0a 時 判斷幀長度:
如果接收計數==幀長度,且接收(計數-1)==0x0d &&  接收(計數)== 0x0a,則接收OK=1;
否則 接收OK=0;繼續下一個字節接收。
在main()中只要讀到接收OK=1就開始分配工作了。

歡迎指正~~
回復

使用道具 舉報

10#
ID:236035 發表于 2022-1-19 11:43 | 只看該作者
可以參考一些成熟協議,如包頭是4個 0xFF ,再加一個 0x55,包尾只需有校驗字。
回復

使用道具 舉報

11#
ID:899981 發表于 2022-1-19 11:53 | 只看該作者
自己定義,不過包頭包尾要找的不常用好記的字節,例如AA.BB.FF,00,最好加簡單校驗,例如取反加一等。
回復

使用道具 舉報

12#
ID:879348 發表于 2022-1-19 14:14 | 只看該作者
就是用特殊符號做開頭結尾方便寫程序,這些符號在正式數據中不會出現
回復

使用道具 舉報

13#
ID:824490 發表于 2022-1-19 15:07 | 只看該作者
wufa1986 發表于 2022-1-19 14:14
就是用特殊符號做開頭結尾方便寫程序,這些符號在正式數據中不會出現

嚴格意義上來講,沒有什么特殊符號,因為數據傳輸的內容不可預知的,只能通過軟件代碼來過濾。
回復

使用道具 舉報

14#
ID:879809 發表于 2022-1-19 15:31 | 只看該作者
名字不是重點 發表于 2022-1-19 15:07
嚴格意義上來講,沒有什么特殊符號,因為數據傳輸的內容不可預知的,只能通過軟件代碼來過濾。

怎么可能不可預知???MODBUS/ASC的精髓就是幀頭":"幀尾“\r\n”,中間數據不可能出現這三個字符,只能是“01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ+-.”。小伙子你還是見識的太少。
回復

使用道具 舉報

15#
ID:824490 發表于 2022-1-19 15:46 | 只看該作者
你是說,“01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ+-.”這幾個字符就能代表0-255內的任何值了。
嗯呢,受教了!
回復

使用道具 舉報

16#
ID:879809 發表于 2022-1-19 16:02 | 只看該作者
名字不是重點 發表于 2022-1-19 15:46
你是說,“01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ+-.”這幾個字符就能代表0-255內的任何值了。
嗯呢,受 ...

ASCII碼當然可以表示任意值,“-9999.888”也是ASCII,可比你以為的0~255范圍大太多了。
回復

使用道具 舉報

17#
ID:824490 發表于 2022-1-19 16:05 | 只看該作者
發表于 2022-1-19 15:31
怎么可能不可預知???MODBUS/ASC的精髓就是幀頭":"幀尾“\r\n”,中間數據不可能出現這三個字符,只能 ...

如果傳送一幅240*320的圖片,本來只要傳240*320*2(16位色值)的圖片, 是不是要多傳一倍的數據量?
MODBUS/ASC貌似對大數據傳輸不太友好來的。。
回復

使用道具 舉報

18#
ID:824490 發表于 2022-1-19 16:10 | 只看該作者
發表于 2022-1-19 16:02
ASCII碼當然可以表示任意值,“-9999.888”也是ASCII,可比你以為的0~255范圍大太多了。

是的,我沒接觸過MODBUS的相關協議。。如我上一貼所言,傳輸速度會不會被打折扣了?因為你每一個字節都被拆成2個字節來發送,上位機要拆分、下位機要組合,感覺對實時性要求高的地方不太適用,比如在電機控制方面,速度慢了可能會出事的。望指點~~
回復

使用道具 舉報

19#
ID:879809 發表于 2022-1-19 16:10 | 只看該作者
名字不是重點 發表于 2022-1-19 16:05
如果傳送一幅240*320的圖片,本來只要傳240*320*2(16位色值)的圖片, 是不是要多傳一倍的數據量?
MOD ...

傳圖片用串口,你是不是有點兒什么疾患?
回復

使用道具 舉報

20#
ID:879809 發表于 2022-1-19 16:21 | 只看該作者
名字不是重點 發表于 2022-1-19 16:10
是的,我沒接觸過MODBUS的相關協議。。如我上一貼所言,傳輸速度會不會被打折扣了?因為你每一個字節都被 ...

上位機本來就沒實時性你要求本身就不合理。

單片機和單片機之間我更喜歡用MODBUS/RTU的形式來進行,幀數據一個字節內容可以是0~255之間任意值,總線空閑3.5字節時間,下面到來的第一個字符就是幀頭。
回復

使用道具 舉報

21#
ID:824490 發表于 2022-1-19 16:24 | 只看該作者
別急躁!
一些設備只有串口。即使看上去是USB的接口,但還是走串口的通道的。你不能更換新設備。沒得說。
回復

使用道具 舉報

22#
ID:824490 發表于 2022-1-19 16:30 | 只看該作者
發表于 2022-1-19 16:10
傳圖片用串口,你是不是有點兒什么疾患?

手持對講機(用的就是1.77的屏),終端客戶要求能更換開機LOGO,以及一些特定聲音文件,而主控不支持USB,又沒有插卡接口,只能走串口通道。這事多了去了。

回復

使用道具 舉報

23#
ID:824490 發表于 2022-1-19 16:36 | 只看該作者
發表于 2022-1-19 16:21
上位機本來就沒實時性你要求本身就不合理。

單片機和單片機之間我更喜歡用MODBUS/RTU的形式來進行,幀 ...

客戶的要求,就是合理的。。
即使以專業的角度來分析不合理,我們也要將就他們的不合理。。說的很窩囊、很委曲,事實如此,競爭太激烈了。。
回復

使用道具 舉報

24#
ID:236035 發表于 2022-1-20 11:09 | 只看該作者
包頭不與數據重復可以加長字節。小概率事件不用考慮,非要考慮,還有糾錯機制。
回復

使用道具 舉報

25#
ID:624769 發表于 2022-1-20 21:40 | 只看該作者
個人覺得,如果不用 ASCII 傳輸,沒什么必要加包頭包尾的,開啟串口的9位模式,外加每發送16個字節 + 接收端回應一個效驗值,就足夠了。
回復

使用道具 舉報

26#
ID:1017183 發表于 2022-4-10 12:15 | 只看該作者
發表于 2022-1-19 15:31
怎么可能不可預知???MODBUS/ASC的精髓就是幀頭":"幀尾“\r\n”,中間數據不可能出現這三個字符,只能 ...

請問,為什么以“:”為幀頭,數據中可以出現冒號呀
回復

使用道具 舉報

27#
ID:883242 發表于 2022-4-10 18:48 | 只看該作者
嵌入式大菜雞 發表于 2022-4-10 12:15
請問,為什么以“:”為幀頭,數據中可以出現冒號呀

你要傳輸什么數據一定要有冒號?寫出來看々。
回復

使用道具 舉報

28#
ID:310441 發表于 2022-4-11 07:40 來自觸屏版 | 只看該作者
包頭即可。用一串不會或者極小概率出現的數據作為你要傳輸數據的頭。僅用來表示數據的起點。
回復

使用道具 舉報

29#
ID:958310 發表于 2022-4-11 09:20 | 只看該作者
數據頭-功能碼-數據長度-有效數據~-CRC校驗
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚欧精品一区 | 日本精品裸体写真集在线观看 | 日韩一区二区精品 | 日韩中文字幕免费在线 | 99福利视频导航 | 午夜网| 国产精品mv在线观看 | 欧美一区二区在线 | 亚洲精品在线免费播放 | 久久这里只有精品首页 | 中文字幕 欧美 日韩 | 日日操操 | 涩涩视频大全 | 精品视频在线免费观看 | xxx.在线观看 | 久久精品久久久久久 | 欧美精品一区二区在线观看 | 青春草国产 | 男女羞羞视频在线看 | 日韩电影中文字幕在线观看 | 亚洲精品乱码久久久久久按摩观 | 亚洲免费在线观看av | 国产精品毛片一区二区在线看 | 亚洲人成一区二区三区性色 | 亚洲国产成人精品久久久国产成人一区 | 欧美精品一区二区三区在线播放 | 毛片免费视频 | 人人干人人超 | 国产一区二区视频免费在线观看 | 欧美日韩精品一区二区天天拍 | 亚洲精品中文字幕av | 欧美精品一区二区三区四区 在线 | 手机在线观看av | 精品国产不卡一区二区三区 | 国产高清在线 | 国产东北一级毛片 | 亚洲精品免费在线 | 中文字幕 国产 | 国产三级精品视频 | 精品久久国产 | 亚洲成人av|