|
普通IO口模擬串口通信 串口通信協(xié)議 串口傳輸 默認(rèn) 波特率9600 1起始位 1停止位 其他0 數(shù)據(jù)位是8位(注意圖上的給錯(cuò)了)。 傳輸時(shí),從起始位開始,從一個(gè)數(shù)據(jù)的低位(LSB)開始發(fā)送,如圖從左向右的順序,對(duì)電平拉高或拉低,最后停止位時(shí)拉高。 波特率大小,改變延時(shí)時(shí)間即可。例如9600 波特率 根據(jù)公式 : 1/9600=0.000104s(大致) 也就是說每發(fā)送1bit延時(shí)104us (下面我用9600波特率來說,代碼用的是19200) 串口發(fā)送 將電平拉低 延時(shí)104us(視為 起始位 0 傳輸數(shù)據(jù)正式開始) 其中數(shù)據(jù)我發(fā)送的是16進(jìn)制數(shù)據(jù)(8bit 一字節(jié) 例如10001000) 將想要發(fā)的數(shù)據(jù)按照二進(jìn)制的‘0’‘1’高低電平的方式,每發(fā)送1bit 延時(shí)104us 直到發(fā)送完到終止位 將電平拉高視為一包數(shù)據(jù)傳輸結(jié)束。(根據(jù)需求更改即可) 串口接收 (稍微麻煩一些) 兩種方法:第一種可以用定時(shí)中斷,每隔104us開啟一次定時(shí)中斷,中斷函數(shù)內(nèi)進(jìn)行高低電平判斷,將這些bit存儲(chǔ)最后轉(zhuǎn)換成需要的數(shù)據(jù)。第二種,用外部中斷處理函數(shù),外部中斷設(shè)置同時(shí)開啟上升沿下降沿,思路:根據(jù)上升下降的電平跳變分析。比如說,觸發(fā)外部中斷后檢測(cè)電平高低,記錄一下當(dāng)前時(shí)間,然后再進(jìn)入外部中斷后 計(jì)算出總共幾個(gè)bit (兩個(gè)沿跳變之間的時(shí)間 =現(xiàn)在記錄的時(shí)間 — 之前記錄的時(shí)間 bit=這個(gè)時(shí)間/104us) ,知道這個(gè)就可以轉(zhuǎn)換數(shù)據(jù)了。 定時(shí)中斷邏輯相對(duì)外部中斷而言簡(jiǎn)單好寫,但是數(shù)據(jù)多的時(shí)候準(zhǔn)確率下降很多,容易丟數(shù)據(jù)(因?yàn)槎〞r(shí)中斷畢竟用計(jì)時(shí)開啟中斷,不可能時(shí)間準(zhǔn)確每104us開啟一次,數(shù)據(jù)一多時(shí)間誤差大,自然丟包?梢試L試每發(fā)一串?dāng)?shù)據(jù),重新計(jì)時(shí)校準(zhǔn)一次)。外部中斷較為準(zhǔn)確,檢測(cè)的高低電平跳變較為明顯唯一,一個(gè)跳變就是一個(gè)數(shù)據(jù),只是分析情況比較多。 |
|