OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8163|回复: 12

串口实验主函数解析

[复制链接]

22

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2012-5-15
在线时间
2 小时
发表于 2012-5-27 09:35:47 | 显示全部楼层 |阅读模式

int main(void)
{   
 u8 t;
 u8 len; 
 u16 times=0; 
 Stm32_Clock_Init(9); //系统时钟设置
 delay_init(72);      //延时初始化
 uart_init(72,9600);  //串口初始化为9600
 LED_Init();      //初始化与LED连接的硬件接口   
 while(1)
 {
  if(USART_RX_STA&0x80)
  {       
   len=USART_RX_STA&0x3f;//得到此次接收到的数据长度
   printf("\n您发送的消息为:\n");
   for(t=0;t<len;t++)
   {
    USART1->DR=USART_RX_BUF[t];
    while((USART1->SR&0X40)==0);//等待发送结束
   }
   printf("\n\n");//插入换行
   USART_RX_STA=0;
  }else
  {
   times++;
   if(times%5000==0)
   {
    printf("\nMiniSTM32开发板 串口实验\n");
    printf("正点原子@ALIENTEK\n\n\n");
   }
   if(times%200==0)printf("请输入数据,以回车键结束\n"); 
   if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.
   delay_ms(10);  
  }
 } 
}

 

 

主函数中的  if(USART_RX_STA&0x80)
  {       
   len=USART_RX_STA&0x3f;//得到此次接收到的数据长度

如果进入if,那么
USART_RX_STA应该为0x80.
随后len=USART_RX_STA&0x3f =0x80&0x3f  不就为0吗?

 

 

 

 

 

 

 

 

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-5-27 09:52:05 | 显示全部楼层
回复【楼主位】mredge:
---------------------------------
你仿真一下.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

22

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2012-5-15
在线时间
2 小时
 楼主| 发表于 2012-5-27 10:31:54 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
我知道仿真的结果肯定是对的,只是在找我是哪个地方出错了? 现在就是困惑在这
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-5-27 13:52:21 | 显示全部楼层
随后len=USART_RX_STA&0x3f =0x80&0x3f  不就为0吗?
这句话你理解就错了.
为什么会为0?
这句话显然不会改变USART_RX_STA的状态.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

22

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2012-5-15
在线时间
2 小时
 楼主| 发表于 2012-5-27 18:12:22 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
如果能执行主函数中的if(USART_RX_STA&0x80)
  不就表示USART_RX_STA这个变量此时应该为0x80吗。那么len=USART_RX_STA&0x3f =0x80&0x3f=0啊
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-5-27 21:31:57 | 显示全部楼层
回复【5楼】mredge:
---------------------------------
谁说一定要是0X80?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

22

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2012-5-15
在线时间
2 小时
 楼主| 发表于 2012-5-27 22:05:45 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
那如果USART_RX_STA不等于0X80,那么if括号内一直是假,那么还怎么可能执行if内的程序呢?
难道if还可能等于0X81.0x82....0x8f?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-5-27 23:42:30 | 显示全部楼层
看另外一个贴,别两个贴讨论一个问题,还是同一个人....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2012-4-25
在线时间
0 小时
发表于 2012-5-28 14:53:16 | 显示全部楼层
楼主,USART_RX_STA&&0x3f才等于0吧,“&”是按位与,&&才是整个与的吧。而且又不是“&=”,变量的值怎么会变。
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2014-8-19
在线时间
0 小时
发表于 2014-8-19 21:49:58 | 显示全部楼层
times的作用是什么?
我的才华还撑不起我的野心
回复 支持 反对

使用道具 举报

230

主题

1950

帖子

10

精华

论坛元老

Rank: 8Rank: 8

积分
4562
金钱
4562
注册时间
2010-12-14
在线时间
32 小时
发表于 2014-8-19 22:16:03 | 显示全部楼层
回复【10楼】chaomartin:
---------------------------------
作用是每隔10msX5000=50s显示一次提示:
   printf("\nMiniSTM32开发板 串口实验\n");
    printf("正点原子@ALIENTEK\n\n\n");


每隔2s提示一次:请输入数据,以回车键结束
 if(times%200==0)printf("请输入数据,以回车键结束\n");    

每隔300ms :LED闪烁一次
   if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.
我是开源电子网?网站管理员,对网站有任何问题,请与我联系!QQ:389063473Email:389063473@qq.com
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2014-8-19
在线时间
0 小时
发表于 2014-11-3 22:13:05 | 显示全部楼层
回复【11楼】Admin:
---------------------------------
谢谢回复【11楼】Admin:
---------------------------------
谢谢站长了!还有一个问题在 Spi.c文件中  函数


u8 SPI2_ReadWriteByte(u8 TxData)
{
u16 retry=0;  
while((SPI2->SR&1<<1)==0)
{
retry++;
if(retry>=0XFFFE)return 0; 
}   
SPI2->DR=TxData;     
retry=0;
while((SPI2->SR&1<<0)==0) 
{
retry++;
if(retry>=0XFFFE)return 0;
}        
return SPI2->DR;               
}
中  变量retry是用来干嘛的呢?   我看了看STM32的通用时钟  我可以把它看成是用来计数的么?
没有分频  然后retry++一次就是  1/72Mhz  的时间?
我的才华还撑不起我的野心
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2014-8-19
在线时间
0 小时
发表于 2014-11-7 22:05:10 | 显示全部楼层
回复【11楼】Admin:
---------------------------------
原子哥哥老师   SPI主从设备数据交换一次到底是交换的什么?  例如:
u8  reg, status;
status=SPI2_ReadWriteByte(reg);

reg 是一个寄存器的地址  然后 主设备的SPI->DR会从  从设备哪里得到什么呢?


原子哥哥  你要快点给我解答一下哦0 !拜托了!原子哥哥  这是我的QQ邮箱1217331799@qq.com
我的才华还撑不起我的野心
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-29 11:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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