21ic问答首页 - 使能串口发送中断, 出现前导乱码, 问题求解
使能串口发送中断, 出现前导乱码, 问题求解
gcjd2021-12-22
使用芯片华大 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);
}
/******************************************************************************
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);
}
赞0
就是首次加电那会~
看没影响其他的,就没管
评论
2021-12-27
赞0
楼主在这句之前先写首字节,也会发送。
另外看看示波器上的波形,IO初始化顺序是不是有问题,导致Tx上有异常电平?
评论
2021-12-24
赞0
评论
2021-12-22
您需要登录后才可以回复 登录 | 注册