usart1能原先RX正常,但只要运行TX后,就RX无法进入
请教下各位,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;
// unsigned intcrc;
//unsigned char crch, crcl;
if (cmdArrived) //有命令到达时,读取处理该命令
{
cmdArrived = 0;
len = UartRead(buf, sizeof(buf)); //将接收到的命令读取到缓冲区中
// HAL_UART_Transmit(&huart2, buf, len, 10);
if ((buf == 0X5A)&&(buf == 0XA5))//核对帧头决定是否响应命令
{
if ((buf == 0X10)&&(buf == 0X10))//核对地址以决定是否响应命令
{
if(buf == 0X01) //起动电机
{
MotorStart=1;
}
if(buf == 0X00) //起动电机
{
MotorStart=0;
}
}
if ((buf == 0X10)&&(buf == 0X00))BigCNT_total =buf;
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;
TXbuf=0X5A;TXbuf=0XA5;
TXbuf=0X05;
TXbuf=0X82;
TXbuf=0X10;TXbuf=addr;
TXbuf=0X00;TXbuf=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 = 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 */
参考一下官方的例程看看吧 对,调试一下官方的例程,熟悉一下接收和发送函数。所有函数都有一定逻辑和条件的,并不是任何时候都能适用的。熟悉后就知道怎么用了:) HAL_UART_Transmit这个发送是阻塞式发送 只要发送没有发送完 程序就一直再这里 期间不会进接收中断
页:
[1]