作者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