寫這篇文章的目的呢,如題目所言,我承認自己是一個程式猿.....應該說很多很多學單片機的對于...先不說别的了,,無論是學51的還是32的,,,先問一下大家用序列槽發送資料的時候是怎麼發的???如果發整型的資料是怎麼發的??如果發浮點型的是怎麼發的????再問大家序列槽接收資料是怎麼接收的????親們有沒有想過自已用的方法是不是最好最好的方法了,反正我認為我自己現在用的方法應該是很好的了,,不說最好,因為我知道我還能在現在的基礎上稍微的修改讓它變為更好....隻是感覺無所謂了,因為現在所用的方法對于99.9999%的項目都适用....
好像自己在吹牛一樣,,,,,其實寫這篇文章呢,,,也早就想寫了,因為感覺好東西應該拿出來分享一下,希望親們能派的上用場
先給大家源碼一個51的一個32的
先看第一個問題,,,,大家用序列槽發送資料的時候是怎麼發的???
大多數人是不是還是這樣
上面是51的,隻是打比方哈
就是說
for(i=0;i<30;i++)
{
UartSend(Data[i]);
}
直接說弊端,舉個例子
每次都要發130個資料,,是不是每次循環要等着發完上面的130個資料才執行下面的函數,,,這樣話就不能及時的執行後面的函數,,,,剛想起來有沒有人經常在主循環裡面加延時的?????水準不高的人,,才會經常在主循環裡面加延時
那應該怎麼發....用中斷發
先看最普通的,用51寫的一個
發送資料的時候直接
UartSendTI(AD0123Table,21);
AD0123Table是一個數組
這樣的話這個函數
我現在往數組裡面存資料
然後我再往裡面存,,對了存資料是用的操作環形隊列的函數哈 int32_t rbWrite(rb_t *rb, const void *data, size_t count)
我又存了兩個,,如果存滿了還存,就會報錯,,是以咱呢先取兩個再存,,取資料也是用的環形隊列的函數
然後咱們再存兩個吧!!
具體是如何實作的就看這兩個吧
函數在32的工程裡面,51享受不起.....記憶體堪憂
我發送資料的時候就是直接往這個數組裡面存資料,序列槽從這個數組裡面取資料然後發出去(當然這個是在程式中設定的)
那個數組就是一直在轉圈圈......
曾經就有一個問題就是利用環形隊列解決的
<a href="http://www.cnblogs.com/yangfengwu/p/6921832.html" target="_blank">http://www.cnblogs.com/yangfengwu/p/6921832.html</a>
簡單來說就是把接收到的資料寫到Flash裡面....但是呢單片機的記憶體有限,不能夠一次性接收到所有的資料......是以我就
利用環形隊列..一邊序列槽接收着往環形隊列裡面寫資料,一邊從環形隊列裡面讀出資料寫到Flash裡面....
現在看如何利用環形隊列發送序列槽資料
先看發送,這是在中斷裡面,就是如果數組裡面有資料就一個一個取出來發出去
這是序列槽1 的,我定義了三個 Uart1rb Uart2rb Uart3rb 分别操作 Usart1SendBuff Usart2SendBuff Usart3SendBuff 這三個數組
現在看怎麼存,應該說怎麼控制序列槽發送資料
發送資料的時候直接往裡面丢資料就可以了
再進階一點,加上DMA,用DMA就不能用環形隊列了,其實下面大神介紹的用記憶體配置設定的方式,實質就是用連結清單,但是呢!我沒想明白把資料放進
連結清單然後設定一下DMA和直接用數組的方式設定一下DMA有多大差別,.....或許我還是沒有明白那位大神的用意......是以我就還是用的現在
的環形隊列的方式.....
可以看一下這位大神的介紹
<a href="https://wenku.baidu.com/view/c2b959f0caaedd3383c4d3d7.html" target="_blank">https://wenku.baidu.com/view/c2b959f0caaedd3383c4d3d7.html</a>
現在先問一下,如果讓大家傳輸一個220.5的資料給上位機,大家如何傳輸??假設不加任何的标志校驗什麼的
我的話
看一下
實際上220.5 用16進制表示就是 43 5C 80 00 高位在前
其實作在所有的儀器儀表的通信都是走的這種
如果是整形
就用
用共用體直接就可以實作兩邊的轉換,
如果用上位機列如C#的,一個函數就搞定
是以傳輸資料還是按照規範來
大家可以用51去試一試會發現和32的正好相反
0x43 高位存在了數組的低位上,, 0x00 存在了數組的高位上
其實就是在說資料存儲的時候資料的高位存在了低位址,資料的低位存在了高位址,,,就是大端模式
一般我發送資料會在最後加CRC16校驗
現在看接收.....算了明天再寫吧,感覺這些夠消化的了....................
程式裡面所有的函數都封裝好了,關鍵是自己親自去嘗試