全球旧事资料 分类
中断方式下进行串口通讯的正确方法
一般普遍的把串口通讯分为查询方式和中断方式。查询方式比较容易理解,各种书籍上都介绍的比较清楚。但中断方式,没有几本书讲得好的,甚至有些例程根本无法实际应用。
问题有:1,半中断法。只使用接收中断,不使用发送中断,发送时还是依靠查询中断标志的办法;如下:
ES0若是接收使用中断方式,某些单片机需要关中断。但C51不一定需要。这里只是示例。
SBUF
eedse
dcharWhileTITI0ES1这里的问题是:发送数据时需要等待数据发完才能继续其他工作,程序效率降低;发送时需要关中断,影响数据接收。
2,接收中断的处理方法错误。如下:中断程序:voidseri
terrupt4
RI0
ftempSBUF
读走数据,放入缓存(全局的)变量rx_flag1设置接收标志主程序:voidmai
hellip初始化While1
Ifrx_flag1查询接收标志
rx_flag0清楚接收标志
xtemp从暂存变量读取数据
hellip接收处理
hellip其它操作
f这里的问题是:如果串口接收数据的间隔时间小于ldquo接收处理rdquo和ldquo其它操作rdquo所用的时间时,接收数据会丢失一部分。
正确使用中断方式处理串口收发应达到以下目的:1,完全使用中断控制接收和发送,以达到最快的收发速度。2,接收和发送互不影响,达到全双工通讯效果。3,应用程序不发生等待,以达到最高运行效率。
正确的中断发送方法如下:1,建立一个足够大小的环形发送缓冲区,建立一个信号量(用于指示发送的数据量),建立一个发送标志位(用于指示发送状态)。2,应用程序将数据写入环形发送缓冲区,查询发送接收标志,若不在发送状态,手动触发中断。3,产生发送中断时,查询信号量,以判别发送缓冲区内是否有数据;若有,置发送标志位,从缓冲区读取数据发送,累减信号量;若无,清除发送标志位。
C51的例程如下:变量定义defi
eBUF_SIZE0x10环形收发缓冲区长度
f发送参数chartx_circbufBUF_SIZE环形发送缓冲区ui
t8tx_sem信号量booltx_ru
发送标志位ui
t8tx_circi
进环形缓冲区的位置指示ui
t8tx_circout出环形缓冲区的位置指示
发送初始化程序voidtx_i
itvoid
硬件初始化略发送参数初始化tx_sem0tx_ru
Falsetx_circi
0tx_circout0
中断程序voidtx_i
tvoidi
terrupt4
ifTITI0iftx_sem
SBUFtx_circbuftx_circout发送缓冲区
f中的字符
iftx_circoutBUF_SIZEtx_circout0
tx_sem累减信号量
tx_ru
True置发送标志位elsetx_ru
False清除发送标志位发送处理程序,由应用r
好听全球资料 返回顶部