OpenEdv-开源电子网

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

想通过UART口发送字符串控制LED状态

[复制链接]

17

主题

81

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2013-12-16
在线时间
6 小时
发表于 2014-10-8 22:01:48 | 显示全部楼层 |阅读模式
5金钱
如题,想通过UART口发送字符串控制LED状态,如通过PC想STM32发送字符“LED1_ON”,则相应的LED1亮,应该怎么写?

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

使用道具 举报

17

主题

81

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2013-12-16
在线时间
6 小时
 楼主| 发表于 2014-10-8 22:14:19 | 显示全部楼层
回复

使用道具 举报

17

主题

81

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2013-12-16
在线时间
6 小时
 楼主| 发表于 2014-10-8 22:15:03 | 显示全部楼层
如果真是这样那就太悲哀了,原子哥,你说呢?
回复

使用道具 举报

40

主题

144

帖子

0

精华

高级会员

Rank: 4

积分
513
金钱
513
注册时间
2013-7-26
在线时间
72 小时
发表于 2014-10-8 22:44:11 | 显示全部楼层
额 这个你会串口编程不就会了么。。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-10-8 22:56:59 | 显示全部楼层
回复【3楼】我不是许文强:
---------------------------------
学完我们的串口实验,如果做不出你这个功能来,那才悲哀。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

65

主题

440

帖子

0

精华

高级会员

Rank: 4

积分
782
金钱
782
注册时间
2012-8-29
在线时间
17 小时
发表于 2014-10-9 09:21:41 | 显示全部楼层
接收完字符串,用字符串比较函数取得结果,对结果进行判断
pp = strstr((const char*)USART3_RX_BUF,"LED1_ON");
if(pp)
{return 1;} 
else 
{return 0;}
人生永远追逐着幻光,但谁把幻光看作幻光,谁便沉入无边的苦海
回复

使用道具 举报

17

主题

81

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2013-12-16
在线时间
6 小时
 楼主| 发表于 2014-10-9 09:38:31 | 显示全部楼层
回复【6楼】sun_shine:
---------------------------------
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  
{
    Res =USART_ReceiveData(USART1);             //(USART1->DR);
    if(strcmp(Res,"LED1_ON")==0)
    {
        LED1=1;
    }
}
这样OK吗?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-10-9 10:20:38 | 显示全部楼层
回复【7楼】我不是许文强:
---------------------------------
你这样可以才怪。
USART_ReceiveData一次接收多少字节,你知道么?
然后你LED1_ON是几个字节,知道么?

字节数都不一样,怎么可能可以!!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2014-3-12
在线时间
9 小时
发表于 2014-10-9 11:04:35 | 显示全部楼层
回复【7楼】我不是许文强:
---------------------------------
碉堡了~
自己定义一个串口数据包协议,每接收完一包,再进行解析和处理。
功夫再高、也怕羊刀
回复

使用道具 举报

65

主题

440

帖子

0

精华

高级会员

Rank: 4

积分
782
金钱
782
注册时间
2012-8-29
在线时间
17 小时
发表于 2014-10-9 11:27:43 | 显示全部楼层
回复【7楼】我不是许文强:
---------------------------------
我那个是之前程序的一段,你要自己完善,你这接受的是字符不是字符串,自己完善程序吧,原子例程写的很清楚
人生永远追逐着幻光,但谁把幻光看作幻光,谁便沉入无边的苦海
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2014-10-9 12:22:10 | 显示全部楼层
回复【7楼】我不是许文强:
---------------------------------
咱只发个“1”不行吗?
回复

使用道具 举报

17

主题

81

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2013-12-16
在线时间
6 小时
 楼主| 发表于 2014-10-9 13:52:39 | 显示全部楼层
回复【10楼】sun_shine:
---------------------------------
char USART_RX_BUF[USART_REC_LEN];  
unsigned int  First_Int = 0;
……
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) 
{
    Res =USART_ReceiveData(USART1);
    USART_RX_BUF[First_Int]=Res;
    First_Int++;
    if( strstr(USART_RX_BUF,"LED0_ON")!=NULL)
    {
        LED0=0;
    }
}
改成这样成不? 这里缓冲区USART_RX_BUF[USART_REC_LEN]是否需要定个大小?如过限定了大小,在每次接收比较完成之后是否需要清空缓冲区?
还有本人是初学者,各位大神不要打击小弟积极性啊!
回复

使用道具 举报

17

主题

81

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2013-12-16
在线时间
6 小时
 楼主| 发表于 2014-10-9 14:32:49 | 显示全部楼层
希望继续讨论一下!
回复

使用道具 举报

17

主题

81

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2013-12-16
在线时间
6 小时
 楼主| 发表于 2014-10-9 16:19:42 | 显示全部楼层
用strstr()函数还是有点问题,只要我发送的字符串中包含LED0_ON,则led就会亮,如发送123LED0_ON456,LED还是会亮,还是有点问题,该如何解决呢?
回复

使用道具 举报

233

主题

961

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1815
金钱
1815
注册时间
2011-10-9
在线时间
230 小时
发表于 2014-10-9 16:29:01 | 显示全部楼层
真是晕死我了   写那么复杂    C发一字符串  转成16进制 直接判断16进制不好
回复

使用道具 举报

17

主题

81

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2013-12-16
在线时间
6 小时
 楼主| 发表于 2014-10-10 09:19:18 | 显示全部楼层
新的一天又开始了,大家要不要继续讨论?
回复

使用道具 举报

65

主题

440

帖子

0

精华

高级会员

Rank: 4

积分
782
金钱
782
注册时间
2012-8-29
在线时间
17 小时
发表于 2014-10-10 10:12:58 | 显示全部楼层
回复【14楼】我不是许文强:
---------------------------------
是的!这个是查找字符串位置的函数,只要包含字符串就起作用
人生永远追逐着幻光,但谁把幻光看作幻光,谁便沉入无边的苦海
回复

使用道具 举报

17

主题

81

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2013-12-16
在线时间
6 小时
 楼主| 发表于 2014-10-10 10:19:11 | 显示全部楼层
回复【17楼】sun_shine:
---------------------------------
接收完之后如何将我的缓存区清空呢?目前实验下来只有第一次接收有效
回复

使用道具 举报

65

主题

440

帖子

0

精华

高级会员

Rank: 4

积分
782
金钱
782
注册时间
2012-8-29
在线时间
17 小时
发表于 2014-10-10 10:30:14 | 显示全部楼层
回复【18楼】我不是许文强:
---------------------------------
缓存清空是清你的数组,直接赋值为0,我建议你还是自己写一下,串口调试在以后也很有用
人生永远追逐着幻光,但谁把幻光看作幻光,谁便沉入无边的苦海
回复

使用道具 举报

17

主题

81

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2013-12-16
在线时间
6 小时
 楼主| 发表于 2014-10-10 14:35:49 | 显示全部楼层
char buff[7];
int cont=0;
中断服务函数如下:
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  
{
if(cont<7)
{
buff[cont]=USART_ReceiveData(USART1);
cont++;
}
else
{
if((strcmp(buff,"LED0_ON"))==0)
{
LED0=0;
printf("\r\nOK\r\n");
}
cont=0;
}

目前的问题是:如果第一次发送的字符串不是LED0_ON(例如第一次发送LED0123),此后再发送LED0_ON的话,LED0不是每次都亮,可能我要用串口助手连续发好几次才回有相应,不知道原因出在哪里?
今天调试的已经进步很多了,看了论坛里面有很多类似的问题,也没说出个所以然来,最后还是不了了之,
希望路过的大神们能指点一二,在此谢过了!
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13138
金钱
13138
注册时间
2012-11-26
在线时间
3814 小时
发表于 2014-10-10 15:03:36 | 显示全部楼层
这么。。。。的东西  还是自己BEBUG吧

不难

学完原子兄的串口实验,再来搞,搞不定就。。。不知道说啥了
学无止境
回复

使用道具 举报

19

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2014-8-20
在线时间
0 小时
发表于 2014-10-11 18:03:17 | 显示全部楼层
哥们,再研究一下吧。。。其实很简单。。。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-30 10:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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