欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4344|回復(fù): 10
打印 上一主題 下一主題
收起左側(cè)

關(guān)于單片機(jī)自定義通訊協(xié)議的一個(gè)的問(wèn)題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
#
ID:976190 發(fā)表于 2023-2-6 20:41 | 只看該作者 回帖獎(jiǎng)勵(lì) |正序?yàn)g覽 |閱讀模式
300黑幣
現(xiàn)自定義PC機(jī)與單片機(jī)的通訊協(xié)議為:包長(zhǎng)+數(shù)據(jù)段

例:05 0A 0B 0C 0D 0E
假設(shè)現(xiàn)在受到通信干擾,包長(zhǎng)數(shù)據(jù)改變?yōu)?4,那么單片機(jī)接收到的就是數(shù)據(jù)0A 0B 0C 0D 而數(shù)據(jù)0E則會(huì)被當(dāng)成下一次數(shù)據(jù)包的包長(zhǎng),造成通信錯(cuò)誤。
請(qǐng)問(wèn)一下如果遇到這種狀況應(yīng)該怎么解決?小弟已經(jīng)想一天了

最佳答案

查看完整內(nèi)容

你定的協(xié)議解決不了問(wèn)題。 給你MODBUS的解決方案: MODBUS/ASC以":"作為幀頭標(biāo)志,"\r\n"(0xa、0xd)作為幀尾標(biāo)志,數(shù)據(jù)幀只有字母和數(shù)字的ASCII碼,不可能出現(xiàn)幀頭幀尾的字符。 MODBUS/RTU以3.5字符的總線空閑時(shí)間做幀頭標(biāo)志,如果出現(xiàn)傳輸3.5個(gè)字符的總線空閑時(shí)間,則剛才收到的最后一個(gè)字符則為幀尾,接下來(lái)收到的第一個(gè)字符就是幀頭。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

10#
ID:130230 發(fā)表于 2023-2-7 18:00 | 只看該作者
加幀頭長(zhǎng)度及校驗(yàn)給你參考:幀頭高8位(head high) 幀頭低8位(head low) 幀數(shù)據(jù)長(zhǎng)度(payloadLen ) 保留字節(jié)(res ) 命令類型(cmdType) 命令數(shù)據(jù)(cmdPayload) 幀校驗(yàn)(check)
回復(fù)

使用道具 舉報(bào)

9#
ID:390412 發(fā)表于 2023-2-7 11:00 | 只看該作者
格式可以改成 : 包頭  數(shù)據(jù)長(zhǎng)度 數(shù)據(jù) 校驗(yàn)和 包尾
                        校驗(yàn)和 = 包頭+數(shù)據(jù)長(zhǎng)度+數(shù)據(jù)+包尾

接收端:判斷if(rx_buf[0]==包頭 && rx_buf[4]==包尾)
                    {
                        u8 JiaoYan=rx_buf[0]+rx_buf[1]+rx_buf[2]++rx_buf[4]; //校校驗(yàn)=包頭+數(shù)據(jù)長(zhǎng)度+數(shù)據(jù)+包尾
                       if( JiaoYan == rx_buf[3] )  //校驗(yàn)正確
                        {
                            //開始接收數(shù)據(jù)
                            dat[0]=rx_buf[2]
                        }
                  }
//注意:自定義協(xié)議的數(shù)據(jù)不能包含包頭和包尾一樣數(shù)據(jù),如果是自定義的應(yīng)該可以避免這個(gè)問(wèn)題

回復(fù)

使用道具 舉報(bào)

8#
ID:1034262 發(fā)表于 2023-2-7 09:57 | 只看該作者
校驗(yàn)都沒有,非常不可靠。
用CRC16校驗(yàn)吧,參考MODBUS-RTU協(xié)議。
我建議直接用MODBUS-RTU協(xié)議,工控上,我從90年代一直用到現(xiàn)在,全球通用。
回復(fù)

使用道具 舉報(bào)

7#
ID:370884 發(fā)表于 2023-2-7 09:49 | 只看該作者
那你可以將協(xié)議擴(kuò)展一下加一個(gè)校驗(yàn)啊  校驗(yàn)不對(duì)說(shuō)明這包數(shù)據(jù)有誤   如果你想指導(dǎo)通信中哪一位誤碼了,還可以加糾錯(cuò)編碼啊
回復(fù)

使用道具 舉報(bào)

6#
ID:844772 發(fā)表于 2023-2-7 08:49 | 只看該作者
最好再加上CRC驗(yàn)證,錯(cuò)一位還能修正過(guò)來(lái)。
回復(fù)

使用道具 舉報(bào)

5#
ID:86926 發(fā)表于 2023-2-7 08:05 | 只看該作者
最后用個(gè)字節(jié)做校驗(yàn)就好了,一直這樣用
回復(fù)

使用道具 舉報(bào)

地板
ID:419968 發(fā)表于 2023-2-6 23:16 | 只看該作者
可以通過(guò)計(jì)時(shí)解決。因?yàn)榘l(fā)送肯定連續(xù)發(fā)送的,假設(shè)每字節(jié)最大發(fā)送時(shí)間間隔1ms,那么毎接受一個(gè)字節(jié)開始計(jì)時(shí)超過(guò)1.5ms認(rèn)為本次接受結(jié)束
回復(fù)

使用道具 舉報(bào)

板凳
ID:771630 發(fā)表于 2023-2-6 22:57 | 只看該作者
直接加個(gè)累加校驗(yàn)或者異或校驗(yàn)就行了
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:525244 發(fā)表于 2023-2-6 22:36 來(lái)自觸屏版 | 只看該作者
兩個(gè)辦法,一個(gè)辦法前邊加上3個(gè)數(shù)據(jù)包長(zhǎng)度,兩個(gè)一樣或三個(gè)一樣的有效!方法二:用接收結(jié)束延時(shí)法!必須一個(gè)字節(jié)1ms,接收完一個(gè)字節(jié),然后定時(shí)器計(jì)時(shí),來(lái)一個(gè)字節(jié)再清零,沒有字節(jié)接收之后,定時(shí)器計(jì)到3-10ms之后,判斷接收完成。還有其他方法!多思考!
回復(fù)

使用道具 舉報(bào)

樓主
ID:883242 發(fā)表于 2023-2-6 20:41 | 只看該作者
你定的協(xié)議解決不了問(wèn)題。

給你MODBUS的解決方案:

MODBUS/ASC以":"作為幀頭標(biāo)志,"\r\n"(0xa、0xd)作為幀尾標(biāo)志,數(shù)據(jù)幀只有字母和數(shù)字的ASCII碼,不可能出現(xiàn)幀頭幀尾的字符。

MODBUS/RTU以3.5字符的總線空閑時(shí)間做幀頭標(biāo)志,如果出現(xiàn)傳輸3.5個(gè)字符的總線空閑時(shí)間,則剛才收到的最后一個(gè)字符則為幀尾,接下來(lái)收到的第一個(gè)字符就是幀頭。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表