请教下各位,USART1如果不运行TX函数,每次接收都正常,但在接收一次,如果运行TX函数,接下来就无法再接收了
/*******************************************************************************
* 函数名 : UartRxMonitor
* 描述 : //串口接收监控函数//判断是否接收完了一帧数据
* 输入 : 无
* 返回 : 无
* 说明 :
*******************************************************************************/
void UartRxMonitor(unsigned char ms) //串口接收监控函数//判断是否接收完了一帧数据
{
sta
tic 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 */