;*
;* 从 USART 端口上接收到的通信协议命令处理子程序 - “USART_RXD_COMM”
;*
;* 说明:
;* 本子程序用于从 USART 端口上接收到的通信协议命令处理。
;* 本子程序要在主程序中不间断循环查询运行。
;*
;*******************************************************************************
USART_RXD_COMM:
lds ZL,USARTAI_RXUPD ;检查接收作业是否己更新?
cpi ZL,USARTAI_RUPDI ;否,直接返回
breq USART_RXD_COMMTO1 ;是,则继续
rjmp USART_RXD_COMM_RET
USART_RXD_COMMTO1:
lds ZL,USARTAI_RXCOM ;检查接收作业是否为接收命令?
cpi ZL,USARTAI_RCOMI ;否,直接返回
breq USART_RXD_COMMTO2 ;是,则继续
rjmp USART_RXD_COMM_RET
USART_RXD_COMMTO2:
lds ZL,USARTAI_RXEnd ;检查接收作业是否全部结束?
cpi ZL,USARTAI_REndI ;否,转至接收错误处理
breq USART_RXD_COM_CAHead ;是,则继续
rjmp USART_RXD_COMM_Error
USART_RXD_COM_CAHead:
ldi YL,Low(USARTAI_RXCOA) ;置首个接收命令字符地址指针
ldi YH,High(USARTAI_RXCOA)
ldi ZL,Low(COMAgreement_Head*2) ;置通信协议命令开头标识字符串地址指针
ldi ZH,High(COMAgreement_Head*2)
lpm USARTAI_TEMP,Z+ ;置循环计数器初值=开头命令字长度数值
MOV CTRLCOM_CNT,USARTAI_TEMP
rcall CTRLCOMM_IdentifyCOM ;识别通信协议命令开头标识字符串
MOV USARTAI_TEMP,CCTSSDV_Right
cpi USARTAI_TEMP,CCTSSDV_RightI ;检查接收字节是否为命令开头标识字符?
breq USART_RXD_COM_EAddr ;是,则继续
rjmp USART_RXD_COMM_Error ;否,转至接收错误处理
USART_RXD_COM_EAddr:
ldi ZL,Low(COMAgreement_Head*2) ;置通信协议命令开头标识字符串地址指针
ldi ZH,High(COMAgreement_Head*2)
lpm USARTAI_TEMP2,Z+ ;读取开头命令字长度数值
clr USARTAI_TEMP
add YL,USARTAI_TEMP2 ;置 Y 指针为本端口编号字符串的地址指针
adc YH,USARTAI_TEMP
ldi USARTAI_TEMP3,CTRLCDN_CharNI;置循环计数器初值=本端口编号长度数值
ldi EEPROM_AddrL,Low(CC_EEPROM_DNAr)
ldi EEPROM_AddrH,High(CC_EEPROM_DNAr)
;置在 EEPROM 中的本端口编号地址指针
USART_RXD_COM_EAddr1:
call EEPROM_ReadSingle ;读取 EEPROM 中的本 USART 端口编号
MOV USARTAI_TEMP2,EEPROM_Data
ld USARTAI_TEMP,Y+
cp USARTAI_TEMP,USARTAI_TEMP2 ;检查是否为本 USART 端口编号?
brne USART_RXD_COM_EAddr2 ;否,转至非本 USART 端口编号处理
adiw EEPROM_AddrL,$01 ; EEPROM 中的端口编号地址指针 + 1
dec USARTAI_TEMP3 ;端口编号字符串长度数值长度数值 — 1
brne USART_RXD_COM_EAddr1 ;端口编号识别完否?未完,则继续识别
rjmp USART_RXD_COMM1
USART_RXD_COM_EAddr2:
rjmp USART_RXD_COMM_NOADDR
USART_RXD_COMM1:
ldi ZL,Low(USART_AskTX*2) ;置“向我方请求发送数据”命令地址指针
ldi ZH,High(USART_AskTX*2)
ldi CTRLCOM_CNT,USARTAI_CMANI ;置计数器初值=有效命令字长度数值
rcall CTRLCOMM_IdentifyCOM ;对此条命令进行识别
cpi CCTSSDV_Right,CCTSSDV_RightI;命令是否为“向我方请求发送数据”?
brne USART_RXD_COMM2 ;否,则继续
rcall USART_RX_COMM_AskTX ;是,调用处理此条命令处理程序
rjmp USART_RXD_COMM_RET
USART_RXD_COMM2:
ldi ZL,Low(USART_DataOK*2) ;置“对方接收数据正确”命令地址指针
ldi ZH,High(USART_DataOK*2)
ldi CTRLCOM_CNT,USARTAI_CMANI ;置计数器初值=有效命令字长度数值
rcall CTRLCOMM_IdentifyCOM ;对此条命令进行识别
cpi CCTSSDV_Right,CCTSSDV_RightI;命令是否为“对方接收数据正确”?
brne USART_RXD_COMM3 ;否,则继续
rcall USART_RX_COMM_DataOK ;是,调用处理此条命令处理程序
rjmp USART_RXD_COMM_RET
USART_RXD_COMM3:
ldi ZL,Low(USART_REPTX*2) ;置“要求我方重新发送”命令地址指针
ldi ZH,High(USART_REPTX*2)
ldi CTRLCOM_CNT,USARTAI_CMANI ;置计数器初值=有效命令字长度数值
rcall CTRLCOMM_IdentifyCOM ;对此条命令进行识别
cpi CCTSSDV_Right,CCTSSDV_RightI;命令是否为“要求我方重新发送”?
brne USART_RXD_COMM4 ;否,则继续
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] 下一页
本文关键字:通信 程序 AVR单片机,单片机-工控设备 - AVR单片机