完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
请教下各位,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 */ |
|
相关推荐
1个回答
|
|
HAL_UART_Transmit这个发送是阻塞式发送 只要发送没有发送完 程序就一直再这里 期间不会进接收中断
|
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1627 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1550 浏览 1 评论
984 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
688 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1601 浏览 2 评论
1867浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
650浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
518浏览 3评论
536浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
506浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 15:15 , Processed in 0.754392 second(s), Total 83, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号