ST的串口HAL库太难用了,顶钢盔吐槽。F105RC

2019-12-10 18:28发布

本帖最后由 liuqian 于 2019-5-2 11:59 编辑

1. 层层包裹,里面各种情况都要处理,太啰嗦了,效率太低了
2. 发送、接收共用一个锁,全双工怎么玩,肯定会发生碰撞
3. 因为我使用了4个串口,有带DMA的有不带DMA的,为了方便维护,就不用DMA,而使用中断。但是串口中断接收使用定长缓存,而不是环形,这对不定长数据接收很麻烦。为了尽量不动CUBEMX生成的程序,费了不少功夫,最后还是写了自己的中断处理+环形缓冲。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
52条回答
liuqian
2019-12-16 11:35
本帖最后由 liuqian 于 2019-5-23 12:26 编辑

// send byte array
HAL_StatusTypeDef PutArray(UART_HandleTypeDef *puart, uint8_t *array, int len)
{
        HAL_StatusTypeDef r = HAL_BUSY;
        while (r == HAL_BUSY)
        {
                r = HAL_UART_Transmit(huart, array, len, 1000);
        }
        return r;
}

发送大量的数据,有时候会少一个字节
我读flash的一个sector,共4K字节,然后把这4K字节转换为hex和dec再用串口发出去,每次试30361字节,有时候发现会丢失一个字节,如下:
6A_|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|
6B_|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|
6C_|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:55|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|
6D_|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|
6E_|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|FF:255|
在[6C8]是FF,但是却出来一个55,缺了个2
在HAL_UART_Transmit中设了断点,没有发生超时和错误

试了115200和921600的波特率,一样的情况,测试发现6-7次就会有一次丢数据,暂时没办法确定是发送方的问题,还是SSCOM的问题(SSCOM问题的可能性不大,如果试SSCOM丢数据,大家早就反映了,我用的V5.13.1)
串口转换用CH340和STLINKV3,一样的情况

一周热门 更多>