遠程控制澆花系統(第一版)

       週末調了兩天程序,終於可以用了。本以爲週六上午就可以搞定的,結果各種意外,各種糾結,不過最後還是調好了,這點着實讓我有點興奮!當然這也讓我看到了一些我學習中的問題,所以,在 這裏還是會和大家分享下的!

       先說點題外話吧!做這個其實是看到朋友送我的吊蘭我一直忘記澆水(慶幸它自己活得很好),然後室友傻博就提議一起做一個遠程控制澆花的出來,這樣,我發條微博,就可以讓它自己給自己澆水了!這是我們的原型,當然,他做上位機部分,我做無線通信和控制澆水部分,但是由於時間等限制,我們現在暫時做的是一個簡易版的,也就是我說的第一版,等忙過這一陣子吧,我們再改進做升級版的。簡易版的是這樣的,我這邊暫時不做無線通信這一塊,直接用串口通信,讓他的電腦連到我的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/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章