diff --git a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/src/ch438_demo.c b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/src/ch438_demo.c index 0297b5a6e..490f8ec30 100644 --- a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/src/ch438_demo.c +++ b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/src/ch438_demo.c @@ -55,16 +55,16 @@ void CH438Demo(void) while(1) { CH438UARTSend(2,"AT+BAUD=?",9); - ImxrtCh438ReadData(NULL); + ImxrtCh438ReadData(2); up_mdelay(1000); CH438UARTSend(2,"AT+NAME=?",9); - ImxrtCh438ReadData(NULL); + ImxrtCh438ReadData(2); up_mdelay(1000); CH438UARTSend(2,"AT+ADDR=?",9); - ImxrtCh438ReadData(NULL); + ImxrtCh438ReadData(2); up_mdelay(1000); CH438UARTSend(2,"AT+MODE=?",9); - ImxrtCh438ReadData(NULL); + ImxrtCh438ReadData(2); up_mdelay(1000); } } diff --git a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/src/imxrt_ch438.c b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/src/imxrt_ch438.c index b88bf353c..912ad4a46 100644 --- a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/src/imxrt_ch438.c +++ b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/src/imxrt_ch438.c @@ -44,21 +44,24 @@ #include #include +#define CH438PORTNUM 8 +#define BUFFERSIZE 128 + /**************************************************************************** * Private Data ****************************************************************************/ /* Semaphore for receiving data */ -static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;; +static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; -volatile int done = 0; +volatile int done[CH438PORTNUM] = {0}; static uint8_t RevLen; -static uint8_t buff[8][128]; -static uint8_t buff_ptr[8]; -static uint8_t Interruptnum[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,}; /* SSR寄存器中断号对应值 */ -static uint8_t offsetadd[] = {0x00,0x10,0x20,0x30,0x08,0x18,0x28,0x38,}; /* 串口号的偏移地址 */ +static uint8_t buff[CH438PORTNUM][BUFFERSIZE]; +static uint8_t buff_ptr[CH438PORTNUM]; +static uint8_t Interruptnum[CH438PORTNUM] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,}; /* SSR寄存器中断号对应值 */ +static uint8_t offsetadd[CH438PORTNUM] = {0x00,0x10,0x20,0x30,0x08,0x18,0x28,0x38,}; /* 串口号的偏移地址 */ static uint8_t gInterruptStatus; @@ -89,7 +92,7 @@ static uint8_t CH438UARTRcv(uint8_t ext_uart_no, uint8_t* buf); ****************************************************************************/ int getInterruptStatus(int argc, char **argv) { - int ext_uart_no = 2; + uint8_t ext_uart_no = 0; while(1) { pthread_mutex_lock(&mutex); @@ -99,11 +102,15 @@ int getInterruptStatus(int argc, char **argv) pthread_mutex_unlock(&mutex); continue; } - if(gInterruptStatus & Interruptnum[ext_uart_no]) + + for(ext_uart_no = 0; ext_uart_no < CH438PORTNUM; ext_uart_no++) { - done = 1; - pthread_cond_signal(&cond); - pthread_mutex_unlock(&mutex); + if(gInterruptStatus & Interruptnum[ext_uart_no]) + { + done[ext_uart_no] = 1; + pthread_cond_signal(&cond); + pthread_mutex_unlock(&mutex); + } } } } @@ -147,113 +154,6 @@ void CH438SetInput(void) imxrt_config_gpio(CH438_D7_PIN_INPUT); } -/**************************************************************************** - * Name: ImxrtCh438ReadData - * - * Description: - * Read data from ch438 port - * - ****************************************************************************/ -void ImxrtCh438ReadData(void *parameter) -{ - int result, i; - uint8_t InterruptStatus; - uint8_t ext_uart_no; - uint8_t REG_IIR_ADDR; - uint8_t REG_LSR_ADDR; - uint8_t REG_MSR_ADDR; - - pthread_mutex_lock(&mutex); - while(done == 0) - pthread_cond_wait(&cond, &mutex); - if (done == 1) - { - ext_uart_no = 2; - REG_IIR_ADDR = offsetadd[ext_uart_no] | REG_IIR0_ADDR; - REG_LSR_ADDR = offsetadd[ext_uart_no] | REG_LSR0_ADDR; - REG_MSR_ADDR = offsetadd[ext_uart_no] | REG_MSR0_ADDR; - InterruptStatus = ReadCH438Data(REG_IIR_ADDR) & 0x0f; /* 读串口的中断状态 */ - _info("InterruptStatus is %d\n", InterruptStatus); - - switch( InterruptStatus ) - { - case INT_NOINT: /* 没有中断 */ - break; - case INT_THR_EMPTY: /* THR空中断 */ - break; - case INT_RCV_OVERTIME: /* 接收超时中断,收到数据后一般是触发这个 。在收到一帧数据后4个数据时间没有后续的数据时触发*/ - case INT_RCV_SUCCESS: /* 接收数据可用中断。这是一个数据帧超过缓存了才发生,否则一般是前面的超时中断。处理过程同上面的超时中断 */ - RevLen = CH438UARTRcv(ext_uart_no, buff[ext_uart_no]); - for(i=0;i