问答

汇集网友智慧,解决技术难题

21ic问答首页 - TAG - MCU。APM32
  • APM32F107串口中断接收丢包

    [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px]APM32F107在串口同时发送和接收的情况下串口接收丢字节,具体表现为偶发进入串口接收中断了,但是USART_FLAG_RXBNE标志位没有触发,导致读不到这个字节进而丢字节,通过计数发现进入中断的次数与实际应该收到的字节数一致。1、发送是阻塞式发送的,没有用发送中断,排除进入的是发送中断的可能。[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px]2、出现这种情况时打断点看了,其他的溢出及错误标志位并没有置位,也打印检查了,没有置位。[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px]3、排查代码了没有在其他地方主动调用USART_RxDatad读取。[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px]4、串口中断优先级已调至最高。[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px]5、只接收不发送不会丢字节,挂一晚上都不丢,只要一发送接收就会丢。[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px]发送代码:[/size][/font][/backcolor][/color] [color=rgb(68, 85, 136)][font=Tahoma, "][size=16px][b]void[/b][/size][/font][/color][color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] [/size][/font][/backcolor][/color][color=rgb(153, 0, 0)][font=Tahoma, "][size=16px][b]Uart1_Send[/b][/size][/font][/color][color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px]([/size][/font][/backcolor][/color][color=rgb(68, 85, 136)][font=Tahoma, "][size=16px][b]char[/b][/size][/font][/color][color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] buf)[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px]{[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] [/size][/font][/backcolor][/color][color=rgb(68, 85, 136)][font=Tahoma, "][size=16px][b]uint16_t[/b][/size][/font][/color][color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] data_9th = buf;[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] dog_feed_count_clean(); [/size][/font][/backcolor][/color][color=rgb(136, 136, 136)][font=Tahoma, "][size=16px]// 循环清除喂狗变量,超过DOG_PROTECT_TIME_100MS不清除则认为主循环异常,并停止喂狗。[/size][/font][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] [/size][/font][/backcolor][/color][color=rgb(0, 0, 0)][font=Tahoma, "][size=16px][b]if[/b][/size][/font][/color][color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] (g_rParameters.sPort[[/size][/font][/backcolor][/color][color=rgb(0, 153, 153)][font=Tahoma, "][size=16px]0[/size][/font][/color][color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px]].ucParity == UART_CHK_MARK)[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] {[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] data_9th |= ([/size][/font][/backcolor][/color][color=rgb(0, 153, 153)][font=Tahoma, "][size=16px]1[/size][/font][/color][color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] << (uart1_data_bit - [/size][/font][/backcolor][/color][color=rgb(0, 153, 153)][font=Tahoma, "][size=16px]1[/size][/font][/color][color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px]));[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] }[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] [/size][/font][/backcolor][/color][color=rgb(0, 0, 0)][font=Tahoma, "][size=16px][b]else[/b][/size][/font][/color][color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] [/size][/font][/backcolor][/color][color=rgb(0, 0, 0)][font=Tahoma, "][size=16px][b]if[/b][/size][/font][/color][color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] (g_rParameters.sPort[[/size][/font][/backcolor][/color][color=rgb(0, 153, 153)][font=Tahoma, "][size=16px]0[/size][/font][/color][color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px]].ucParity == UART_CHK_SPACE)[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] {[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] data_9th &= ~([/size][/font][/backcolor][/color][color=rgb(0, 153, 153)][font=Tahoma, "][size=16px]1[/size][/font][/color][color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] << (uart1_data_bit - [/size][/font][/backcolor][/color][color=rgb(0, 153, 153)][font=Tahoma, "][size=16px]1[/size][/font][/color][color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px]));[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] }[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] WAIT_TX_EMPTY; [/size][/font][/backcolor][/color][color=rgb(136, 136, 136)][font=Tahoma, "][size=16px]// wait data register empty//等待发送完[/size][/font][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] USART_TxData(USART1, data_9th);[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px]}[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px]接收中断:[/size][/font][/backcolor][/color] [color=rgb(68, 85, 136)][font=Tahoma, "][size=16px][b]void[/b][/size][/font][/color][color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] [/size][/font][/backcolor][/color][color=rgb(153, 0, 0)][font=Tahoma, "][size=16px][b]USART1_IRQHandler[/b][/size][/font][/color][color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px]([/size][/font][/backcolor][/color][color=rgb(68, 85, 136)][font=Tahoma, "][size=16px][b]void[/b][/size][/font][/color][color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px])[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px]{[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] [/size][/font][/backcolor][/color][color=rgb(68, 85, 136)][font=Tahoma, "][size=16px][b]uint8_t[/b][/size][/font][/color][color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] data;[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] [/size][/font][/backcolor][/color][color=rgb(68, 85, 136)][font=Tahoma, "][size=16px][b]uint8_t[/b][/size][/font][/color][color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] longth = g_sParameters.sPort[[/size][/font][/backcolor][/color][color=rgb(0, 153, 153)][font=Tahoma, "][size=16px]0[/size][/font][/color][color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px]].ucDataSize;[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] [/size][/font][/backcolor][/color][color=rgb(0, 0, 0)][font=Tahoma, "][size=16px][b]if[/b][/size][/font][/color][color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] (USART_ReadStatusFlag(USART1, USART_FLAG_OVRE) == SET)[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] {[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] [/size][/font][/backcolor][/color][color=rgb(136, 136, 136)][font=Tahoma, "][size=16px]// 由软件清0,先读取USART_STS寄存器,再读USART_DATA寄存器完成清0。[/size][/font][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] USART_RxData(USART1);[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] }[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] [/size][/font][/backcolor][/color][color=rgb(0, 0, 0)][font=Tahoma, "][size=16px][b]if[/b][/size][/font][/color][color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] (USART_ReadStatusFlag(USART1, USART_FLAG_RXBNE) == SET)[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] {[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] data = ([/size][/font][/backcolor][/color][color=rgb(68, 85, 136)][font=Tahoma, "][size=16px][b]uint8_t[/b][/size][/font][/color][color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px])USART_RxData(USART1); [/size][/font][/backcolor][/color][color=rgb(136, 136, 136)][font=Tahoma, "][size=16px]// fetch recv data from buffer[/size][/font][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] [/size][/font][/backcolor][/color][color=rgb(0, 0, 0)][font=Tahoma, "][size=16px][b]if[/b][/size][/font][/color][color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] (g_sParameters.sPort[[/size][/font][/backcolor][/color][color=rgb(0, 153, 153)][font=Tahoma, "][size=16px]0[/size][/font][/color][color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px]].ucParity != UART_CHK_NONE)[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] {[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] data = data & (~([/size][/font][/backcolor][/color][color=rgb(0, 153, 153)][font=Tahoma, "][size=16px]1[/size][/font][/color][color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] << longth)); [/size][/font][/backcolor][/color][color=rgb(136, 136, 136)][font=Tahoma, "][size=16px]// 去掉校验位[/size][/font][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] }[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] [/size][/font][/backcolor][/color][color=rgb(0, 0, 0)][font=Tahoma, "][size=16px][b]if[/b][/size][/font][/color][color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] (AtCmd_enter_mode([/size][/font][/backcolor][/color][color=rgb(0, 153, 153)][font=Tahoma, "][size=16px]0[/size][/font][/color][color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px], data) == [/size][/font][/backcolor][/color][color=rgb(0, 153, 153)][font=Tahoma, "][size=16px]1[/size][/font][/color][color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px])[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] {[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] packet_count = [/size][/font][/backcolor][/color][color=rgb(0, 153, 153)][font=Tahoma, "][size=16px]0[/size][/font][/color][color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px];[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] }[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] [/size][/font][/backcolor][/color][color=rgb(0, 0, 0)][font=Tahoma, "][size=16px][b]else[/b][/size][/font][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] {[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] packet_count = [/size][/font][/backcolor][/color][color=rgb(0, 153, 153)][font=Tahoma, "][size=16px]0[/size][/font][/color][color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px];[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] uart1_rx_ringbuf_push(&uart1_rx_ringbuf, data);[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] [/size][/font][/backcolor][/color][color=rgb(136, 136, 136)][font=Tahoma, "][size=16px]// uart_rec_len ++;[/size][/font][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] }[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] usart_recv_total_len++;[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] }[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px] timer_pack_reset_func();[/size][/font][/backcolor][/color] [color=#444444][backcolor=rgb(255, 255, 255)][font=Tahoma, "][size=16px]}[/size][/font][/backcolor][/color]

    MCU。APM32 接收丢包 APM32F107 串口中断 发送 ar

    300浏览量 5回复量 关注量