GD32F427R串口中断只能接收一个字节

在串口中断初始化时,更改初始化中断标志。

原代码:

usart_interrupt_enable(USART1,USART_INT_IDLE);//使用串口空闲中断

改为:

usart_interrupt_enable(USART1,USART_INT_RBNE);//使用读取数据缓冲区非空中断和溢出错误中断

Keil使用“Ctrl+F”搜索就行

此时每个字节都会产生一次中断,在中断函数内再做循环接收即可,可参考以下代码:

uint8_t g_recv_data[256];
uint16_t usart1revlen = 0;

void USART1_IRQHandler(void)
{
    if(usart_flag_get(USART1,USART_FLAG_RBNE) != RESET)
    {

        usart_data_transmit(USART1,usart_data_receive(USART1));//回复串口当前接收的一个字节
        g_recv_data[usart1revlen] = usart_data_receive(USART1);//保存接收的一个字节
        usart1revlen++;//保存字节数+1
        usart_interrupt_flag_clear(USART1,USART_INT_FLAG_RBNE);
    }
}

默认会回复所有字节,实际使用时删除这句usart_data_transmit(USART1,usart_data_receive(USART1));

然后把保存的数据在主函数处理就行了。

下面是结果(发送、接收都用的HEX格式):

说说一些坑,USART是没有接收完成这个标志的,例如什么USART_FLAG_TC说的是串口数据发送完成,主函数需要一个串口指令或数据处理时,串口发送就要带结束的字符标志(或者定长字节),假如不加判断,一旦串口发送数据比较快,要不主函数的数据不完整处理出错,要么主函数的数据接收多了处理出错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值