打印

请问我在串口中断里控制定时器的开关可行不?

[复制链接]
2776|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
alphal|  楼主 | 2008-1-18 16:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的串口接收程序负责接收数据和判断是否接收完成,如果完成就置个标志flag1.
t1定时器模式,50ms定时检查flag1,若置位,就进行一些标志的清除和copy出数据,并通知主程序帧接收完整,可以处理了.

外部设备(主设备)发数很快,一个循环就会发一次数据,并20ms内等待我的设备(从设备)做出响应,否则就走了.

现在的问题是:要求在现有程序构架不变的情况下,能每次都响应主设备的询问,t1 50ms的扫描速度肯定是不够的,t0工作与10ms中断定时器模式,做系统时钟,我也不想将这个串口扫描的程序放到t0里,所以我现在想平时关t1运行(TR1 = 0)或者关t1中断(ET1 = 0),只有串口接收检测到已经收到完整数据帧时启动t1(TR1 = 1)或开t1中断(ET1 = 1),并置位t1中断标志(TF1 = 1),这样t1中断只在需要的时候才进入.
但我这样做了之后发现,若程序中一直开TR1或开ET1,只是接收到完整数据后置TF1=1程序是可以运行的,但若在串口中断中控制t1开启或t1中断允许是行不通的,好像t1并没有工作起来,不知道是为什么.

希望给点意见,另对现在的处理架构有什么好的建议也指点一下.

相关帖子

沙发
ayb_ice| | 2008-1-18 16:44 | 只看该作者

没有什么不行的

不过不大符合常理

使用特权

评论回复
板凳
hotpower| | 2008-1-18 17:02 | 只看该作者

只要带命令校验即可

使用特权

评论回复
地板
alphal|  楼主 | 2008-1-18 17:11 | 只看该作者

只要带命令校验即可???

这里"命令校验"是什么意思?

可是我这样做的时候好像不行,似乎t1没工作起来.
试了几次都不行......

使用特权

评论回复
5
icecut| | 2008-1-18 17:47 | 只看该作者

这样如何?

“我的串口接收程序负责接收数据和判断是否接收完成,如果完成就置个标志flag1”——这个需要认真做,最好做收到应答。否则丢一个字节会丢包。最好有重发机制或者有纠错机制,T1考虑是否可以省略,然后计算任何情况下,接受完以后直接通知主程序,主程序应答前执行的指令少于20ms,尽多留余量

使用特权

评论回复
6
alphal|  楼主 | 2008-1-19 09:28 | 只看该作者

to icecut:

我们的主设备没有应答机制,也没有纠错机制.只是不停的发询问,20ms内从设备没返回数据就走了,然后下一轮再发询问包,从设备工具自身工作情况返回一些状态参数,然后主设备往下发一些指令或数据,当发的数据包较多时,会重发三次就完(不管下面时候收到,此时没有应答机制).

现在的问题是,从串口接收到数据到,主程序执行到comm处理程序之间的时间未知,某些时候可能会大于20ms.而上一帧数据没处理完com又收到数据的话就会发生覆盖,可能出现前后两帧数据混合了.....所以需要将收到的完整数据copy到另外一个地方,指令解析的时候用,现在就是在t1中断中做这个事情.

使用特权

评论回复
7
dld2| | 2008-1-19 09:45 | 只看该作者

Re

如果要响应速度快,可以在串口收中断里直接处理主设备命令。
如果想接收信息不覆盖,可以用双缓冲、多缓冲或者循环队列。

那个t1中断是不符合常规的做法。

使用特权

评论回复
8
alphal|  楼主 | 2008-1-19 10:44 | 只看该作者

如果只是命名接收可以在串口中直接处理

如果只是命名接收可以在串口中直接处理,置个标志就可以,但是还需要返回一个应答,返回数据不能在中断中直接处理吧.


接收到完整数据后要将数据copy到另外一个缓冲区,这个动作什么时候做?中断中还是主程序中?

不过好像多缓冲,似乎可以在接收的时候指定接收的缓冲区,就不存在copy的麻烦了...

使用特权

评论回复
9
dld2| | 2008-1-19 11:06 | 只看该作者

Re

串口接收中断中,把待发送的数据放到发送缓冲区里。在串口发送中断,检查发送缓冲区是否有数据,有就发出去。

如果收到的命令是定长的,用一个二维数组来存放接收帧。
如果是不定长的,用一个大缓冲区。该缓冲区有两个指针,写指针被接收中断修改,读指针在大循环取数据时被修改。

使用特权

评论回复
10
alphal|  楼主 | 2008-1-19 11:32 | 只看该作者

......

串口接收中断中,把待发送的数据放到发送缓冲区里。在串口发送中断,检查发送缓冲区是否有数据,有就发出去。
?
re:收完后立即就填发送缓冲,然后就启动发送给发了?相当与在接收中断中就把命令给解析执行了....

如果收到的命令是定长的,用一个二维数组来存放接收帧。
re:双缓冲?


如果是不定长的,用一个大缓冲区。该缓冲区有两个指针,写指针被接收中断修改,读指针在大循环取数据时被修改。
re:一个大缓冲,接收数据顺序存放,轮番覆盖,解析也顺序解析?这样似乎比较危险,分帧可能会有点问题,特别是我们的帧是无头无尾无校验,很容易取错帧.

使用特权

评论回复
11
dld2| | 2008-1-19 11:55 | 只看该作者

呵呵,提供思路而已

使用特权

评论回复
12
alphal|  楼主 | 2008-1-19 13:03 | 只看该作者

呵呵,谢谢...

非常欢迎,希望大家给点意见...

使用特权

评论回复
13
wacke| | 2008-1-19 13:35 | 只看该作者

你说是的接收超时吧。

你说的是接收超时吧。那每收到一个数据都要重置定时器。再在定时器超时时设超时标志。并关闭定时器。这样是完全没有问题的。我在KWP程序中就是这么用的。没发现在任何问题。

使用特权

评论回复
14
alphal|  楼主 | 2008-1-19 14:26 | 只看该作者

接收超时?

我的程序也有超时机制

程序运行最小时钟是10ms,主设备发数频率太快(发完一个包等20ms就走,下个循环继续发).
现在是接收数据正确(状态机判断现在应该接收的数据)才复位超时定时器,错误状态时置com进入保护态(30ms不接收任何数据).

使用特权

评论回复
15
alphal|  楼主 | 2008-1-21 13:02 | 只看该作者

waiting....

使用特权

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

本版积分规则

112

主题

473

帖子

1

粉丝