问答

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

21ic问答首页 - TAG - MUC、APM
  • APM32F107的串口接收中断丢字节问题 sos

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

    MUC、APM APM32F107 串口接收中断 ar 发送 RT

    52浏览量 0回复量 关注量