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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
这是stm32单片机串口通信中的问题,请会的教教我,谢谢!!
' m+ P. D$ J9 o% c3 Q4 M. m9 U, z: S( z% J

( u+ D0 x# I+ ]$ p, q* E6 x以下是串口通信主函数中接收数据的一段代码,  len  这个变量是定义为U16类型。我的疑问是:(len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度)这句话中所谓数据长度是什么意思?是指二进制数据的长度吗?其长度又是怎么算出来的呢?视频讲解好像是说长度为2的13次方减1,对吗?可这是为什么呢?
# W  m7 q7 c% ?6 g5 t2 e. Z2 A! ^& v' h6 D5 ?( y" Y
while(1)
+ Y- i% f. T# ]        {
, }' [- Q9 k) \" M+ P" Q5 v                if(USART_RX_STA&0x8000)- `: }3 x5 ]3 d# @0 ^  \7 l
                {                                          
7 e! K8 c/ B3 e- D' q3 X4 v$ B                        len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度! C& D. o9 r" k+ E5 O
                        printf("\r\n您发送的消息为:\r\n\r\n");$ |6 m9 ^! l" M* I. J
                        for(t=0;t<len;t++)
" L  X" B/ X1 E, F$ ~                        {
0 Z3 R( a3 w4 |$ _2 O                                USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据
, z3 E' P* e, z/ B6 d- g                                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
  r* u+ o7 X' y                        }
$ u9 n) V5 R1 [5 O& k& g                        printf("\r\n\r\n");//插入换行
5 z' p8 g$ s, E) r                        USART_RX_STA=0;+ a- ~! U0 Q. v0 V9 _; f. u# ?
                }else
' N2 I: Q, v6 W                {" j0 r7 T) {0 @0 S- T' z! q
                        times++;0 L+ y$ Y5 J* x! I! X
                        if(times%5000==0)
4 Z. k) }9 |+ B6 j8 {! @3 Z: a                        {5 m2 R6 C0 v% b) F4 i- _) F
                                printf("\r\n战舰STM32开发板 串口实验\r\n");
  q$ k' J" C, O6 ^2 s                                printf("正点原子@ALIENTEK\r\n\r\n");" e! B! W8 \' A6 i7 Y+ X- [6 c
                        }
* ]' U' D! O6 O- _+ W                        if(times%200==0)printf("请输入数据,以回车键结束\n");  ' u$ y% w+ I7 q3 p  e8 M
                        if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.
  z) Z+ C3 B; q1 u) q                        delay_ms(10);   
) u- h1 Y  s& H! B! G                }
; w$ b, R2 w; }1 B8 w5 v9 b        }

2 v* H8 w$ x& `" W4 R: @

该用户从未签到

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/ i2 f- Z1 X* O+ g; e
这个主要是在USART_RX_STA这个变量上,这里&0x3fff是取的USART_RX_STA的低14位。所以要看程序里对USART_RX_ ...

* R, y- g6 P6 |$ I8 w0 S; ~, ~6 DUSART_RX_STA在原程序中是被赋值为200的变量。
9 I/ @+ L  @- N( v0 _) N

该用户从未签到

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( p# y* L' M( m$ t9 U
USART_RX_STA低14位定义为接收数据长度,USART_RX_STA&0x3fff相当于将不表示接收数据长度的位置零,这样得 ...

6 m8 p  u0 n& j' J+ _' X非常感谢 我已经理解了5 W2 J8 e; }9 E: j: W" K
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-25 18:59 , Processed in 0.093750 second(s), 28 queries , Gzip On.

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

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

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