51单片机串口数据发送和定时器中断问题

comdoc 2009-10-12 09:05:59
单片机型号是AT89LS52

现在的程序结构是:

timer0:由蜂鸣器操作触发,触发期间大概每0.3毫秒中断一次,中断服务函数处理少量蜂鸣器代码(7行);

timer1:从系统启动到关机结束一直开启,每2毫秒中断一次,中断服务函数处理代码较多。

串口波特率:115200,由timer2产生;
中断优先级串口最高,也即设置IP=0X10;
串口接收数据以中断方式,发送数据以轮询方式。


出现的问题是:

当timer0中断触发时(由蜂鸣器操作触发),会严重影响串口通信,单片机在收到数据后要向上位机回复数据,上位机每次都能收到数据,但是收到的回复数据100次中会有30次左右为错误数据,最常见的是帧头的首字符错误(应该为2,但是收到的为0)。

当屏蔽掉timer0中断后,只有timer1中断和串口中断工作,上位机还是会有收到数据错误的问题,但错误的次数大为减少,而且若精简timer1中断服务函数中的代码,错误还会继续下降。若将timer1中断由2ms改为30ms一次后,再不会发生串口发送数据错误问题。


我也是该开始接触嵌入式编程,51也是第一次见,很多技术细节不甚清楚,那位仁兄有这方面的经验,还望不吝赐教,尤其是怎么理清这些中断间的关系和干扰?还串口发送数据(轮询方式)时要注意的关键问题等。我已经被困扰了2天了,很郁闷。
...全文
1759 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yxmx2008 2009-11-27
  • 打赏
  • 举报
回复
非常刚性!!
comdoc 2009-10-26
  • 打赏
  • 举报
回复
修改了串口接收中断服务函数到只有5行左右,使用了环形队列来存储收到的数据;问题解决了,看来还是串口中断服务函数过于庞杂所致,导致接收时超时,后一个数据覆盖了前一个数据所致。
zhoushunda960 2009-10-23
  • 打赏
  • 举报
回复
发送也用中断方式我想也许会好些吧?
我原来写过带虚拟串口的程序,就是正常串口与虚拟串口需要同时接受和发送数据。正常串口数据发送也用查询方式,虚拟串口误码率在百分之20左右,后来正常串口发送改为中断方式,虚拟串口误码率一下降到了百分之5以内。
不过我的波特率没你那么高,正常串口9600,虚拟串口4800
DISINHUI 2009-10-14
  • 打赏
  • 举报
回复
建议:
1。中断函数服务代码不错过10行。只进行状态确认,标志位处理。
2。主函数处理中断中发生的标志位变动。
3。好好看看化为的软件工程师手册。
stude 2009-10-13
  • 打赏
  • 举报
回复
发送和接收一个是查询 一个是中断方式 为什么不全用中断方式
qq380058706 我们讨论讨论
贝隆 2009-10-12
  • 打赏
  • 举报
回复
0.3ms,我怕你的硬件达不到。
comdoc 2009-10-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 great_bug 的回复:]
51处理这样快的中断,有点不够了......
[/Quote]timer0的0.3ms这个我想直接不用中断了,用for循环算了,但是timer1的2ms没法拿到中断外面去,只能由定时器来做。
Great_Bug 2009-10-12
  • 打赏
  • 举报
回复
51处理这样快的中断,有点不够了......
Great_Bug 2009-10-12
  • 打赏
  • 举报
回复
0.3毫秒/2毫秒......太繁忙了........

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧