作者MasterChang (我愛ASM)
看板ASM
標題Re: [問題] UART RX Buffer設計
時間Wed Aug 15 22:37:20 2012
※ 引述《gg1122 (99通未接來電)》之銘言:
: 因為目前UART Receive的部份都必須判斷收到CR
: 或某個End of char 才能辦法收到完整資料
: 程式目前寫成如下 Buffer一直收到 爆掉 就直接overflow 重新Reset index
: 目前遇到一個問題 我的真實資料前面會遇到0x0D 也就是CR
: 搞不太懂要怎處理 因為本來想說判斷 資料沒到多少長度就繼續收
: 大於門檻值長度就整條直接做處理 今天測試是不行 不太懂什麼原因?
: 難道要End of Char 要變連續二個BYTE 某個值 做判斷才能閃這個問題?
: 還請各位先進 能夠幫忙 給意見 謝謝
定義好你的資料封包,沒有說結尾一定要是CR(0x0D)
比如0xAA是封包開始,0xFE是封包結尾,問題是如果資料
有0xFE怎麼辦,可以用控制字元填充,比如0xFD,只要資
料是0xAA、0xFE、0xFD,前方就填充0xFD,接收data時如
果收到0xFD,表示下一個byte是資料,不是封包控制字元
。
<0xAA><data 1>...<data n><0xFE>
或是偷懶,封包加入長度資料訊息,封包結尾用checksum檢查
<0xAA><data length n><data 1><data 2>...<data n><checksum>
--
不要問我從哪來,我只是一個浪跡天涯的工程師....
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.232.21.114
1F:推 WolfLord:也可以用Base64或Code128來編碼(internet mime) 08/15 23:07
2F:推 gg1122:哪些封包都有包好 只是原始的資料進來哪邊不清楚 08/15 23:09
3F:→ gg1122:51做了什麼 把判斷0x0D弄掉 資料整段大於某個長度 再去拆 08/15 23:10
4F:→ gg1122:可是我看51哪邊就一直進不去拆封包的 程式段 覺得很怪 08/15 23:11
5F:推 WolfLord:如果你的資料是ascii,你也可以判斷比32比127大直接忽略 08/15 23:14
6F:→ WolfLord: 比32小 08/15 23:15
7F:→ WolfLord:不存入緩衝 08/15 23:15
8F:→ gg1122:我的資料0~0xFF都會出現 應該不可行 08/15 23:17
這樣很高的機率是程式問題,你的解封包怎樣做的?如果是用狀態
機去做,要檢查狀態機遷移的條件。整個解封包如果大雜燴的寫在
一起就比較難debug.如果是用指標函式去跑,可以"比較"容易透過
指標函式的遷移去檢查狀態機的狀態處發是否正確?
※ 編輯: MasterChang 來自: 118.232.21.114 (08/15 23:34)
9F:推 gg1122:if(UART_Buffer[0]=head1 && UART_Buffer[1]==head2) 08/15 23:40
10F:→ gg1122:這樣一層一層if掛下去 08/15 23:42
if(UART_Buffer[0]==head1 && UART_Buffer[1]==head2)
看得出來哪裡不一樣嗎?
而且這邏輯有問題,應該先檢查第一個接收資料是否為head1。
若為真才做檢查head2的動作。若為否則回到檢查接收資料是否
為head1。
因為資料開頭的head1有可能在UART_Buffer[1]裡....XD
簡單的說類似這樣的處理
ch = SURF;
switch(msgstate)
{
case 0:
if(ch == head1){msgstate++;}
else{msgstate = 0;}
break;
case 1:
if(ch == head2){msgstate++;}
else{msgstate = 0;}
break;
case 3:
...
default:
}
※ 編輯: MasterChang 來自: 118.232.21.114 (08/15 23:48)
11F:推 gg1122:哪我筆誤 == 才對 其實主要是進不來這行 08/15 23:46
12F:→ gg1122:奇怪 判斷RX LEN多長在進來 怎會不行 搞不懂51動作 08/15 23:49
13F:→ gg1122:明天我改一個一個BYTE去處理 不過還是想不透必須補結尾字元 08/15 23:55
14F:→ gg1122:整個資料才會收進來 ... 08/15 23:56
是不是PC端程式必須收到CR字元才開始發送?PC端程式確認一下...
※ 編輯: MasterChang 來自: 118.232.21.114 (08/15 23:58)
15F:→ gg1122:上端丟的 我用VC寫GUI去丟到51的 所以資料格式都是我控制的 08/15 23:59
如果是呼叫win api,確認一下結構的設定,那部分我沒碰、不
熟,我都是用BCB + Victor元件。
※ 編輯: MasterChang 來自: 118.232.21.114 (08/16 00:03)
16F:→ gg1122:明天再查不出來 我就改成一個一個BYTE去判斷了 08/16 00:00
17F:→ gg1122:謝謝! 08/16 00:01
18F:推 WolfLord:PC端如果你open stream piple的話,只有兩種狀況會真實 08/16 16:44
19F:→ WolfLord:真實傳送:buffer full跟收到\r\n 08/16 16:45
20F:→ WolfLord:解覺得方法有兩種:open raw 或把 file io buffer改成1 08/16 16:46
21F:推 gg1122:用成FSM就好了! 08/18 11:49
22F:推 timestoprun:GOOGLE一下FIFO的UART寫法!!應該可以解決唷!!! 10/22 21:12