程序越編越簡單(一)
比如要編寫多個功放程序.
目前有三個型號: 功放a;功放b;功放c;

規(guī)則一,
對每個功放建立一個.c和.h文檔.
創(chuàng)建相應(yīng)的結(jié)構(gòu)體.
規(guī)則二,
建立一個程序中切換功放的接口程序.
建立一個功放Z的.c和.h文件.
所有的功放,a,b,c
無論選中了哪個功放,都要把數(shù)據(jù)復(fù)制給功放Z.
只有這樣參數(shù)給了Z,才會生效.
因為Z是最終的功放.
規(guī)則三,
從整體去看,
這個要結(jié)合你的程序整體.
因為功放是需要監(jiān)控的,就是你的程序需要發(fā)送和接收的.
編寫程序也就是從這兩部分入手.

首先看發(fā)送.
第一類:直接發(fā)送
這些發(fā)送指令都是一條語句.只要把這些指令寫死,然后對應(yīng)去發(fā)送就行了.
比如:
按綠燈:發(fā)送"打開功放"
按紅燈:發(fā)送"關(guān)閉功放"
按復(fù)位:發(fā)送"復(fù)位功放"
第二類:需要定期發(fā)送
還有一些是需要定期循環(huán)發(fā)送的
比如:
"心跳"包;
"獲取功放狀態(tài)"
這里就直接在程序主while中寫一個定時發(fā)送.
第三類:傳參指令
這一類就是在指令中有變量.
需要把變量寫進去,然后再發(fā)送.
比如:
定時開關(guān),我先把旋鈕擰到一定時長,然后再按下,
就開始按照我的倒計數(shù)分鐘數(shù)計數(shù).
這里倒計時的數(shù)字是我設(shè)置的,這就是一個變量.
總結(jié):
關(guān)于發(fā)送還會有很多情況......
?還需要結(jié)合實際,
要考慮一些特殊的情況,
比如:
兩個發(fā)送按鍵和復(fù)位按鍵同時按下.
就會同時發(fā)送兩條指令"打開指令"和"復(fù)位指令".
這兩條指令會不會有遺漏的情況.也就是如果程序不好,可能會只發(fā)送了其中一條指令.
還需要考慮功放能不能同時接受兩條指令.
有的時候外設(shè),
不接受兩條指令,比如單發(fā)"打開指令"或者單發(fā)"復(fù)位指令"都很好用.
但是兩個指令一起發(fā)送的時候,"打開指令 ,復(fù)位指令".
這樣有些功放可能會認(rèn)為錯誤.
這時就必須要在兩條指令之間加入延遲了.
這個時候就需要改變編寫程序的策略.
比如:
按下按鍵,或按下多個按鍵的時候,不進行直接的發(fā)送.
而是把對應(yīng)的發(fā)送標(biāo)志位置一.
然后,
在主循環(huán)while中進行輪詢檢測標(biāo)志位.
每次輪詢可以用計數(shù)器中斷進行計數(shù),達(dá)到某個值之后進行一次標(biāo)志位查詢.
這樣就實現(xiàn)了沒有delay的延遲.(可以提高程序運行效率這個后面講解)
然后,
檢測到一個打開功放按鍵按下的標(biāo)志位置一,就發(fā)送"打開指令".然后跳出.
下一輪接著檢測其他標(biāo)志位有沒有置一,如果復(fù)位標(biāo)志置一,就發(fā)送"復(fù)位指令".然后跳出.
因為每一輪都只響應(yīng)一個標(biāo)志位,
并且每一輪之間有若干個中斷計數(shù).
從而實現(xiàn)了每條發(fā)送指令之間都會有時間間隔.不會出現(xiàn)指令粘連的情況.
這里面其實還是可以設(shè)置一個緩存.
然后每次主循環(huán)中檢測緩存里面是不是按鍵按下.

上面就是發(fā)送指令了,
下面開始講解接收指令.
接收要和發(fā)送區(qū)分開來.
好的程序是:
接收就是只管接收,
發(fā)送就是只管發(fā)送.
當(dāng)然在很多情況下是不容易做到的.但是要向著這個方向去努力.

接收指令部分,
接收就很簡單了.
需要設(shè)置一個循環(huán)緩存,
如論收到什么,先不管,通通先存到緩存里面.
然后再主循環(huán)while中寫一個截取循環(huán)緩存數(shù)據(jù)的函數(shù).
比如摘取循環(huán)緩存中包頭和包尾之間的數(shù)據(jù).
這樣就可以接收到一條完整的指令了.