STM32串口通讯问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32串口通讯问题相关的知识,希望对你有一定的参考价值。

在main 函数里只有这一件事干. 把通过串口接收中断所采集到的数. 通过判断第3个值.在返回给PC
while (1)

if( RxBuffer[2] == 0X33 )

USART_SendData(USART1, RxBuffer[2]);
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)


RxBuffer[2] = 0;


中断函数如下:, 收取8个字节的数据. 保存在RxBuffer数组中.
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)

for(i=0;i<8;i++)

RxBuffer[i] = USART_ReceiveData(USART1);


USART_ClearITPendingBit(USART1,USART_IT_RXNE);
遇到的问题:
中断可以进入. 可以收到数据. 但是返还给PC的值却是8个RxBuffer[2]的值.

比如我发送 11 22 33 44 55 66 77 88

PC端串口调试软件收到STM32发送的却是 33 33 33 33 33 33 33 33

如果我在main函数里加上延时.
while (1)

if( RxBuffer[2] == 0X33 )

USART_SendData(USART1, RxBuffer[2]);
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)


RxBuffer[2] = 0;

delay();

这样在检测. 就会发现PC端接收到STM32的字节数变少了. 延时到一定程度.会只收到一个字节的数据.
疑问: 是不是STM32串口通讯的时候. 还必须要延时控制?
有没有高手帮忙解答一下. 怎么改动才能正常的让PC收到一个字节的数据;

延时不用了吧,因为是进中断的
for(i=0;i<8;i++)

RxBuffer[i] = USART_ReceiveData(USART1);


这个你看看变量i是怎么定义的,是不是静态的局部变量,这个要注意

而且你这里的中断有个很大的问题,就是进一次中断你就让数组RxBuffer收了
8个数据,这样是不对的吧。应该进一次中断就收一个数据而已,不然你整个数组不都是一次USART_ReceiveData(USART1)的数据吗?这里你好好想想看~~
参考技术A 老大,两个问题,
第一,中断中一次只能存一个字节。你这样一次存八个,这八个都是一样的了。
第二,主函数中的接收变量最好和中断中的名字不同,或者相同但要严格保证不是一个定义域的,不然你正判断着呢,中断进来,就把它改了
参考技术B if( RxBuffer[2] == 0X33 )

USART_SendData(USART1, RxBuffer[2]);
-------------------
当然只有33了,因为你发的就是33

以上是关于STM32串口通讯问题的主要内容,如果未能解决你的问题,请参考以下文章

STM32的USART串口通讯程序

STM32 USB使用记录:使用CDC类虚拟串口(VCP)进行通讯

STM32F103VET6基于Arduino开发框架下串口和软串口通讯示例

stm32串口通讯

STM32 UART串口通讯编程方法

Arduino处理STM32中的多个串口通讯问题