找回密码
 注册
关于网站域名变更的通知
查看: 1105|回复: 7
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-4-3 09:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
这是stm32单片机串口通信中的问题,请会的教教我,谢谢!!% A4 E8 [( U' ^5 l4 S6 {

" }0 |2 y# y; F: F: a- `

) h% J6 e- R6 I4 a" G3 r以下是串口通信主函数中接收数据的一段代码,  len  这个变量是定义为U16类型。我的疑问是:(len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度)这句话中所谓数据长度是什么意思?是指二进制数据的长度吗?其长度又是怎么算出来的呢?视频讲解好像是说长度为2的13次方减1,对吗?可这是为什么呢?
" ~( j( n7 Q$ j2 b( h! r1 R& E( l; J0 \4 p
while(1)2 z% P* s8 |2 t9 o7 S: x
        {6 _9 r" G4 E) C
                if(USART_RX_STA&0x8000)
8 g  U; H- w- o                {                                          
% Z1 v  I4 m  X) B5 R% I$ `% `                        len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度& @8 r! d, e, L# D+ L* v
                        printf("\r\n您发送的消息为:\r\n\r\n");
& h( b7 H9 p( v& P  `  K4 _                        for(t=0;t<len;t++): J1 W7 V; H, {5 g$ F# G0 v5 ?' h
                        {/ {4 E7 L3 Z. s6 N0 \2 a  ]0 t9 e
                                USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据
+ |; O( Z" L8 G- X                                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束( n! |/ x" y+ I2 m+ }
                        }
; v% \4 A6 U# N+ g& A                        printf("\r\n\r\n");//插入换行
" |- R* F6 S% V0 C                        USART_RX_STA=0;
0 z: B! g* J1 L' ]3 \5 j* ^                }else
, @: P6 Y9 H4 ^5 W' W. t                {# c& n# o- m+ C" F/ G9 R/ x1 r
                        times++;
/ U6 e6 s1 k- F( s' Y                        if(times%5000==0)' f- t' w, l' f, F& _) E
                        {, @4 s: K) c' q8 H1 J
                                printf("\r\n战舰STM32开发板 串口实验\r\n");3 x* B2 t4 q" O7 S
                                printf("正点原子@ALIENTEK\r\n\r\n");% W6 M8 O# Z# a1 f
                        }  l2 @+ g) J% K! f# a, u( V
                        if(times%200==0)printf("请输入数据,以回车键结束\n");  
! H4 a" V/ Y' d0 E& D; r                        if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.
8 y- o) L5 a; X' x                        delay_ms(10);   - Y8 b- \; R, d9 ^
                }
% C+ Q+ o) m# x. y5 b! \        }
6 X5 h0 D* r  l4 F5 ^

该用户从未签到

2#
发表于 2019-4-3 10:04 | 只看该作者
这个主要是在USART_RX_STA这个变量上,这里&0x3fff是取的USART_RX_STA的低14位。所以要看程序里对USART_RX_STA的操作。

点评

USART_RX_STA在原程序中是被赋值为200的变量。  详情 回复 发表于 2019-4-3 10:23

该用户从未签到

3#
 楼主| 发表于 2019-4-3 10:23 | 只看该作者
helendcany 发表于 2019-4-3 10:043 i0 Z$ }1 [6 d; Y
这个主要是在USART_RX_STA这个变量上,这里&0x3fff是取的USART_RX_STA的低14位。所以要看程序里对USART_RX_ ...

: Z9 z0 U/ u- J! _+ Y, x$ Y; ~USART_RX_STA在原程序中是被赋值为200的变量。
' j1 F5 D. a/ ]1 X# I8 }

该用户从未签到

4#
发表于 2019-4-3 10:31 | 只看该作者
串口接收都差不多,一个一个字符接收存起来,在规定超时时间没有字符,为一包数据

该用户从未签到

5#
发表于 2019-4-3 10:42 | 只看该作者
建议使用空闲中断,自动断贞,不需要自己再单独处理

该用户从未签到

6#
发表于 2019-4-3 10:48 | 只看该作者
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却是以字节为单位解码的,所以最终的数据长度应该是以字节为单位,不知道这么说你能理解么?

点评

非常感谢 我已经理解了  详情 回复 发表于 2019-4-3 10:57

该用户从未签到

7#
 楼主| 发表于 2019-4-3 10:57 | 只看该作者
kinidrily 发表于 2019-4-3 10:480 `- ^) z+ A: B: j3 T8 N
USART_RX_STA低14位定义为接收数据长度,USART_RX_STA&0x3fff相当于将不表示接收数据长度的位置零,这样得 ...

1 b4 Q/ b) k% n非常感谢 我已经理解了
4 s7 W8 W1 V0 E! x2 {3 N8 I
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-24 01:35 , Processed in 0.109375 second(s), 25 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表