1、禁用原有每次指定接收地址
void app_uart_rx_done(void)
{
if (app_uart_env.len == QN_UART_RX_LEN-1)
app_uart_env.len = 0;
else
app_uart_env.len += 1;
//printf("app_uart_env.len=%d\r\n",app_uart_env.len);
// uart_read(QN_DEBUG_UART, app_uart_env.buf_rx+app_uart_env.len, 1, app_uart_rx_done);
}
2、中断中只保留递增指针和反馈函数
void UART0_RX_IRQHandler(void)
{
uint32_t reg;
#ifdef print_use__uart_write
uint8_t i;
#endif
reg = uart_uart_GetIntFlag(QN_UART0);
if ( reg & UART_MASK_BE_IF) { // Break error interrupt
// clear interrupt
uart_uart_ClrIntFlag(QN_UART0, UART_MASK_BE_IF);
}
else if ( reg & UART_MASK_PE_IF ) { // Parity error interrupt
// clear interrupt
uart_uart_ClrIntFlag(QN_UART0, UART_MASK_PE_IF);
}
else if ( reg & UART_MASK_FE_IF ) { // Framing error interrupt
// clear interrupt
uart_uart_ClrIntFlag(QN_UART0, UART_MASK_FE_IF);
}
else if ( reg & UART_MASK_OE_IF ) { // Overrun error interrupt
// clear interrupt
uart_uart_ClrIntFlag(QN_UART0, UART_MASK_OE_IF);
}
else if ( reg & UART_MASK_RX_IF ) { // RX FIFO is not empty interrupt
// clear interrupt
reg = uart_uart_GetRXD(QN_UART0);
#if 1
*uart0_env.rx.bufptr++=reg;
// uart0_env.rx.size++;
if(reg==10){//»»ÐÐ
// Disable UART all rx int
uart_rx_int_enable(QN_UART0, MASK_DISABLE);
}
// printf("get=%02X\r\n",reg);
#if UART_CALLBACK_EN==TRUE
// Call end of reception callback
if(uart0_env.rx.callback != NULL)
{
uart0_env.rx.callback();
}
#endif
#endif
3、调用函数 完成uart数据发送
void app_uart_rx_deal(void)
{
// if (app_uart_env.buf_rx[app_uart_env.len] == 0x0A)
{
struct app_uart_data_req *req = ke_msg_alloc(APP_SYS_UART_DATA_IND,
TASK_APP,
TASK_NONE,
sizeof(struct app_uart_data_req) + (app_uart_env.len - 1));
// app_uart_env.buf_rx[app_uart_env.len-1] = '\0';
req->len = app_uart_env.len;
memcpy(req->data, app_uart_env.buf_rx, app_uart_env.len);
ke_msg_send(req);
#if 1
int8_t i;
printf("app_uart_env.len= %d\r\n",app_uart_env.len);
for(i=0;i<app_uart_env.len;i++)
{
printf("app_uart_env.buf_rx[%d]= %d\r\n",i,app_uart_env.buf_rx[i]);
}
#endif
for(i=0;i<app_uart_env.len;i++) uart0_env_rx_bufptr_reset();
app_uart_env.len = 0;
}
}
其中uart0_env_rx_bufptr_reset为指针归位的操作,在uart.c里:
void uart0_env_rx_bufptr_reset(void)
{
uart0_env.rx.bufptr--;
}