打印
[51单片机]

单片机串口数据处理 协议简单但是成组发送 丢数据

[复制链接]
3284|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 baipengwei 于 2014-4-25 16:53 编辑

波特率:9600
校验位:无
数据位:8
停止位:1


功能:在监视器上的指定位置显示一串字符
格式:该帧数据以81H开头,其后的两个字节用来表示将要在监视器上显示该字符串的位置,然后是该字符串的长度,接着就是所要显示的字符串的字符的代码。其格式详细说明如下:
序号        内容                说明
0        81H                信息帧的标志,其值为81H
1        CHARS_POS_X        将要显示的字符串的列坐标,其值为00H~17H
2        CHARS_POS_Y        将要显示的字符串的行坐标,其值为00H~0BH
3        CHARS_LENGTH        所要显示的字符串的长度,也就是该字符串所包含的字符的个数,其值为     01H~18H,就是说所能显示的字符串所包含的字符的最大个数为24。
4        CHARS_CODE0        字符串的第一个字符
5        CHARS_CODE1        字符串的第二个字符
N+3        CHARS_CODEn-1        字符串的第n个字符,1≤n≤24
        例如:我们要在监视器的第3行、第5列显示2003-03-03,所传输的数据应该是:
81H  05H  03H  0AH  02H  00H  00H  03H  E7H  00H  03H  E7H  00H  03H
而要在第4行、第7列显示13:05:24,所传输的数据就应该是:
81H  07H  04H  08H  01H  03H  E1H  00H  05H  E1H  02H  04H

[现在程序处理方式]
现在用串口程序采用方法是:在接收中断里进行接收 ,逐级判断,只有一级一级的数据判断正确,整个过程的数据都正确,才能确定数据接收完成,此时置位一个标志位,在主程序里处理通过此标志位执行相应程序。

[程序测试]
采用串口精灵调试
如果单独发送一组数据
比如:81H  07H  04H  08H  01H  03H  E1H  00H  05H  E1H  02H  04H
是正常的

[设备故障现象]
但是如果同时发送多组数据
比如(下列数据为16进制)
81 02 00 09 09 09 00 00 01 03 E7 00 01 81 12 00 06 00 00 09 08 08 08 81 03 0A 08 01 04 E1 00 08 E1 04 05 81 01 0B 0A 02 00 01 04 E7 00 03 E7 02 01

就会出现数据显示不全的情况

[备注]
1.上位机串口通信处理程序协议固定,无法修改或者变动了.
2.监听了上位机,每次同时发送几组数据,最多时候一次发送一百个字节左右.

求大侠指导

相关帖子

沙发
baipengwei|  楼主 | 2014-4-25 16:54 | 只看该作者
数据一组一组发送没有问题
几组放在一起同时发送就出现丢码了

使用特权

评论回复
板凳
yangxf1217| | 2014-4-25 17:30 | 只看该作者
我也遇到过这样的问题,一边接收一边判断不行。视乎应该先接收下来存放到缓冲区,接收完了,再处理。

使用特权

评论回复
地板
yangxf1217| | 2014-4-25 17:31 | 只看该作者
对你这个问题很感兴趣,有什么进展可否麻烦透露下。

使用特权

评论回复
5
airwill| | 2014-4-25 22:39 | 只看该作者
我觉得, 应该是中断服务的 bug 引起的. 连发两个包, 用调试器跟踪一下吧.

使用特权

评论回复
6
受不了了| | 2014-4-25 23:08 | 只看该作者
估计是你上位机主循环偶尔超过一毫秒

使用特权

评论回复
7
ningling_21| | 2014-4-26 08:31 | 只看该作者
下位机正在处理刚收到的数据,又来一串数据,没来得及处理不就丢了...

使用特权

评论回复
8
yklstudent| | 2014-4-26 09:39 | 只看该作者
一、MCU处理数据的速度太慢了
二、上位机发送数据间隔太短了

使用特权

评论回复
9
限量_个性。| | 2014-4-26 10:57 | 只看该作者
我也遇过这样的问题,试试把发送间隔时间调长点,然后把缓冲区的一帧数据处理完再接收下一帧数据。

使用特权

评论回复
10
红金龙吸味| | 2014-4-26 11:08 | 只看该作者
中断接收扔到FIFO,主程序处理FIFO,完全没有任何压力。
设计串口通信程序,应该首先要应用此方案,这个是基本功。
别说一百个字节,连续一千个字节,照样正常响应。

使用特权

评论回复
11
baipengwei|  楼主 | 2014-4-26 17:00 | 只看该作者
限量_个性。 发表于 2014-4-26 10:57
我也遇过这样的问题,试试把发送间隔时间调长点,然后把缓冲区的一帧数据处理完再接收下一帧数据。 ...

上位机的发送时间是固定死了,无法改动

我下位机只负责接收串口数据,如果串口数据符合协议范围,就在图像上叠加相应的数据。

使用特权

评论回复
12
baipengwei|  楼主 | 2014-4-26 17:03 | 只看该作者
yklstudent 发表于 2014-4-26 09:39
一、MCU处理数据的速度太慢了
二、上位机发送数据间隔太短了

上位机无法修改

MCU是处理图像叠加数据,有可能速度跟不上。

但是客户提供了一款样机
采用的是D6453的方案(早期的产品),就没有问题。
我现在采用MB90092方案

使用特权

评论回复
13
baipengwei|  楼主 | 2014-4-26 17:04 | 只看该作者
红金龙吸味 发表于 2014-4-26 11:08
中断接收扔到FIFO,主程序处理FIFO,完全没有任何压力。
设计串口通信程序,应该首先要应用此方案,这个是 ...

兄弟,能否提供份样例参考下哈
baipengwei@163.com

使用特权

评论回复
14
baipengwei|  楼主 | 2014-4-26 17:07 | 只看该作者
airwill 发表于 2014-4-25 22:39
我觉得, 应该是中断服务的 bug 引起的. 连发两个包, 用调试器跟踪一下吧.

我用串口模拟连发两个包或者三个包
都还能正常
但是实际情况有可能连发七八个包
按照实际发送的包模拟,就不行了。

使用特权

评论回复
15
baipengwei|  楼主 | 2014-4-26 17:07 | 只看该作者
yangxf1217 发表于 2014-4-25 17:31
对你这个问题很感兴趣,有什么进展可否麻烦透露下。

使用特权

评论回复
16
huangxz| | 2014-4-26 17:10 | 只看该作者
baipengwei 发表于 2014-4-26 17:07
我用串口模拟连发两个包或者三个包
都还能正常
但是实际情况有可能连发七八个包

你是用什么单片机,有没有评估一下单片机的处理能力,
还有,你接收机制是什么,如果是爆发性的传输,必须使用fifo,如果持续大批量数据那单片机的处理速度必须够

使用特权

评论回复
17
baipengwei|  楼主 | 2014-4-26 17:21 | 只看该作者
由于以上的字符串的长度都没超过15个字符,所以上面的这些字符串可以由上位机连续发送。也就是说,为了在过车时显示这些字符,我们可以将前面所述的8帧数据合成如下的一个大帧数据发送:

81 03 01 04 00 01 05 08 81 08 01 02 01 06 81 0e 01 05 00 02 03 08 01 81 03 02 04 00 00 03 01 81 08 02 01 0B 81 0e 02 00 00 01 05 81 10 0a 08 01 04 e1 00 05 e1 02 08 81 0e 0b 0a 02 00 00 03 e7 00 03 e7 00 04

3.jpg (24.91 KB )

3.jpg

2.jpg (27.99 KB )

2.jpg

1.jpg (20.68 KB )

1.jpg

使用特权

评论回复
18
airwill| | 2014-4-26 21:58 | 只看该作者
10 楼的办法是常用解决数据突发, 来不及处理的好的解决办法.
推荐考虑一下

使用特权

评论回复
19
baipengwei|  楼主 | 2014-5-6 12:49 | 只看该作者
这几天,修改了下程序结构,在串口中断中设置了一个标志位,当串口还在发送数据的时候,不去处理缓冲区,当串口超过一个时间后,没有收到数据,就认为串口数据已经全部接收完毕,标志位再1,再去查询缓冲区.

现在能够实现,每次发过来的数据,,都保存到RXBUF[CNT]  数据(0~~cnt)
数据接收没有问题了

下一步是对数组里面的数据进行分析
RXBUF[CNT]=[81 03 01 04 00 01 05 08 81 08 01 02 01 06 81 0e 01 05 00 02 03 08 01 81 03 02 04 00 00 03 01 81 08 02 01 0B 81 0e 02 00 00 01 05 81 10 0a 08 01 04 e1 00 05 e1 02 08 81 0e 0b 0a 02 00 00 03 e7 00 03 e7 00 04]
81作为数据的头,数组里面这么多81,现在的想法是
对数组一个个判断,当遇到第一个81时候,把81后面第三个数据(数据长度)读取出来,根据数据长度,再把后面的数据读取出来,放到另外一个数组RX_1[]里面;保存后,继续寻找一个81,,直到RX_n[]..分类好各条协议后,再去做相应的显示处理..
考虑到每条协议数据总长度都没有超过15个字节
现场实际最多也就10条数据打成一个大包发送.
RX_n[]=RX_10[]
感觉这个思路有点笨笨的

有没有朋友做过数据分析的,给些好意见哈

使用特权

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

本版积分规则

个人签名:【正和壹品】铁观音茶叶直销 http://weibo.com/baipengwei 店址:盘锦市兴隆台区新玛特二楼时尚新天地羽心阁茶城A-2-12   白鹏程 送货电话:15242758169

34

主题

315

帖子

0

粉丝