请教下各位,USART1如果不运行TX函数,每次接收都正常,但在接收一次,如果运行TX函数,接下来就无法再接收了 /******************************************************************************* * 函数名 : UartRxMonitor * 描述 : //串口接收监控函数//判断是否接收完了一帧数据 * 输入 : 无 * 返回 : 无 * 说明 : *******************************************************************************/ void UartRxMonitor(unsigned char ms) //串口接收监控函数//判断是否接收完了一帧数据 { static unsigned char cntbkp = 0; static unsigned char idletmr = 0; if (cntRxd > 0) //接收计数器大于零时,监控总线空闲时间 { if (cntbkp != cntRxd) //接收计数器改变,即刚接收到数据时,清零空闲计时 { cntbkp = cntRxd; idletmr = 0; } else { if (idletmr < ms) //接收计数器未改变,即总线空闲时,累积空闲时间 { idletmr ++; if (idletmr >= ms) //空闲时间超过4个字节传输时间即认为一帧命令接收完毕 { cmdArrived = 1; //设置命令到达标志 } } } } else { cntbkp = 0; } } *******************************************************************************/ void TouchScreen_SubLoop(void ) //串口驱动函数,检测接收到的命令并执行相应动作 { unsigned char len; unsigned char buf[40]; // unsigned int crc; // unsigned char crch, crcl; if (cmdArrived) //有命令到达时,读取处理该命令 { cmdArrived = 0; len = UartRead(buf, sizeof(buf)); //将接收到的命令读取到缓冲区中 // HAL_UART_Transmit(&huart2, buf, len, 10); if ((buf[0] == 0X5A)&&(buf[1] == 0XA5)) //核对帧头决定是否响应命令 { if ((buf[4] == 0X10)&&(buf[5] == 0X10)) //核对地址以决定是否响应命令 { if(buf[8] == 0X01) //起动电机 { MotorStart=1; } if(buf[8] == 0X00) //起动电机 { MotorStart=0; } } if ((buf[4] == 0X10)&&(buf[5] == 0X00)) BigCNT_total =buf[8]; BigCNT_in=BigCNT_total; BigCNT_out=0; TXtoScreen(BigCNT_inAddr,BigCNT_in);//不屏蔽的话,这个在接收一次后,下次就无法接收 TXtoScreen(BigCNT_outAddr,BigCNT_out);// } } } void TXtoScreen(unsigned char addr,unsigned char data) { unsigned char TXbuf[40]; TXbuf[0]=0X5A;TXbuf[1]=0XA5; TXbuf[2]=0X05; TXbuf[3]=0X82; TXbuf[4]=0X10;TXbuf[5]=addr; TXbuf[6]=0X00;TXbuf[7]=data; HAL_UART_Transmit(&huart1, TXbuf, 8, 100); } RX接收用中断,TX没用到中断,直接用HAL_UART_Transmit(&huart1, TXbuf, 8, 10); 会不会问题的根源在这? void HAL_UART_RxCpltCallback(UART_HandleTypeDef*huart) { UNUSED(huart); if(huart==&huart1) { //不定长接收 if (cntRxd < sizeof(bufRxd)) //接收缓冲区尚未用完时, { bufRxd[cntRxd++] = RXBuf_OneData; //保存接收字节,并递增计数器 } } } void USART1_IRQHandler(void) { /* USER CODE BEGIN USART1_IRQn 0 */ /* USER CODE END USART1_IRQn 0 */ HAL_UART_IRQHandler(&huart1); /* USER CODE BEGIN USART1_IRQn 1 */ /* USER CODE END USART1_IRQn 1 */ } /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ |
USART1.zip
下载5.96 KB, 下载次数: 0, 下载积分: ST金币 -1
参考一下官方的例程看看吧 |
对,调试一下官方的例程,熟悉一下接收和发送函数。所有函数都有一定逻辑和条件的,并不是任何时候都能适用的。熟悉后就知道怎么用了 |
HAL_UART_Transmit这个发送是阻塞式发送 只要发送没有发送完 程序就一直再这里 期间不会进接收中断 |