打印

使能串口发送中断, 出现前导乱码, 问题求解

[复制链接]
1454|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gcjd|  楼主 | 2021-12-22 13:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用芯片华大 HC32F460PETB,  每次使能 Uart 发送中断, 串口就会发送 "11 11 11 00" (HEX)  3-4 BYTE 的乱码, 这个时候还未进行中断处理,  前导乱码已经发出!向给位请教一下, 怎么处理, 消除前导乱码

/******************************************************************************
brief:                发送中断
param:                None
retval:                 None
*****************************************************************************/
static void UsartTxIrqCallback(void)
{
    uint8_t u8Data = 0u;

    if (Ok == RingBufRead(&m_stcRingBuf_Out, &u8Data))
    {
        USART_SendData(USART_CH, (uint16_t)u8Data);
    }
                // 如果数据已经发送完毕,关闭发送中断,打开发送完毕中断
    if (IS_RING_BUFFER_EMPTY(&m_stcRingBuf_Out))
    {
                                // 发送数据完毕,关发送中断
        USART_FuncCmd(USART_CH, UsartTxEmptyInt, Disable);
                                // 打开发送完毕中断
        USART_FuncCmd(USART_CH, UsartTxCmpltInt, Enable);
    }
}
/******************************************************************************
brief:                发送完毕中断
param:                None
retval:                 None
*****************************************************************************/
static void UsartTxCmpltIrqCallback(void)
{
                // 关闭发送中断,关闭完毕中断
                    USART_FuncCmd(USART_CH, UsartTx, Disable);
                    USART_FuncCmd(USART_CH, UsartTxCmpltInt, Disable);
                // 发送闲 0
                m_u8Status = 0u;;
}
/******************************************************************************

brief:          启动发送中断
param:        void
retval:         void
注: 如果忙或者为空, 就没有必要启动发送
*****************************************************************************/
void  UartA_Start_Send(void)
{       
                register rt_base_t level;
                uint8_t u8Data = 0u;
       
                // 必须原子, 因为要支持边发边加
                level = rt_hw_interrupt_disable();
                                if ((!IS_RING_BUFFER_EMPTY(&m_stcRingBuf_Out)) && (0u == m_u8Status))
                                {
                                                // 装入首字符
                                                /*if (Ok == RingBufRead(&m_stcRingBuf_Out, &u8Data))
                                                {
                                                                USART_SendData(USART_CH, (uint16_t)u8Data);
                                                                USART_FuncCmd(USART_CH, UsartTxAndTxEmptyInt, Enable);
                                                                //设置状态=发送中
                                                                m_u8Status = 1u;
                                                }*/
                                                USART_FuncCmd(USART_CH, UsartTxAndTxEmptyInt, Enable);
                                                //设置状态=发送中
                                                m_u8Status = 1u;
                                }
                rt_hw_interrupt_enable(level);
}

使用特权

评论回复
沙发
海滨消消| | 2021-12-22 14:38 | 只看该作者
断电重启一下

使用特权

评论回复
板凳
martinhu| | 2021-12-24 17:01 | 只看该作者
USART_FuncCmd(USART_CH, UsartTxAndTxEmptyInt, Enable);这句就已经产生TXE中断了,不需要先写首字节。
楼主在这句之前先写首字节,也会发送。

另外看看示波器上的波形,IO初始化顺序是不是有问题,导致Tx上有异常电平?

使用特权

评论回复
地板
sadicy| | 2021-12-27 11:20 | 只看该作者
之前用ST的,也有偶尔发送一个8位数据的时候,
就是首次加电那会~
看没影响其他的,就没管

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝