週末調了兩天程序,終於可以用了。本以爲週六上午就可以搞定的,結果各種意外,各種糾結,不過最後還是調好了,這點着實讓我有點興奮!當然這也讓我看到了一些我學習中的問題,所以,在 這裏還是會和大家分享下的!
先說點題外話吧!做這個其實是看到朋友送我的吊蘭我一直忘記澆水(慶幸它自己活得很好),然後室友傻博就提議一起做一個遠程控制澆花的出來,這樣,我發條微博,就可以讓它自己給自己澆水了!這是我們的原型,當然,他做上位機部分,我做無線通信和控制澆水部分,但是由於時間等限制,我們現在暫時做的是一個簡易版的,也就是我說的第一版,等忙過這一陣子吧,我們再改進做升級版的。簡易版的是這樣的,我這邊暫時不做無線通信這一塊,直接用串口通信,讓他的電腦連到我的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/