RS485通訊中,單次發(fā)送多少字節(jié)可靠性最好?
一直在思考一個問題:上位機采用高級語言編程,下位機采用單片機,點對多通訊。在通訊測試中,發(fā)現(xiàn)隨著單次發(fā)送(含下位機發(fā)送)字節(jié)數(shù)的增加,通訊的可靠性越來越低,而且上位機CPU的性能越來越接近百分之百。發(fā)送頻率的提高,也會增加CPU的負擔。
那么,以多少的發(fā)送頻率、單次發(fā)送多少字節(jié)最為可靠呢?沒有可靠性,追求速度沒有用啊。
提問者:吔屎蛋拉雷
地點:-
瀏覽次數(shù):2067
提問時間:10-14 14:34
我有更好的答案
- 13條回答
-
Cdxxgcdx
07-31 00:45
“在通訊測試中,發(fā)現(xiàn)隨著單次發(fā)送(含下位機發(fā)送)字節(jié)數(shù)的增加,通訊的可靠性越來越低,而且上位機CPU的性能越來越接近百分之百。發(fā)送頻率的提高,也會增加CPU的負擔?!?br/>
多高的波特率?光是通訊就能給上位機造成負荷?
幀長度還會影響通訊可靠性?你所用的物理層評估過可靠性了嗎?
-
szbliy
08-03 19:08
數(shù)據(jù)的單幀長度過長且若緩沖區(qū)不夠大的話,確實容易出錯(丟失數(shù)據(jù))。當然,若傳輸速率過快的話,也同樣會有問題(接收速度跟不上)。具體得根據(jù)實際使之匹配,含物理及以上各協(xié)議層。
-
jinheng
07-26 15:53
單次發(fā)送多少字節(jié)只取決于你的設(shè)計,只要緩沖區(qū)不溢出,多少字節(jié)都可以。
反而是每次幀間的間隔時間,必須合理計算留出足夠的間隔讓對方有足夠的時間能夠響應(yīng)、處理,畢竟操作系統(tǒng)下的任務(wù)切換時間是比較長并且不確定的。
同時,好的協(xié)議才是關(guān)鍵。
-
huaxu2222
07-31 21:43
使用 115200??xmodem? ?沒見CPU滿負荷啊
-
想變胖的瘦子
07-28 21:39
明顯LZ的軟件設(shè)計問題。
單片機能把PC機拖死的話,那你的軟件設(shè)置之差也差得很牛B了
-
天地直方
07-29 15:29
現(xiàn)實中遇到的,同樣的測試,在RS232中沒有遇到,很郁悶啊!
-
YOYOOO
07-27 19:34
樓主的問題應(yīng)該通過改進系統(tǒng)設(shè)計來解決,只要有數(shù)據(jù)校驗和偵錯重發(fā)機制,數(shù)據(jù)包的長度與可靠性無關(guān)。
-
lq544
07-30 16:38
不知道你們怎么都沒遇到過這個問題:幀錯誤!
首先,單片機與PC機之間的波特率是存在誤差的,理想情況是在每一個bit的中間位置判斷電平高低,實際上隨著幀長度的加長,波特率的誤差會累積起來,導(dǎo)致不是在每個bit的中間位置判斷高低電平,最終導(dǎo)致出錯。解決這個問題的辦法很簡單,在每一個字節(jié)發(fā)送完成后,插入一小段延時,比如插入一個bit的時間,就足以讓接收端重建同步,比如用1.5或2個停止位的方法,就可以大大提高通訊的可靠性。實際使用可以在發(fā)送數(shù)據(jù)前插入兩個NOP指令,效果就好得多。
因為我在實踐中就觀察到幀錯誤的情況,表現(xiàn)為:接收到N個字節(jié)后,接下來的一個字節(jié)的停止位沒被檢測到,而這個字節(jié)的第一位剛好是0的話,就被當成是起始位,而最后一個停止位被當成第八位,這就接收到了一個錯誤的字節(jié),并且下一個字節(jié)會漏掉,之后接收到的數(shù)據(jù)就會根據(jù)字節(jié)內(nèi)容(0的位置)不斷變化了。
補充一點:幀錯誤通常發(fā)生在PC端。
-
bairunwanda168
07-28 09:41
再說,你說“實際使用可以在發(fā)送數(shù)據(jù)前插入兩個NOP指令,效果就好得多?!?br/>
“插入兩個NOP指令”才多少時間,相對于串口波特率來說算什么?
不是DMA方式的話,一般都是基于字節(jié)接收完或發(fā)送完中斷 來收發(fā)每個字節(jié)的,字節(jié)間必然會有間隙,就算用等待TI的方法,也會有間隙;
除非你是用的固定延時的非常規(guī)方法才會有一個字節(jié)毫無間隙接著一個字節(jié)發(fā)送的可能,甚至沒發(fā)送完就接著送入下一字節(jié)(比如老x以前做的用單片機產(chǎn)生VGA顯示信號,但那個波特率可是好幾M的,正常設(shè)計沒人會那樣做的,也不應(yīng)該那樣做)
-
wywrtswe
08-03 18:08
可能是我理解錯誤,但我在實際應(yīng)用中就是在每個字節(jié)發(fā)送前插入20-100個NOP指令,完美解決問題,否則PC機端就會出錯,而且換不同PC機出錯的幾率大不一樣。我單片機端是用的中斷方式發(fā)送數(shù)據(jù),波特率19200-38400,每次發(fā)送幾十到數(shù)百個字節(jié)。
出錯的時候,PC端的程序直接報幀錯誤,加入延時后不再出現(xiàn)此錯誤。
-
csshan3
07-28 04:19
前面所說插入"兩個"NOP是泛指,就是N個的意思。:lol
波特率偏差10-20%,我我認為在一個字節(jié)內(nèi)就足以產(chǎn)生為偏差,導(dǎo)致張冠李戴了。不信就用12M晶振與11.0592M的來試一下,不改波特率設(shè)置,發(fā)送一串數(shù)據(jù),絕對有問題。
-
ywyrywer
08-03 11:09
如果是較多的數(shù)據(jù),建議拆分成一個個小包發(fā)送,中間可以對每個數(shù)據(jù)包校驗。錯了就重發(fā)。
-
uywuuwewd
07-29 04:56
有道理,這種測試換了幾臺電腦了,從老些的到剛買的,都有類似的問題。結(jié)果是:與波特率關(guān)系不大,與通訊的頻率和單次通訊的字節(jié)數(shù)有關(guān)。通訊次數(shù)多和通訊字節(jié)數(shù)多,會導(dǎo)致上位機電腦莫名其妙的退出測試。