OpenEdv-开源电子网

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

求助!!关于串口的问题

[复制链接]

9

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2011-5-5
在线时间
0 小时
发表于 2011-5-11 13:23:21 | 显示全部楼层 |阅读模式

我想通过给串口发送数据来控制绿灯,代码是通过光盘里面的代码改的,数据是发出去了,但不能控制绿灯额,这怎么回事呀?请原子大哥指教,代码如下:

int main(void)fficeffice" />

{                   

       u8 t;

       u8 len;  

       u16 times=0;

       u16 setval=0;

       u16 temp0;

       u16 temp1;

       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&0xffice:smarttags" />3f;//得到此次接收到的数据长度

                     if(len<3)//限制数据长度不能超过3

                     {            

                            //printf("\n您发送的消息为:\n");

                            for(t=0;t<len;t++)

                            {

                                   if(temp0==0)

                                   {

                                          temp0=USART_RX_BUF[t];

                                          setval=temp0;

                                   }

                                   /*else if(t==1)

                                   {

                                         temp0<<=8;

                                          temp1=USART_RX_BUF[t];

                                          setval=temp0+temp1;

                                   }*/

 

                                   USART1->DR=USART_RX_BUF[t];

                                   while((USART1->SR&0X40)==0);//等待发送结束

                            }

 

                            printf("\n\n");//插入换行

                            USART_RX_STA=0;

                     }

                    

                     //return setval;

              }else

              {

                     times++;

                    if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.

                     if(setval==0x0001) LED1=!LED1;//绿灯闪烁

                     //if(setval==0x0110) LED1=0;//绿灯常亮

                     delay_ms(10);  

              }

       }

        

}


 

这个程序目的是,当我串口发送1的时候,应该能够是绿灯变成闪烁的状态,可是现在绿灯一直是灭的,点不亮额……

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

使用道具 举报

2

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2011-1-16
在线时间
4 小时
发表于 2011-5-11 15:09:30 | 显示全部楼层
老哥,字体很不错,你选的是那个?我也改改
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-5-11 15:21:24 | 显示全部楼层
回复【楼主位】casstiel:
-------------------------------
你这个应该蛮好改吧。
不过看你的代码,闪是看不到了,因为你闪的太快了。应该可以看到常亮。但是看不到闪的。

                                   if(temp0==0)

                                   {

                                          temp0=USART_RX_BUF[t];

                                          setval=temp0;

                                   }

这里 temp0,你又没有初始化为0,如果初始化的时候temp0不为0,那么你就看不到你的绿灯亮了。永远也。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

9

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2011-5-5
在线时间
0 小时
 楼主| 发表于 2011-5-11 15:58:40 | 显示全部楼层
回复【3楼】正点原子:
-------------------------------

int main(void) fficeffice" />

{                   

       u8 t;

       u8 len;  

       u16 times=0;

       u16 setval=0;

       u16 temp0=0;

       u16 temp1;

       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&0xffice:smarttags" />3f;//得到此次接收到的数据长度

                     if(len<3)//限制数据长度不能超过3

                     {            

                            printf("\n您发送的消息为:\n");

                            for(t=0;t<len;t++)

                            {

                                   if(temp0==0)

                                   {

                                          temp0=USART_RX_BUF[t];

                                          setval=temp0;

                                   }

                                   /*else if(t==1)

                                   {

                                         temp0<<=8;

                                          temp1=USART_RX_BUF[t];

                                          setval=temp0+temp1;

                                   }*/

                                   if(setval==1)

                                   {

                                          LED0=0;

                                          while(1);

                                   }

                                   USART1->DR=USART_RX_BUF[t];

                                   while((USART1->SR&0X40)==0);//等待发送结束

                            }

 

                            printf("\n\n");//插入换行

                            USART_RX_STA=0;

                     }

                    

                     //return setval;

              }else

              {

                     times++;

                    if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.

                     if(setval==0x0001) LED1=0;//绿灯常亮

                     //if(setval==0x0110) LED1=0;//绿灯常亮

                     delay_ms(10);  

              }

       }

        

}

 


不行啊,大哥,依然老样子,它不听话呀。我现在让它如果setval置“1”就点亮绿灯,死循环,可是绿灯根本就不亮,初始化也给了...@@
回复 支持 反对

使用道具 举报

9

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2011-5-5
在线时间
0 小时
 楼主| 发表于 2011-5-11 17:33:52 | 显示全部楼层
问题通过仿真找到了,但不知道怎么产生的,temp0=USART_RX_BUF[0];(我开始以为串口给到1,USART_RX_BUF[0]应该等于0x01,但仿真的实际数值是0x31),所以后面的if(setval==1)当然也不会成立,绿灯也不会亮,可是为什么呢?USART_RX_BUF[0]不应该等于0x01吗?原子哥能指点一下偶么?

                                          
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-5-11 17:57:12 | 显示全部楼层
回复【5楼】casstiel:
-------------------------------
ASCII的内码,你查查看.串口发送你选择16进制发送,应该就可以了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

9

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2011-5-5
在线时间
0 小时
 楼主| 发表于 2011-5-11 20:08:27 | 显示全部楼层
回复【6楼】正点原子:
-------------------------------
是不是设置串口调试助手呀?可是那个软件里面没有可以选择16进制发送的诶?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-5-12 08:27:13 | 显示全部楼层
回复【7楼】casstiel:
-------------------------------
一般都有的.不知道你用的哪个?截个图给我看看吧.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

9

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2011-5-5
在线时间
0 小时
 楼主| 发表于 2011-5-12 16:37:05 | 显示全部楼层
回复【8楼】正点原子:
-------------------------------
我查了下ASCII的内码,好像1就是0x31,我用的串口调试助手就是原子哥光盘里头给的那个,可素如果是0x31的话,怎么显示出来的还是1呀?不应该是0x31么?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-5-12 16:52:03 | 显示全部楼层
回复【9楼】casstiel:
-------------------------------
那就对了啊,你发送ascii的1,到了单片机上,收到的就是0X31。其实你把这个收到的值减去0X30(空格键),不就是你要的数字了么?你看看我的显示字符串的函数吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

9

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2011-5-5
在线时间
0 小时
 楼主| 发表于 2011-5-12 19:00:20 | 显示全部楼层
恩,明白啦^-^
回复 支持 反对

使用道具 举报

50

主题

270

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
492
金钱
492
注册时间
2013-2-2
在线时间
0 小时
发表于 2013-5-18 20:39:38 | 显示全部楼层
回复【楼主位】casstiel:
---------------------------------楼主,在吗?
回复 支持 反对

使用道具 举报

50

主题

270

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
492
金钱
492
注册时间
2013-2-2
在线时间
0 小时
发表于 2013-5-18 20:43:18 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
原子哥,这里为什么temp0<<=8;要左移8位呢
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-18 21:54:26 | 显示全部楼层
回复【13楼】qq382663074:
---------------------------------
这代码是楼主写的,你该问问楼主。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-19 14:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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