CI1302串口中断接收与查询发送

问题:每次接收间隔6秒左右,知道问题原因的请留言

/*

    串口中断函数

*/

void vUARTInterrupt_Handler( void )

{

    char cChar;

    /*发送*/

    // if(UART2->UARTMIS & (1UL << UART_TXInt))

    // {

    //  /* The interrupt was caused by the THR becoming empty.  Are there any

    //  more characters to transmit? */

    //  if( xQueueReceiveFromISR( xCharsForTx, &cChar, &xHigherPriorityTaskWoken ) == pdTRUE )

    //  {

    //      /* A character was retrieved from the queue so can be sent to the

    //      THR now. */

    //      UART2->UARTWrDR = (unsigned int)cChar;

    //  }

    //  else

    //  {

    //      UART_IntMaskConfig( UART2, UART_TXInt, ENABLE );        

    //  }

    //}

    /*接收*/

    //判断中断标志位

    if(UART2->UARTMIS & (1UL << UART_RXInt))

    {

        //非阻塞方式接收

        cChar = UART_RXDATA(UART2);

        //非阻塞方式发送

        // UART_TXDATAConfig(UART2,(unsigned int)cChar);

        //查询方式发送

        UartPollingSenddata(UART2,cChar);

    }

    //清除中断标志位

    UART_IntClear(UART2,UART_AllInt);

}

/*

    用户初始化

*/

void User_init(void)

{

    //设置串口2中断优先级

    eclic_irq_set_priority(UART2_IRQn, 2, 0);

    //设置串口2中断为向量表中断

    eclic_set_vmode(UART2_IRQn);

    //关联串口2中断函数

    __eclic_irq_set_vector(UART2_IRQn, (int32_t)vUARTInterrupt_Handler);

    //使能串口2中断

    eclic_irq_enable(UART2_IRQn);

    //串口2配置为中断模式,波特率921600

    UARTInterruptConfig(UART2,UART_BaudRate921600);

}

/*

    用户主程序任务

*/

static void User_main(void *p_arg)

{

    while (1)

    {        

        //延时1000ms

        vTaskDelay(1000);

    }

    //注销当前任务

    vTaskDelete(NULL);

}

/**

 * @brief

 *

 */

int main(void)

{

    hardware_default_init();

    /*平台相关初始化*/

    platform_init();

    //用户初始化

    User_init();

    /* 版本信息 */

    welcome();

    /* 创建启动任务 */

    xTaskCreate(task_init,"init task",280,NULL,4,NULL);

    //创建用户主程序任务

    xTaskCreate(User_main,"User main",280,NULL,4,NULL);

    /* 启动调度,开始执行任务 */

    vTaskStartScheduler();

    while(1){}

}

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 STM32 的串口中断中,可以使用循环缓冲区的方式来处理同时接收多个字符串的情况。具体操作步骤如下: 1. 在初始化串口时,开启接收中断,并设置接收中断优先级。 2. 在中断服务函数中,先判断接收中断标志位是否置位,如果是,则将接收到的数据存入循环缓冲区。 3. 在主程序中,通过判断循环缓冲区中是否有完整的字符串,来处理多个字符串的接收。可以使用字符串结束符(例如 '\0')来判断字符串是否接收完整。 4. 处理完整的字符串后,可以将其从循环缓冲区中删除,以便下一个字符串的接收。 以下是一个简单的示例代码: ```c #define BUF_SIZE 128 char rx_buffer[BUF_SIZE]; int rx_head = 0, rx_tail = 0; void USART1_IRQHandler(void) { if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { char ch = USART_ReceiveData(USART1); int next_head = (rx_head + 1) % BUF_SIZE; if (next_head != rx_tail) { rx_buffer[rx_head] = ch; rx_head = next_head; } } } int main(void) { // 初始化串口和循环缓冲区 while (1) { // 处理完整的字符串 while (rx_head != rx_tail) { int len = 0; for (int i = rx_tail; i != rx_head; i = (i + 1) % BUF_SIZE) { if (rx_buffer[i] == '\0') { len = i - rx_tail + 1; break; } } if (len > 0) { // 处理完整的字符串 // ... // 从缓冲区中删除字符串 rx_tail += len; if (rx_tail >= BUF_SIZE) { rx_tail -= BUF_SIZE; rx_head -= BUF_SIZE; } } else { // 没有完整的字符串,退出循环 break; } } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值