sts USARTAI_RXUPD,ZL
USART_RX_COMM_CTRLCOM_RET:
ret ;子程序返回
;*** 此段程序用于接收到[重新初始化完成]命令处理
USART_RX_COMM_RINIOK:
clr ZL ;清除接收作业己更新标志
sts USARTAI_RXUPD,ZL
ret ;子程序返回
;*** 此段程序用于接收到[要求对方重新初始化]命令处理
USART_RX_COMM_REPINI:
ldi ZH,(1<<RXCIE)|(1<<UDRIE)|(1<<RXEN)|(1<<TXEN)
com ZH ;禁止接收器和发送器,禁止 USART
in ZL,UCSRB ;接收结束中断和数据寄存器空中断
and ZL,ZH
out UCSRB,ZL
;此处插入从头开始重新进行数据处理操作程序
ldi ZH,(1<<FE)|(1<<DOR)|(1<<PE)
com ZH ;清除帧错误(FE)、数据溢出(DOR)
in ZL,UCSRA ;及奇偶校验错误(UPE)标志
and ZL,ZH
out UCSRA,ZL
ldi ZH,(1<<UDRE)
in ZL,UCSRA ;置数据寄存器空(UDRE)标志
or ZL,ZH
out UCSRA,ZL
rcall USART_AINT_INI ;重新初始化 USART 异步中断接收和发送
rcall USART_TX_COMM_RINIOK ;向对方发送“重新初始化完成”命令
ret ;子程序返回
;*** 此段程序用于接收到[向对方请求发送]命令处理
USART_RX_COMM_AskTX:
lds ZL,DataUPD_RXALW ;接收数据是否己处理?
cpi ZL,DataUPD_RALWI ;是,继续
breq USART_RX_COMM_AskTX_RET ;否,返回,等待处理接收数据
lds ZL,USARTAI_TXEnd ;发送作业是否全部结束?
cpi ZL,USARTAI_TEndI ;是,继续
brne USART_RX_COMM_AskTX_RET ;否,返回,等待发送作业结束
rcall USART_TX_COMM_OKRX ;向对方发送“允许对方发送”命令
clr ZL ;清除接收命令作业标志
sts USARTAI_RXCOM,ZL
ldi ZL,DataUPD_RALWI ;置允许处理接收数据标志值
sts DataUPD_RXALW,ZL
clr ZL ;清除接收作业己更新标志
sts USARTAI_RXUPD,ZL
USART_RX_COMM_AskTX_RET:
ret ;子程序返回
;*** 此段程序用于接收到[允许对方发送]命令处理
USART_RX_COMM_OKRX:
lds ZL,DataUPD_TXALW ;发送数据是否己更新?
cpi ZL,DataUPD_TALWI ;是,继续
breq USART_RX_COMM_OKRX_RET ;否,返回,等待更新发送数据
lds ZL,USARTAI_TXEnd ;发送作业是否全部结束?
cpi ZL,USARTAI_TEndI ;是,继续
brne USART_RX_COMM_OKRX_RET ;否,返回,等待发送作业结束
clr ZL ;清除发送命令作业标志
sts USARTAI_TXCOM,ZL
rcall USART_AINT_TXINI ;启动发送数据
clr ZL ;清除接收作业己更新标志
sts USARTAI_RXUPD,ZL
USART_RX_COMM_OKRX_RET:
ret ;子程序返回
;*** 此段程序用于接收到[要求对方重新发送]命令处理
USART_RX_COMM_REPTX:
lds ZL,USARTAI_ERRNum ;USART 发生收发错误次数是否超过允许次数?
cpi ZL,USARTAI_ENALWI ;是,转至 USART 通信发生错误处理
brlo USART_RX_COMM_REPTX1 ;否,继续
rcall USART_Error ;调用 USART 通信发生错误处理程序
rjmp USART_RX_COMM_REPTX_RET ;返回
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] 下一页
本文关键字:通信 程序 AVR单片机,单片机-工控设备 - AVR单片机