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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
这是stm32单片机串口通信中的问题,请会的教教我,谢谢!!. h5 w/ L, }# ~+ n, O
0 L+ G  U$ G! x  B6 H0 j  [
# A% i3 E1 O+ o- V4 [7 \1 K1 C
以下是串口通信主函数中接收数据的一段代码,  len  这个变量是定义为U16类型。我的疑问是:(len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度)这句话中所谓数据长度是什么意思?是指二进制数据的长度吗?其长度又是怎么算出来的呢?视频讲解好像是说长度为2的13次方减1,对吗?可这是为什么呢?  u* Z) e) r/ A. L) B( m4 B3 F. ]
6 x" q) B& ]- w, G+ U
while(1). L! z/ |9 ^/ L4 n2 z% n( B8 y
        {! p1 e2 S, h! ^/ S) R
                if(USART_RX_STA&0x8000)
5 q8 K" O( K# V( E' V) r                {                                          
. `: F2 ^( G4 U                        len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
( v- L4 ?. y+ I2 M! e                        printf("\r\n您发送的消息为:\r\n\r\n");; b2 s7 ?$ i; e. L
                        for(t=0;t<len;t++)( H5 M! ?: |, c' w2 b# `3 }  Z  l
                        {
# a+ c' N4 o3 h7 k! ]( Z+ W                                USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据
" B0 [' u- X0 I% n; N                                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
+ [( I0 ]) m  y2 `                        }
4 I7 [+ N8 _5 z8 e( O! r                        printf("\r\n\r\n");//插入换行
3 Z$ V" Q* j* F- V; C5 ^& _                        USART_RX_STA=0;
7 X8 q" U2 x* }                }else# W0 F5 |5 N8 Q' X, p3 A
                {
& ]+ u* R9 B( S: j7 h& ]                        times++;
0 H! T, A+ \' V, Q# D1 u                        if(times%5000==0)
; u( M- |/ a( U. l  n                        {
9 T2 {& q+ H4 g* z# E3 {* G/ u                                printf("\r\n战舰STM32开发板 串口实验\r\n");/ Z  A$ n) {( M, X
                                printf("正点原子@ALIENTEK\r\n\r\n");. u1 J# I8 L8 R1 u
                        }! }$ A. K! u9 U" m
                        if(times%200==0)printf("请输入数据,以回车键结束\n");  
; {- d% R' O1 r3 m) t- y# f                        if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.
+ Y" x6 x2 e& \' C$ c/ U                        delay_ms(10);   
) B, M$ x; F& |7 t0 N$ v4 R/ a5 u$ p                }$ C0 ]1 I" M$ Q2 F: @# M8 ]
        }

, P) O$ ~5 k% p

该用户从未签到

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:04
+ X7 L7 N& b4 u# s9 f+ R0 L这个主要是在USART_RX_STA这个变量上,这里&0x3fff是取的USART_RX_STA的低14位。所以要看程序里对USART_RX_ ...
5 L$ G% g4 r2 p( q: \
USART_RX_STA在原程序中是被赋值为200的变量。
# ?8 V5 j; T! C& Q+ G% k7 A4 i

该用户从未签到

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:48& o6 i. ^0 V8 C/ e% W. r' _
USART_RX_STA低14位定义为接收数据长度,USART_RX_STA&0x3fff相当于将不表示接收数据长度的位置零,这样得 ...
# w! [$ r; e  i0 v- b3 g! {: ?5 ]' ]
非常感谢 我已经理解了+ w6 E  v1 ?1 O' u) r* J6 R
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-23 04:15 , Processed in 0.093750 second(s), 28 queries , Gzip On.

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

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

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