全球旧事资料 分类
程序调用输入:发送数据指针发送数据长度voidtx_datachartxbufui
t8le
whilele
tx_circbuftx_circi
txbuf存入数据到发送缓冲区iftx_circi
BUF_SIZEtx_circi
0tx_sem累减信号量le
iftx_ru
FalseTI1查询发送状态标志。若发送空闲,触发中断,发送数据的工作由中断程序自
f动完成。
正确的中断接收方法如下:1,建立一个足够大小的环形接收缓冲区,建立一个信号量(用于指示接收的数据量)。2,发生接收中断时,读出字节放入接收缓冲区,并累加信号量。3,应用程序查询接收标志,如信号量不为0,则从接收缓冲区读取数据进行处理,累减信号量。
C51的例程如下:变量定义defi
eBUF_SIZE0x10环形收发缓冲区长度接收参数charrx_circbufBUF_SIZE环形接收缓冲区ui
t8rx_sem信号量ui
t8rx_circi
进环形缓冲区的位置指示ui
t8rx_circout出环形缓冲区的位置指示
接收初始化程序voidrx_i
itvoid
硬件初始化略
f接收参数初始化rx_sem0rx_circi
0rx_circout0
中断程序voidrx_i
tvoidi
terrupt4
ifRIRI0rx_circbufrx_circi
SBUF读出字节放入
接收缓冲区ifrx_circi
BUF_SIZErx_circi
0rx_sem累加信号量
接收处理程序,由应用程序调用输出:读出数据指针;返回:接收到的数据长度ui
t8rx_datacharrxbuf
ui
t8ii0whilerx_sem
rxbufrx_circbufrx_circout从接收缓
f冲区读取数据ifrx_circoutBUF_SIZErx_circout0rx_sem累减信号量i
retur
i
上述的收发中断程序在应用中合并在一起,即:voiduart_i
itvoidi
terrupt4
ifTITI0hellip
ifRI
RI0hellip例程中分开表述,只是为了将流程说得更明白些。上述例程中,未包含环形收发缓冲区溢出状况的处理,需要时自行添加。
f上述例程表明了正确使用中断方式处理串口通讯的思路。当然程序还可以有其它的写法,特别是环形缓冲区中数据出入的方法和信号量的用法。如在有操作系统的情况下,上述信号量的使用就可以得到操作系统更好支持。
完全中断方式收发数据总结:1。数据的收发操作,完全由中断程序自动进行,可以达到最快的收发速度。即,接收时中断程序负责把数据放入缓冲区,数据的处理由应用程序另行处理;发送时应用程序直接将数据放入缓冲区,启动发送中断后,发送的工作由中断程序自动完成。2。由于发送的工作完全由中断处理,因此,应用程序将数据放入缓冲区后,就可以继续运行其它工作,这种ldquo发了不管rdquo的方式极大地提高程序运行效率。3。接收数据时,由中断负责将数r
好听全球资料 返回顶部