uart接收改为指定函数发送

本文介绍如何将UART的默认接收方式改为通过指定函数进行数据发送,从而提高通信效率和系统性能。主要内容包括禁用原有的指定接收地址,改用自定义函数实现数据的发送流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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--;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值