请教一个关于串口中断收发的问题

piaoyizu
请教一个关于串口中断收发的问题

请求大家个问题, 关于串口传输的. 以前用串口都是用轮循方式操作的. 现在需要用中断方式收发数据. 没有操作系统的。 在纯底层下
        中断方式我是这样处理的:
        1. 建立一个全局的buffer, 一个全局的计数.
        2. 中断里收到的数据都存在这个buffer里, 如果满了就不接收.
        3. 再往下要怎么设计了呢. 数据都收在buffer中去了, 可是我应用程序怎么知道呢.  我要串口一有数据传入, 我就做相应的处理的.

        这方面经验久缺, 望有经验的大牛, 帮帮忙. 谢谢

[[i] 本帖最后由 piaoyizu 于 2008-6-29 17:11 编辑 [/i]]

zszyj
[quote]原帖由 [i]piaoyizu[/i] 于 2008-6-28 11:36 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8691128&ptid=1182727][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
请求大家个问题, 关于串口传输的. 以前用串口都是用轮循方式操作的. 现在需要用中断方式收发数据.
        中断方式我是这样处理的:
        1. 建立一个全局的buffer, 一个全局的计数.
        2. 中断里收到的数据都存在这个bu ... [/quote]
什么操作系统下啊? windows下的话, 对于中断信号应该会有事件通知吧?
UNIX下, 似乎没见过支持这种中断处理模式啊, 一般都是有个读进程以block方式来接收的.

piaoyizu
没有操作系统。 在纯底层下的。 有什么好的方法么?

system888net
[quote]原帖由 [i]piaoyizu[/i] 于 2008-6-29 17:10 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8697238&ptid=1182727][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
没有操作系统。 在纯底层下的。 有什么好的方法么? [/quote]

那只有用汇编直接操作IO地址端口了(一般PC机上com的io地址是0x2f8和0x3f8,当然在bios里可设置地址  ).

[[i] 本帖最后由 system888net 于 2008-6-29 20:55 编辑 [/i]]

insane
回复 #1 piaoyizu 的帖子

不知道这样行不行呢?
首先设一个中断标志,
在第二点,你应该可以判断buffer里的数据是否满了吧.
当buffer里的数据满了以后,你可以把中断标志置1,再做你相应的处理,
处理完后,把中断标志置0,buffer继续接收数据.

说得不是很清楚.

lqseu
回复 #1 piaoyizu 的帖子

可不可以用一个bool标志来作为中断信号,指示相应操作

piaoyizu
是从数据寄存器中取出数据到BUFFER, 可数据取满了. BUFFER 里的数据什么时候应该取呢. 这点也没有通知.

nicolas.shen
我想你是想问关于接受数据后如何发通知吧?这一点可以参考网络数据包的处理。
其实按照模块功能划分,接受模块不应该考虑上层如何处理你接受的数据,你只要保证一来数据,上层马上可以去读,并且保证一定的时间延迟内用户的相应都是有效的,这就可以了。
例如从寄存器开始往buffer里放数据,你就可以设标志位,发通知或者回调。数据的长度尽量要小,保证一段延时不溢出

NalaGinrut
[quote]原帖由 [i]piaoyizu[/i] 于 2008-6-28 11:36 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8691128&ptid=1182727][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
请求大家个问题, 关于串口传输的. 以前用串口都是用轮循方式操作的. 现在需要用中断方式收发数据. 没有操作系统的。 在纯底层下
        中断方式我是这样处理的:
        1. 建立一个全局的buffer, 一个全局的计数.
        2.  ... [/quote]


1、什么CPU?问这种问题首先要告知CPU类别
2、注册一个中断处理(没有OS的情况下应该是很好弄的,不外乎按你喜好随意建立个中断向量,然后把中断处理函数的入口地址与其中一个向量相关联),使得BUFFER满的时候产生中断(也就是计数器到位的时候来个中断),随后跳转到这个中断处理,在这个中断处理里面进行你需要的数据操作
3、悄悄问一个,你用这个来实现什么的?