關於波特率的一次碰壁經歷

2021-10-24 06:24:47 字數 911 閱讀 3558

最近做了乙個通過串列埠給stm32燒寫程式的小專案,目的很簡單,通過支援多種波特率9600、115200、25600、460800,來實現對其公升級程式。最終460800在傳輸檔案包數是2048byte/每幀時速度達到滿意的10s以內。於是很開心的發布了。2天之內,下面測試人員反饋,用9600波特率公升級失敗。

多次測試發現是9600發輸檔案包數是2048byte/每幀才必出,然後果斷調到512byte/每幀。果然沒出了,我懷疑是9600傳輸速度太慢了,但是沒證據。於是用監視串列埠的工具看,發現乙個很奇怪的現象。我先用accessport監視,發現我組的幀一共2062個位元組,是分多次下去的,先下去4包,每包512位元組,染色下去了4包的時候看到下位機給的nak幀,接著在下乙個傳送包裡,我要傳送的剩餘位元組連著下乙個包的頭部一起下去了。看到這裡,我是懵逼的,我明明是一起下去的,咋還沒發完就收到了下位機的nak吶!

commonitor很醒目的傳送時間一下子讓我意識到,9600傳輸速度慢!首先串列埠傳輸是非同步的,也就是說上位機write資料,只是把資料交給系統就返回了,當我用9600時,我的超時計時器並不是從串列埠實際傳送資料結束的時候開始計時的,而是更早,可以把它當做從串列埠開始傳送第一包的時候開始計時的。如果9600傳輸速度慢到超過我的超時時間,那麼定時結束超時就會重發下一包。而這個時候串列埠實際資料還沒傳輸完成!這就解釋了通過邏輯分析儀看到的現象,第一包和重發包無間隔,因為在串列埠傳送第一包的時候已經超時了!

我是9600、偶校驗、8位資料位、1位停止位。傳輸的時候都帶乙個開始位。那麼實際串列埠傳送碼元的大小是:1+8+1+1=11bit。

串列埠波特率9600的單位實際是9600bit/s.那麼該速度下傳輸的有效位元組速度是:9600/11 = 872byte。

我用的方法更直接,直接把9600該項去掉了。因為這個東西速度很慢,上面的解決辦法,除了同步傳輸資料之外,其他的方法介面都是靈活可調的,別人給你設定的有問題,你沒有一絲辦法。

關於串列埠通訊波特率的幾點思考

首先想說,12mhz真的是有問題。我使用的是 stc89c52rc的微控制器,他的最小系統板的的晶振是12mhz,但是這個開發板上買的晶振就沒寫頻率!我一直以為這是預設的11.0592mhz,因為之前用的最小系統板都是這個頻率。在沒有使用串列埠通訊的時候,不管是11.0592m還是12m,都對程式的...

關於CAN波特率暫存器的幾個引數

這個文章不僅僅是取樣點啦。1 關於canopen取樣點,如果是250kbps,鐵定放在了87.5 2 還有關於sjw,這個值如果是具體比較長,比如100公尺 250kbps最長好像是200公尺 那麼最好設定成3或者4 周立功說 我們選擇3 4可以使匯流排獲得更寬的波特率容忍度 我一般設定成了3.3 ...

關於定時器 波特率 TH和TL值的計算

假設晶振位6mhz,定時10ms 微控制器系統晶振頻率為6mhz,系統時鐘頻率 也是計時脈衝頻率 為500khz,乙個脈衝週期2us 10ms是5000個脈衝,因此 方式0 13位定時計數方式,最大計數值為2 13 8192,定時8192個機器週期。此方式已經不再用了,是為了和以前的微控制器相容,學...