OpenEdv-开源电子网

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

STM32通过串口发送字符命令控制LED状态

[复制链接]

17

主题

81

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2013-12-16
在线时间
6 小时
发表于 2014-10-8 17:14:15 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]#include "delay.h" #include "usart.h" #include "LED.h" #include"string.h" char RecOrder[]; //存储字符 u16 Num=0; u16 len; int main(void) { delay_init(); LED_Init(); uart_init(9600); while(1) { if(USART_RX_STA & 0x8000) { len=USART_RX_STA & 0x3fff; if(strcmp(RecOrder,"LED0_ON")==0) { LED0=0; Num=0; USART_RX_STA=0; } else if(strcmp(RecOrder,"LED0_OFF")==0) { LED0=1; Num=0; USART_RX_STA=0; } } } }[/mw_shl_code] [mw_shl_code=c,true]此代码是根据战舰STM32开发板USART源码程序修改的,还没有验证,大家看看有没有问题? usart.h函数改了中断服务函数,代码如下: [/mw_shl_code] [mw_shl_code=c,true]
[mw_shl_code=c,true]extern u16 Num; extern char RecOrder[]; void USART1_IRQHandler(void) { #ifdef OS_TICKS_PER_SEC OSIntEnter(); #endif if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { RecOrder[Num] =USART_ReceiveData(USART1);//(USART1->DR); if((USART_RX_STA&0x8000)==0) { if(USART_RX_STA&0x4000) { if(RecOrder[Num]!=0x0a)USART_RX_STA=0; else USART_RX_STA|=0x8000; } else { if(RecOrder[Num]==0x0d)USART_RX_STA|=0x4000; else { USART_RX_BUF[USART_RX_STA&0X3FFF]=RecOrder[Num]; USART_RX_STA++; if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0; } } } } #ifdef OS_TICKS_PER_SEC OSIntExit(); #endif } [/mw_shl_code] 大家帮我看看有没有问题,谢谢了!

[/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

#include "sys.h" #include "delay.h" #include "led.h"  #include "beep.h"  //#include "key.h" #include "usart.h" #include "string.h" char cmd[200]; int main(void) { u8 t; u8 len; // u16 times=0;   delay_init();       //???±??????????    LED_Init();      //????????LE ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

81

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2013-12-16
在线时间
6 小时
 楼主| 发表于 2014-10-8 17:14:16 | 显示全部楼层
#include "sys.h"
#include "delay.h"
#include "led.h" 
#include "beep.h" 
//#include "key.h"
#include "usart.h"
#include "string.h"

char cmd[200];

int main(void)
{
u8 t;
u8 len;
// u16 times=0;
 
delay_init();       //???±??????????   
LED_Init();      //????????LED??????????????
BEEP_Init();          //??????·??ù?÷????
// KEY_Init();
NVIC_Configuration();
uart_init(9600);
while(1)
{
if(USART_RX_STA&0x8000)
{
len=USART_RX_STA&0x3FFF;
for(t=0;t<len;t++)
{
cmd[t]=USART_RX_BUF[t];
 while((USART1->SR&0X40)==0);
}
printf("\r\n receive successful \r\n");
USART_RX_STA=0;
USART_ClearFlag(USART1, USART_FLAG_RXNE);
if(!(strcmp(cmd,"led1_on")))
{
LED0=0;
memset(cmd,0,strlen(cmd));  //清除cmd[]
}
else if(!(strcmp(cmd,"led1_off")))
{
LED0=1;
memset(cmd,0,strlen(cmd)); //清除cmd[]
}
else 
printf("\r\n input error");
memset(cmd,0,strlen(cmd)); //清除cmd[]
}
}
}
问题解决了,bug也找到了~大家可以参考一下!
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2014-10-8 17:23:55 | 显示全部楼层
看不懂啊,你不是许文强,你是黄金荣吗?
小小蜗牛
回复

使用道具 举报

17

主题

81

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2013-12-16
在线时间
6 小时
 楼主| 发表于 2014-10-8 17:31:58 | 显示全部楼层
回复【2楼】jiutianshenjian:
---------------------------------
黄金荣?啥意思?
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2014-10-8 17:44:27 | 显示全部楼层
回复【3楼】我不是许文强:
---------------------------------
上海滩老大
小小蜗牛
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2014-5-16
在线时间
0 小时
发表于 2014-10-22 19:55:43 | 显示全部楼层
楼主,我做出来了请参考一下
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "string.h"
unsigned char rd[];
int main(void)
{
   u16 t;u16 len;u16 times=0;  //?è???®??????
   Stm32_Clock_Init(9); //  ?????±????????
   uart_init(72,9600); //   ?®???????? ?¨??????9600
   delay_init(72);  // ???±??????
   LED_Init(); // LED????????
   while(1)
 {
 LED1=1;
 LED0=1;
 if(USART_RX_STA&0x8000)
 {
 len=USART_RX_STA&0X0FFF;
 printf("\r\n??·?????????????\r\n  \r\n");
     for(t=0;t<len;t++)
 {
 USART1->DR=USART_RX_BUF[t];
 rd[t]=USART_RX_BUF[t];
 while((USART1->SR&0X40)==0);
 }
 printf("\r\n\r\n");
 USART_RX_STA=0;
 }
else
if(strcmp(rd,"led_on"))
 {
 LED1=0;
 LED0=1;
 }
 else if(strcmp(rd,"led_off"))
 {
 LED1=1;
 LED0=0;
 }

 
 
 }
 }
这个有BUG只能变两次
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2014-5-16
在线时间
0 小时
发表于 2014-10-22 20:53:43 | 显示全部楼层
[mw_shl_code=c,true]#include "sys.h" #include "usart.h" #include "delay.h" #include "led.h" #include "string.h" unsigned char rd[]; int main(void) { int i=0; u16 t;u16 len;u16 times=0; //?è???®?????? Stm32_Clock_Init(9); // ?????±???????? uart_init(72,9600); // ?®???????? ?¨??????9600 delay_init(72); // ???±?????? LED_Init(); // LED???????? while(1) { LED1=1; LED0=1; if(USART_RX_STA&0x8000) { len=USART_RX_STA&0X0FFF; printf("\r\n??·?????????????\r\n \r\n"); for(t=0;t<len;t++) { USART1->DR=USART_RX_BUF[t]; rd[t]=USART_RX_BUF[t]; while((USART1->SR&0X40)==0); } printf("\r\n\r\n"); USART_RX_STA=0; } switch(rd[len-1]) { case '1' ED0=0; break; case '2' ED1=0; break; case '3' : LED0=1; break; defaultED1=1; LED0=1; } } } BUG修好了,亲测,没有问题[/mw_shl_code]
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-10-22 23:08:43 | 显示全部楼层
回复【6楼】Ezio:
---------------------------------
谢谢分享....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

7

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2013-11-19
在线时间
11 小时
发表于 2015-1-29 13:33:11 | 显示全部楼层
回复【5楼】Ezio:
---------------------------------
请问一下 我调试这个程序的时候,也出现了类似的问题,您知道这个代码为什么会有BUG吗?
回复

使用道具 举报

17

主题

81

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2013-12-16
在线时间
6 小时
 楼主| 发表于 2015-4-7 11:05:35 | 显示全部楼层
回复【5楼】Ezio:
---------------------------------
想问下这位仁兄为什么会出现只能变两次的bug吗?
回复

使用道具 举报

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2015-5-14
在线时间
11 小时
发表于 2015-5-22 14:43:23 | 显示全部楼层
回复【10楼】我不是许文强:
---------------------------------
请问版主,有QQ号吗,我有问题要请教
小金科技工作室:https://shop72353947.taobao.com/?spm=a313o.7775905.1998679131.d0011.XKY4h0
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
41
金钱
41
注册时间
2015-6-11
在线时间
3 小时
发表于 2015-7-19 20:06:05 | 显示全部楼层
谢谢分享~我试着调试了一下,课实际运行结果是不能接受数据,也不能控制LED,这个必须用定时器么?初学者,不是很明白,求指点~
奋斗中的明媚女子、、
回复

使用道具 举报

17

主题

81

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2013-12-16
在线时间
6 小时
 楼主| 发表于 2015-8-10 09:14:26 | 显示全部楼层
回复【12楼】默默儿21:
---------------------------------
请问编译是否通过?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 01:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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