打印
[51单片机]

51串口接收一串数据的编程思路

[复制链接]
3948|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qhtflsw|  楼主 | 2016-5-24 10:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
读10串数据,只能处理到4串。思路是在接收中断建立缓存数组。然后读完一串置标志。在主程序20MS轮询标志并做处理,判断帧头和校验码。但是还是会丢失,感觉处理不过来。是不是我没关中断引起的?

串口需要注意哪些?

有没有好的关于串口接收处理的思路??

相关帖子

沙发
ningling_21| | 2016-5-24 11:15 | 只看该作者
跟关不关中断关系不大
串口接收完成处理数据的时间不要超过接收两个字节之间的时间
或者主程序轮询的时间间隔不要超过接收一帧数据的时间

使用特权

评论回复
板凳
ayb_ice| | 2016-5-24 12:27 | 只看该作者
缓冲搞大点,尽快处理

使用特权

评论回复
地板
泰山特曲123| | 2016-5-24 12:43 | 只看该作者
你要把缓存数组搞成环形队列!你计算一下处理一串的时间,然后这个时间内会收到多少串,缓冲区设成比这个值大点就行了

使用特权

评论回复
5
any012| | 2016-5-24 15:35 | 只看该作者
本帖最后由 any012 于 2016-5-24 15:36 编辑

菜鸟想请教下,是这样子吗:
中断程序不停的把接收到的数放到一个循环数组里,主程序里判断这个数组里的帧首及校验?

如果是这样的话,那么主程序里怎么判断这个帧首呢?对数组里的数一个一个的去判断?

使用特权

评论回复
6
ningling_21| | 2016-5-24 15:51 | 只看该作者
any012 发表于 2016-5-24 15:35
菜鸟想请教下,是这样子吗:
中断程序不停的把接收到的数放到一个循环数组里,主程序里判断这个数组里的帧 ...

协议简单的话,帧首和校验完全在中断里就可以完成

或者复杂的在中断判断一帧接收完成时置位标志,再在主程序中判断帧内容

使用特权

评论回复
7
any012| | 2016-5-24 16:11 | 只看该作者
ningling_21 发表于 2016-5-24 15:51
协议简单的话,帧首和校验完全在中断里就可以完成

或者复杂的在中断判断一帧接收完成时置位标志,再在主 ...

我现在在处理spi接收中断时遇到了问题,能帮分析下吗?
详见:https://bbs.21ic.com/forum.php?mo ... p;extra=#pid6974566

使用特权

评论回复
8
yangxf1217| | 2016-5-24 16:20 | 只看该作者
关注。。。

使用特权

评论回复
9
前功尽弃| | 2016-5-24 20:12 | 只看该作者
做一个环形队列,应该可以

使用特权

评论回复
10
yklstudent| | 2016-5-25 08:43 | 只看该作者
提高处理速度,缓存再搞大点;
还有这10串数据怎么来的?

使用特权

评论回复
11
robter| | 2016-5-25 09:05 | 只看该作者
any012 发表于 2016-5-24 16:11
我现在在处理spi接收中断时遇到了问题,能帮分析下吗?
详见:https://bbs.21ic.com/forum.php?mod=viewth ...

很好很好,学习学习

使用特权

评论回复
12
oufuqiang| | 2016-5-25 09:07 | 只看该作者
本帖最后由 oufuqiang 于 2016-5-25 09:10 编辑

楼主你的数据帧格式是怎么样的啊

我之前写了个485的IO小节点,自定义的帧格式,数据随便折腾都不会乱机死机,改天有空了贴出来。

使用特权

评论回复
13
qhtflsw|  楼主 | 2016-5-25 11:51 | 只看该作者
本帖最后由 qhtflsw 于 2016-5-25 17:10 编辑
ningling_21 发表于 2016-5-24 11:15
跟关不关中断关系不大
串口接收完成处理数据的时间不要超过接收两个字节之间的时间
或者主程序轮询的时间间 ...


100MS发送一次,发送后从机才回我。所以间隔应该是够得,一串数据计算了一下,9600波特率,一位就是0.104MS,一帧10位,一串有10帧。大概有10MS长度。我20MS处理一次应该稳了。
但是没有用晶振,用的是内部12M,波特率没那么准,有累计误差,理论是9615.385bps。

使用特权

评论回复
14
datouyuan| | 2016-5-26 10:32 | 只看该作者
假如自己定协议的话,通过识别帧尾加接收超时最简单了.

中断服务函数:收到一个数据后,超时计时重新开始,存入环形缓存.并判断是否是帧尾,如是加帧尾标志.
主函数          : 根据接收超时标志和帧尾标志处理环形缓存的数据.

使用特权

评论回复
15
mailshichao| | 2016-5-26 11:36 | 只看该作者
基本上是因为程序整体编程的原因,不能单单想串口接收部分, 还有其他部分,你试试不处理其他任务,只接收串口数据,看看会不会丢数据

使用特权

评论回复
16
qhtflsw|  楼主 | 2016-5-26 11:42 | 只看该作者
解决了。低级错误导致,少+1。
改为都不判定帧头,直接在主程序中判定。中断程序不做处理,减轻CPU负担。

使用特权

评论回复
17
luofeng2g| | 2016-5-26 11:47 | 只看该作者
搞个大点的fifo基本上就没有问题了

使用特权

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

本版积分规则

59

主题

164

帖子

4

粉丝