打印
[ZLG-MCU]

急求:UART接收数据包的解包问题?

[复制链接]
2942|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
坚持梦想|  楼主 | 2008-5-20 17:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想在EASYARM615的UART驱动示例实验基础上,编写一个应用程序,实现以下功能:利用Uart0接收外设模块的数据包,波特率为4800。每个数据包为5个字节,由于要利用数据包内的数据进行波形绘制,必须取得多个连续的数据包。
我利用了驱动库自带的以下函数:
1、串口0初始化函数Uart0Init();
2、中断接收函数UART0_ISR();
3、读取数据函数QueueRead();
4、写数据函数QueueWrite();
其中特别想提到的是示例中定义的一个全局数组:Uart0_Rec_Queue,我可以观察到其中存储的数据为想要提取的数据。
但是现在的问题是如何获得这些有用的数据,并对这些数据进行处理。用读取数据函数QueueRead(),似乎无法达到效果,因为每次读取数据之后,Uart0_Rec_Queue的内容已经改变,当我再次用这个函数读取时,数据包内各个字节的数据已经错乱!我猜想可能是中断接收函数不断触发了写数据函数QueueWrite(),导致了Uart0_Rec_Queue的值不断变化。(也可能是其它原因吧?请高手指点。。。)
特别急切想知道的是,我如何获得连续的数据包,可以用什么办法,从Uart0_Rec_Queue获得这些值,把它们转存到自己所定义的一个数组中去,这个数组不是动态变化的,可以对其各个元素进行运算?
恳请各位高手能有所指点,这个项目很急,谢谢了!!!

相关帖子

沙发
坚持梦想|  楼主 | 2008-5-20 22:33 | 只看该作者

非常奇怪的现象

Debug程序后,运行一段时间,点BREAK,查询相关变量值,Uart0_Rec_Queue数组(长度为100)的前23个数据均为0,从第24个数据开始才是数据包的数据,而TraBuf数组(长度为200),观察其值,发现,只有前16个数据有值,其它184个均为0。这是怎么回事,难道读取数据函数QueueRead()并没有读取队列Uart0_Rec_Queue的所有值,而只是读取了一部分,或者说是跳着读取数据的?这个函数只给了我们拷贝全部数据的假相?
再次恳请赐教!!!

使用特权

评论回复
板凳
坚持梦想|  楼主 | 2008-5-21 13:31 | 只看该作者

可以用这种方法吗

使用IntDisable(INT_UART0)函数,在初始化UART0之后,很快关闭UART0中断,(由于数据传送速度快,缓冲区应该很快就存满数据了吧?)然后将这时的Uart0_Rec_Queue数组值取出(此时应该会保持不变吧??我会加大数组元素个数(400),这样可以保证数据足够)进行转存、处理之后,再开中断。
理论上似乎可以,但运行之后,程序就进入FaultISR()死循环了,Uart0_Rec_Queue数组的值也不正确。这是为什么呢,这样做到底有什么问题?
烦请高手指点。。。

使用特权

评论回复
地板
坚持梦想|  楼主 | 2008-5-22 00:12 | 只看该作者

又出现了一个奇怪的情况

我关闭了UART0中断之后,发现Uart0_Rec_Queue数组的值确实没有变化,但是当我想通过以下方式提取数值时,却出现了更奇怪的现象:
方法如下:
uint8 *QBuf;
uint8 tmp;
QBuf=Uart0_Rec_Queue+27;//提取第27个数。
tmp=*QBuf;//读取该数。
当watch变量时,却发现QBuf指针指向了第27个数的地址,存储的是非0的值。但是tmp的值却为0(我甚至试图在初始化时将tmp赋为5,结果仍然变成0)。这是为什么?不可以用这种方法赋值吗?
现在真是一筹莫展了,希望大家有什么意见都可以说说,不知道大家是否遇到过类似情况?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

39

帖子

0

粉丝