微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 这是stm32单片机串口通信中的问题,请会的教教我,谢谢!

这是stm32单片机串口通信中的问题,请会的教教我,谢谢!

时间:10-02 整理:3721RD 点击:
以下是串口通信主函数中接收数据的一段代码,  len  这个变量是定义为U16类型。我的疑问是:(len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度)这句话中所谓数据长度是什么意思?是指二进制数据的长度吗?其长度又是怎么算出来的呢?视频讲解好像是说长度为2的13次方减1,对吗?可这是为什么呢?
while(1)
        {
                if(USART_RX_STA&0x8000)
                {                                          
                        len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
                        printf("\r\n您发送的消息为:\r\n\r\n");
                        for(t=0;t<len;t++)
                        {
                                USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据
                                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
                        }
                        printf("\r\n\r\n");//插入换行
                        USART_RX_STA=0;
                }else
                {
                        times++;
                        if(times%5000==0)
                        {
                                printf("\r\n战舰STM32开发板 串口实验\r\n");
                                printf("正点原子@ALIENTEK\r\n\r\n");
                        }
                        if(times%200==0)printf("请输入数据,以回车键结束\n");  
                        if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.
                        delay_ms(10);   
                }
        }         

USART_RX_STA低14位定义为接收数据长度,USART_RX_STA&0x3fff相当于将不表示接收数据长度的位置零,这样得到的数值就是接收数据的长度了,因为一个二进制位0或者1与上0一定是0,与上1则还是它本来的状态0或者1,至于你说的接收数据长度表示什么,len应该是一个整型的数据,len=USART_RX_STA&0x3fff;这个只是取出表示接收数据长度的位屏蔽其他位,得出的数值就是你此次接收到的数据长度,以字节为单位,比如这句执行后len = 0x0010;那么数据长度就是8字节,串口一位一位地发送,但是USART却是以字节为单位解码的,所以最终的数据长度应该是以字节为单位,不知道这么说你能理解么?

这个主要是在USART_RX_STA这个变量上,这里&0x3fff是取的USART_RX_STA的低14位。所以要看程序里对USART_RX_STA的操作。

USART_RX_STA在原程序中是被赋值为200的变量。

串口接收都差不多,一个一个字符接收存起来,在规定超时时间没有字符,为一包数据

建议使用空闲中断,自动断贞,不需要自己再单独处理

非常感谢。我已经理解了。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top