远程控制浇花系统(第一版)

       周末调了两天程序,终于可以用了。本以为周六上午就可以搞定的,结果各种意外,各种纠结,不过最后还是调好了,这点着实让我有点兴奋!当然这也让我看到了一些我学习中的问题,所以,在 这里还是会和大家分享下的!

       先说点题外话吧!做这个其实是看到朋友送我的吊兰我一直忘记浇水(庆幸它自己活得很好),然后室友傻博就提议一起做一个远程控制浇花的出来,这样,我发条微博,就可以让它自己给自己浇水了!这是我们的原型,当然,他做上位机部分,我做无线通信和控制浇水部分,但是由于时间等限制,我们现在暂时做的是一个简易版的,也就是我说的第一版,等忙过这一阵子吧,我们再改进做升级版的。简易版的是这样的,我这边暂时不做无线通信这一块,直接用串口通信,让他的电脑连到我的STM32上,然后控制浇花。目前我做好的是STM32的串口通信和控制这一块。但是我还没做控制浇花,我是控制LED灯,其实是一样的,以后做实物浇花时,把控制LED灯这个模块换成一个控制电路,通过光电转换,和继电器控制就可以实现浇花,具体的以后更新,现在说说STM32控制通信。

       首先说说STM32的通信的要求:首先它要实现的是检测串口是否有信息传过来,然后再检测这个信息是否和我预给的信息一致,不一致不管它;一致然后就给控制电路发送信息,让控制电路控制浇花,不过这里是控制LED灯亮一秒,就是发个信息而已。

        这里面内行一看就知道这个模块最难的部分是第二步,怎么检测接收到的信息是和我预给的信息一致!因为不是随便给你发一个信息都是让你浇水的,对吧?给你特定的信息你才能去浇水,不然不就被浇死了么!那这个问题怎么解决呢?我思考的方案是这样的:首先确定一个我预给的序列,我暂定为“chzwb”,(就是检测的信息是这个字符串才能浇水),然后我把这个待检测的序列定义为数组元素,然后,用循环比较的方法,就是接收完一组信息,然后取其长度,如果超过了5,直接不管它,因为肯定不会和我预给的字符串一致;如果是5,然后我就依次比较,如果是一致的才执行浇水。具体的实现是这样的:

const u32 table[5]={'c','h','z','w','b'} ;

if(USART_RX_STA&0x80)
		{					   
			len=USART_RX_STA&0x3f;//得到此次接收到的数据长度
		//	printf("%d",len);
			if(len==5) 
			{
				for(i=0;i<len;i++)
				{
		//			printf("chz");
					if(table[i]==USART_RX_BUF[i]) j+=0;
					else j++;
				}
		   	
				if(j==0)
				{
		//			printf("1");
					LED0=0;
					delay_ms(1000);
					LED0=1;
				}
		//		else printf("wb");
			}
			
			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;
	
		}
       当然啦,你们也许看完这段代码觉得没什么难的,但是我为什么花了2天才调好呢,待会儿告诉你们哈。这段代码估计学STM32的人应该理解起来不是很难,但是这里用的是操作寄存器,所以有点麻烦,之所以用操作寄存器,是因为我要读取的接收数据是存在USART1->DR和USART_RX_BUF[]这两个寄存器里面的,所以没办法啊,虽然我也喜欢用库函数写。我觉得没必要一句一句解释给你们听的,不懂百度寄存器去,或者看手册。讲核心部分,就是我的思路。首先是有接收到数据,就进入第一个if,然后会操作寄存器得到接收的信息的长度len,判断长度len是否是5,不是的话就直接把信息返回给主机,不执行控制,为什么我要返回信息呢,因为方便测试啊,我自己测试的时候怎么知道我发送的信息到底传给STM32没呢,所以传了就返回给我,但是不执行操作。如果len是5的话,说明有可能是我要的信息,然后就是检测是不是了。怎么做?循环比较,if(table[i]==USART_RX_BUF[i]),这句怎么达到判定的效果呢?我是定义一个j变量,初始化时定义为0,每次循环都对j进行一次操作,如果该次判定结果是一致,则j是不变的就是j+=0;如果不一致,则j是要加1的,也就是j++。最后如果5次检测都是一致,那么j还是0,哪怕一次不一样,j都会变化,所以,最后看第三个if,如果if(j==0),就控制LED灯了,当然其实也就是以后的控制浇水了。

        嗯,好吧,你要是忘了刚才那个问题就好了,可惜还是被我自己主动提出来了!我之所以花了2天,嗯,老实交代的话就是基础不够啊,年纪大了,忘得差不多了!做了很多无用功,但是没有主动去请教别人,所以一直一个人在调试,有时去和别人一起讨论下,会有不一样的收获的!首先我要声明下,那个我的电脑串口一直用不了,我一共换了5台电脑好么,才弄到一台可以调试的,这个就花了我一天,浪费了周六。然后写好程序,但是肯定是有问题的程序,我一共换了数数的不下于三种检测方法,但是都失败了,这里给的是第一种算法,但是源头是什么呢?其实是个很小的问题,编译器是没法检测的问题,就是把我预定的字符串定义成数组,这里我弄错了,好吧,c语言都忘了啊,我最初把他定义为这样的const u32 table[5]={c,h,z,w,b};后来觉得不对,因为是用户定意的要用双引号,然后又改成const u32 table[5]={"c","h","z","w","b"};好吧,最后的最后还是傻博提醒,串口发送的是ASIIC码,要用单引号的,哎,这点错误,导致一天的功夫,让我想了各种检测方法,让我一直怀疑自己方法不对,可惜就是没想过检测的不对。。。改过之后,各种方法都是可以达到检测效果的!这里就告诉我们啊,查错误的时候,要交流,虽然傻博是做上位机的,不懂STM32,但是c语言的错误,他却是知道的,你和别人说问题,局外人看得比你更清楚。当然了,还有师兄给我提供的排错方法也是不错的,就是大家看到的我注释掉的printf()部分,把变量都打印出来,找错误更简单。好吧,估计有人说怎么不用J-LINK调试呢,好吧,good idea!因为我在用串口下载,供电,通信,没有J-LINK!

        嗯,差不多了,至于别的部分程序,我就不给了,因为大家可能用的开发板都不一样,所以,你们参考这个检测的,和你们的开发板的串口通信例程来改进,都是可以达到预想的效果的!

        嗯,继续更新中。。。等我考完试哈。哦,在学zigbee做无线通信,工作了的师兄给的资料太他妈难看了,哎,学习果然不是件轻松的活儿。。。加油!!!

PS:感谢周末晚上在实验室煮饺子慰劳我们的雪哥妹纸,还有借我电脑调试的傻明,两位欧阳学长,当然合伙人傻博也是要表扬的。。。哦,他的个人网站必须广播下:http://www.saberlion.info/


  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值