天天看點

1-關于單片機通信資料傳輸(中斷發送,大小端,IEEE754浮點型格式,共用體,空閑中斷,環形隊列)

寫這篇文章的目的呢,如題目所言,我承認自己是一個程式猿.....應該說很多很多學單片機的對于...先不說别的了,,無論是學51的還是32的,,,先問一下大家用序列槽發送資料的時候是怎麼發的???如果發整型的資料是怎麼發的??如果發浮點型的是怎麼發的????再問大家序列槽接收資料是怎麼接收的????親們有沒有想過自已用的方法是不是最好最好的方法了,反正我認為我自己現在用的方法應該是很好的了,,不說最好,因為我知道我還能在現在的基礎上稍微的修改讓它變為更好....隻是感覺無所謂了,因為現在所用的方法對于99.9999%的項目都适用....

好像自己在吹牛一樣,,,,,其實寫這篇文章呢,,,也早就想寫了,因為感覺好東西應該拿出來分享一下,希望親們能派的上用場

先給大家源碼一個51的一個32的

先看第一個問題,,,,大家用序列槽發送資料的時候是怎麼發的???

大多數人是不是還是這樣

上面是51的,隻是打比方哈

 就是說

for(i=0;i<30;i++)

{

  UartSend(Data[i]);

}

直接說弊端,舉個例子

每次都要發130個資料,,是不是每次循環要等着發完上面的130個資料才執行下面的函數,,,這樣話就不能及時的執行後面的函數,,,,剛想起來有沒有人經常在主循環裡面加延時的?????水準不高的人,,才會經常在主循環裡面加延時

那應該怎麼發....用中斷發

先看最普通的,用51寫的一個

  

 

發送資料的時候直接

UartSendTI(AD0123Table,21);

AD0123Table是一個數組

這樣的話這個函數

我現在往數組裡面存資料

1-關于單片機通信資料傳輸(中斷發送,大小端,IEEE754浮點型格式,共用體,空閑中斷,環形隊列)

然後我再往裡面存,,對了存資料是用的操作環形隊列的函數哈  int32_t rbWrite(rb_t *rb, const void *data, size_t count)

1-關于單片機通信資料傳輸(中斷發送,大小端,IEEE754浮點型格式,共用體,空閑中斷,環形隊列)

 我又存了兩個,,如果存滿了還存,就會報錯,,是以咱呢先取兩個再存,,取資料也是用的環形隊列的函數

1-關于單片機通信資料傳輸(中斷發送,大小端,IEEE754浮點型格式,共用體,空閑中斷,環形隊列)
1-關于單片機通信資料傳輸(中斷發送,大小端,IEEE754浮點型格式,共用體,空閑中斷,環形隊列)

然後咱們再存兩個吧!!

1-關于單片機通信資料傳輸(中斷發送,大小端,IEEE754浮點型格式,共用體,空閑中斷,環形隊列)

具體是如何實作的就看這兩個吧

1-關于單片機通信資料傳輸(中斷發送,大小端,IEEE754浮點型格式,共用體,空閑中斷,環形隊列)

函數在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-關于單片機通信資料傳輸(中斷發送,大小端,IEEE754浮點型格式,共用體,空閑中斷,環形隊列)

先看發送,這是在中斷裡面,就是如果數組裡面有資料就一個一個取出來發出去

這是序列槽1 的,我定義了三個 Uart1rb  Uart2rb  Uart3rb  分别操作  Usart1SendBuff    Usart2SendBuff    Usart3SendBuff  這三個數組

 現在看怎麼存,應該說怎麼控制序列槽發送資料

1-關于單片機通信資料傳輸(中斷發送,大小端,IEEE754浮點型格式,共用體,空閑中斷,環形隊列)

發送資料的時候直接往裡面丢資料就可以了

再進階一點,加上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的資料給上位機,大家如何傳輸??假設不加任何的标志校驗什麼的

我的話

1-關于單片機通信資料傳輸(中斷發送,大小端,IEEE754浮點型格式,共用體,空閑中斷,環形隊列)

看一下

1-關于單片機通信資料傳輸(中斷發送,大小端,IEEE754浮點型格式,共用體,空閑中斷,環形隊列)

實際上220.5 用16進制表示就是 43 5C  80  00  高位在前

其實作在所有的儀器儀表的通信都是走的這種

1-關于單片機通信資料傳輸(中斷發送,大小端,IEEE754浮點型格式,共用體,空閑中斷,環形隊列)

如果是整形

就用

1-關于單片機通信資料傳輸(中斷發送,大小端,IEEE754浮點型格式,共用體,空閑中斷,環形隊列)

用共用體直接就可以實作兩邊的轉換,

1-關于單片機通信資料傳輸(中斷發送,大小端,IEEE754浮點型格式,共用體,空閑中斷,環形隊列)

如果用上位機列如C#的,一個函數就搞定

是以傳輸資料還是按照規範來

大家可以用51去試一試會發現和32的正好相反

0x43  高位存在了數組的低位上,,   0x00 存在了數組的高位上

 其實就是在說資料存儲的時候資料的高位存在了低位址,資料的低位存在了高位址,,,就是大端模式

一般我發送資料會在最後加CRC16校驗   

現在看接收.....算了明天再寫吧,感覺這些夠消化的了....................

程式裡面所有的函數都封裝好了,關鍵是自己親自去嘗試

繼續閱讀