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的判断在发送的前面就不行,醉了