串行端口是PIC與其他設(shè)備通信的最簡單方法之一。但是,事件串行端口存在缺陷,因此在本教程中,我們將了解消息協(xié)議如何提高數(shù)據(jù)傳輸?shù)目煽啃浴?/p>
示意圖
原始數(shù)據(jù)傳輸
現(xiàn)代微控制器通常內(nèi)置許多設(shè)備接口外設(shè),包括I2C,SPI,UART和能夠。雖然I2C和SPI專用于器件,并且嚴(yán)重依賴于選擇信號或啟動/停止信號,但UART更加自由。 UART的最大缺點(diǎn)之一是缺少時鐘信號,這可能導(dǎo)致發(fā)送器或接收器的時鐘漂移(導(dǎo)致波特差異),幀錯誤,甚至當(dāng)其中一個緩沖器出現(xiàn)溢出錯誤方滿了。當(dāng)然,這些問題是使用定時器,監(jiān)視器和事件容易克服的相對性。但是,與I2C和SPI不同,串行連接在一種特定情況下更常見:可移動硬件。 I2C和SPI器件通常是直接焊接到主電路板或永久連接到它們的IC。同時,這些設(shè)備是主控制器的子設(shè)備,因此無法自行啟動數(shù)據(jù)傳輸。
想象一下PIC和計算機(jī)通過串行連接進(jìn)行通信,其中每個設(shè)備都可以發(fā)送命令或數(shù)據(jù)到另一個設(shè)備。這樣的系統(tǒng)可以用普通的消息協(xié)議輕松實現(xiàn),其中發(fā)送的第一個字節(jié)代表命令,后面的字節(jié)代表該命令的數(shù)據(jù)。只要沒有中斷,該系統(tǒng)就可以正常運(yùn)行。但是,如果計算機(jī)在發(fā)送命令后傳輸數(shù)據(jù)字節(jié)的一半時崩潰并重新啟動會發(fā)生什么?好吧,我們的程序?qū)⒅匦聠硬L試發(fā)送命令字節(jié)以啟動數(shù)據(jù)傳輸,但命令字節(jié)將被PIC解釋為數(shù)據(jù)字節(jié),因為它仍然期望一個數(shù)據(jù)字節(jié)。這會導(dǎo)致PIC產(chǎn)生錯誤,因為它讀取的字節(jié)可能會產(chǎn)生意外結(jié)果。但這不僅僅是UART的一個問題;任何可能被終止的連接,無法知道連接已被終止,也可能崩潰。解決方案是使用消息協(xié)議!
我們的消息協(xié)議:DHP - DIY黑客協(xié)議
確保命令始終正確處理,命令字節(jié)值將是唯一的。對于我們的系統(tǒng),我們將有以下命令:
0x00 - 無操作
0x01 - 請求數(shù)據(jù)
0x02 - 寫數(shù)據(jù)
0x03 - 數(shù)據(jù)結(jié)束
0x04 - 重啟(發(fā)生錯誤或失?。?/p>
作為一個簡單的例子,如果我們想通過計算機(jī)向PIC發(fā)送一些數(shù)據(jù),我們必須首先發(fā)送0x02,然后發(fā)送所有數(shù)據(jù),然后發(fā)送數(shù)據(jù)結(jié)束字節(jié)。如果傳輸中斷并且計算機(jī)嘗試重新發(fā)送數(shù)據(jù),它將再次發(fā)送整個數(shù)據(jù)包。 PIC將正確解釋命令字節(jié)并意識到正在發(fā)送新數(shù)據(jù)包。但是,如果我們的數(shù)據(jù)包含0,1,2,3或4,會發(fā)生什么? PIC會將這些解釋為命令字節(jié),因此會發(fā)生致命錯誤。那么,我們?nèi)绾谓鉀Q這個問題?
雖然不是最有效的方法,但我們可以用其他形式表示我們的數(shù)據(jù)而不是原始字節(jié)值。一種方法是將我們的數(shù)據(jù)表示為十六進(jìn)制形式的ASCII字符,以便兩個ASCII字節(jié)代表一個字節(jié)的數(shù)據(jù)。例如,F(xiàn)F表示255,其中00表示0.因此,我們的數(shù)據(jù)字節(jié)永遠(yuǎn)不能與命令字節(jié)相同,并且通過使用ASCII編碼的十六進(jìn)制字節(jié),理論上我們可以有多達(dá)240個命令字節(jié)(留下16個十六進(jìn)制字符用于數(shù)據(jù))。使用ASCII編碼數(shù)據(jù)的缺點(diǎn)是我們有效地將數(shù)據(jù)速率減半,命令字節(jié)進(jìn)一步降低了速度。但與此同時,系統(tǒng)的可靠性也得到了顯著提高。
數(shù)據(jù)完整性怎么樣?我們可以通過在數(shù)據(jù)包中添加校驗和來實現(xiàn)這一點(diǎn),這樣接收方就可以確保數(shù)據(jù)完好無損。一種簡單的方法是對收到的所有字節(jié)進(jìn)行異或,并將其用作校驗和。如果任何一個位被誤讀,這將顯示在XOR校驗和中。如果同一列中的兩個位被誤讀,則校驗和保持不變,因此XOR僅對單位錯誤有效(但這些是最常見的)。
示例包
編寫數(shù)字92(十六進(jìn)制0x5C)
從設(shè)備讀取(TX設(shè)備)請求數(shù)據(jù),RX設(shè)備發(fā)送請求的數(shù)據(jù))
的構(gòu)建的的
該項目可以使用許多不同的電路構(gòu)造技術(shù)構(gòu)建,包括條形板,矩陣板,面包板和PCB。在這個例子中,我使用了在CNC機(jī)床上制造的PCB(通過隔離布線),但我正在考慮回到化學(xué)過程,原因?qū)⒃诤竺娴奈恼轮杏懻摗?/p>
這也是我第一個包含使用XYZ da Vinci Jr. 3D打印機(jī)制作的自定義項目框的項目。設(shè)計本身(痛苦地)在Google SketchUp中制作,然后由于STL導(dǎo)出器插件導(dǎo)出為STL文件。然后,STL文件在XYZmaker中導(dǎo)入并打印。雖然這個項目盒不使用螺絲,但未來的設(shè)計將會如此。雖然3D打印的型號可能價格昂貴(這個盒子使用價值約1.00美元的塑料),但它是一種定制設(shè)計,可以制作近乎完美的功能,如切口和孔。
-
數(shù)據(jù)傳輸
+關(guān)注
關(guān)注
9文章
1807瀏覽量
64418
發(fā)布評論請先 登錄
相關(guān)推薦
評論