完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
不知道各位有没有出现过这样的情况,我使用STM32F103RCT6芯片编写串口程序,重定向printf函数到串口1,数据可以正常地发送和接收,但是有个问题
我仿真的时候发现,我每次用printf发出去的数据,接收数组同样会接收到,举个例子,我用串口发送123到上位机,上位机发送456回到MCU,我在中断的 接收函数里的数组 W_Rec[]会接收到123456,本来应该是456才对,我想问下是不是重定向后都会这样,如果不是要如何解决?请大家指点下小弟 附一下代码: 串口配置
中断函数
请大家指点下如何才能不接收MCU发出去的数据 |
|
相关推荐
1个回答
|
|
为了解决这个问题,我们需要确保STM32F103RCT6芯片的串口接收和发送是分开的,而不是将发送的数据直接添加到接收数组中。以下是解决这个问题的步骤:
1. 首先,确保你已经正确配置了串口的GPIO引脚。这可以通过GPIO_InitTypeD结构体来完成。 2. 接下来,配置串口的时钟和波特率。这可以通过RCC_APB2PeriphClockCmd和USART_InitTypeD结构体来完成。 3. 为了重定向printf函数到串口1,你需要实现一个自定义的_write函数。这个函数将在printf调用时被调用,并将数据发送到串口1。 ```c int _write(int file, char *ptr, int len) { for (int i = 0; i < len; i++) { while (!(USART1->SR & 0x40)); // 等待发送数据寄存器为空 USART_SendData(USART1, *ptr++); // 发送数据 } return len; } ``` 4. 在你的主函数中,调用freopen函数来重定向stdout到串口1。 ```c int main(void) { // ... 其他初始化代码 ... freopen(NULL, "w", stdout); // 重定向printf到串口1 // ... 其他代码 ... return 0; } ``` 5. 在USART1的中断接收回调函数中,确保只处理接收到的数据,而不是将发送的数据添加到接收数组中。 ```c void USART1_IRQHandler(void) { if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { // 读取接收到的数据 uint8_t data = (uint8_t)USART_ReceiveData(USART1); // 处理接收到的数据,例如将其存储在接收数组中 W_Rec[rec_count++] = data; // 清除接收中断标志 USART_ClearITPendingBit(USART1, USART_IT_RXNE); } } ``` 通过以上步骤,你应该可以避免在接收数组中接收到发送的数据。如果问题仍然存在,请检查你的代码,确保没有其他地方将发送的数据添加到接收数组中。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1529 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1482 浏览 1 评论
900 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
644 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1523 浏览 2 评论
1839浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
584浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
487浏览 3评论
489浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
470浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-1 07:54 , Processed in 0.741838 second(s), Total 80, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号