ss1969 发表于 2016-1-26 17:30:49

大概搞清楚了问题所在。。。还是直接跟踪代码最靠谱。
详细解释如下:

首先我先做好的是非中断模式的处理,因为用了一个buffer做xprintf的格式解析,所以做了一个mutex来保护;
然后改成中断函数发送之后。。。。出问题就是因为这个mutex在TX End ISR里面做give不行。。改成giveSemaphoreFromISR也不行(这有点奇怪,尚不知原因)
最后必须用网上例程那种简单的int变量来阻塞才行(TX ISR直接把这个int设1)。

还有一点比较奇怪的就是,CubeMX配置的FreeRTOS工程,即使按照上面的说法用中断方式,在main.c里面*连续*调用2次中断函数发送就会失败,原因是第二次调用发送函数之前,取状态while(busy=SET){}的时候,会一直卡住,第一次发送的完成中断直接无法进入,就无法把busy设成UNSET。在StartDefaultTask里面发送就没有问题。这点也需要高人解惑。如果只调用1次就没问题,第二次call之前一定能够把busy设为UNSET。

ss1969 发表于 2016-1-26 17:31:43

watershade 发表于 2016-1-26 09:31
我用401做一个实验一下

搞定,见21楼

ss1969 发表于 2016-1-26 17:31:58

mr.hs 发表于 2016-1-26 15:43
还有其实重定向比这个好用

请举例说一下重定向是怎么做的呢?

田边人 发表于 2017-9-20 09:47:10

ss1969 发表于 2016-1-26 17:30
大概搞清楚了问题所在。。。还是直接跟踪代码最靠谱。
详细解释如下:



互斥信号量只能用在任务之间,不能用在中断服务函数内,你可以试试其他信号量!!

moneng 发表于 2018-10-11 16:24:48

    HAL_UART_Transmit_IT(UARTx, (uint8_t*)buffer_it, strlen(buffer_it));
   
    while(UARTx->gState != HAL_UART_STATE_READY)
    {
      Delay_ms(10);
    }

ppgpos 发表于 2020-3-24 18:09:47

moneng 发表于 2018-10-11 16:24


稳      

ppgpos 发表于 2020-3-24 18:14:51

那位老哥说的对
HAL_UART_Transmit_IT(&huart1, (uint8_t *)Buffer, (uint16_t)strlen(Buffer));
        while(huart1.gState != HAL_UART_STATE_READY)
                osDelay(1);
这样就可以,但如果HAL_UART_STATE_READY的判断在发送的前面就不行,醉了
页: 1 2 [3]
查看完整版本: cubemx配置的串口中断发送HAL_UART_Transmit_IT问题(搞定见#21)