MT6276平台接到任务要做一个虚拟AT,软件模拟串口发送AT指令并获取返回的内容,简单整理一下流程
UART1_HISR //根据IIR类型判断tx or rx
//UART_IIR_CTI
UART1_HISR->UART_RecHandler(&UARTPort[uart_port1]);->UARTPort[UARTData->port_no].rx_cb(UARTData->port_no); == UART_dafault_rx_cb
->UART_sendilm(port, MSG_ID_UART_READY_TO_READ_IND); //from MOD_DRV_HISR to UARTPort[port].ownerid
->发消息到MOD_TST_READER,处理后再调用
->DclSerialPort_Control(handle,SIO_CMD_GET_BYTES, (DCL_CTRL_DATA_T*)&data_getbyte);
最终调用DCL_STATUS UART_Handler(DCL_DEV dev,DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data) //return buffer
//UART_IIR_THRE
UART1_HISR->UART_TrxHandler(&UARTPort[uart_port1]);->UARTPort[UARTData->port_no].tx_cb(UARTData->port_no); == UART_dafault_tx_cb
->UART_sendilm(port, MSG_ID_UART_READY_TO_WRITE_IND); //from MOD_DRV_HISR to UARTPort[port].ownerid //MOD_ATCI==41
->发消息到MOD_TST_READER,处理后再调用
->DclSerialPort_Control(handle,SIO_CMD_PUT_BYTES, (DCL_CTRL_DATA_T*)&data_getbyte);
最终调用DCL_STATUS UART_Handler(DCL_DEV dev,DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data) //send buffer
软件处理:直接发送MSG_ID_UART_READY_TO_READ_IND到MOD_ATCI,会调用UART_Handler中SIO_CMD_GET_BYTES获取at命令,在此处给指针赋值并且中断从串口读取数据的流程,完成后MOD_ATCI会继续调用UART_Handler中SIO_CMD_PUT_BYTES输入AT命令返回的结果,在此处可以拷贝一份传给软件处理,此处同时会传递给串口往外输出,取消还是保留看客户需求吧
参考文章:http://bbs.ednchina.com/BLOG_ARTICLE_1801887.HTM