0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

機(jī)智云Gokit3.X源代碼分析之串口接收數(shù)據(jù)這塊的機(jī)制

9GxC_IoTMaker ? 來源:未知 ? 作者:李倩 ? 2018-07-13 14:51 ? 次閱讀

昨天分享了整個(gè)程序的架構(gòu),今天重點(diǎn)分析一下串口接收數(shù)據(jù)這塊的機(jī)制

我們知道,通過串口接收數(shù)據(jù)一般有3中方式,輪詢、中斷以及DMA。輪詢模式為堵塞模式,必須要定時(shí)去查詢收到的數(shù)據(jù);中斷模式為非堵塞模式,也是平時(shí)用的比較多的,但每次只能接收一個(gè)字節(jié);還有一個(gè)比較好的方法那就是用串口的空閑中斷+DMA實(shí)現(xiàn)串口數(shù)據(jù)的接收,在接收一幀數(shù)據(jù)只需要中斷一次,這樣就可以接收不定長(zhǎng)數(shù)據(jù)了。機(jī)智云這里采用的方式2,即常規(guī)的中斷方式。

數(shù)據(jù)通訊采用的串口2,引腳為GPIO2和GPIO3,在gizwitsInit()中進(jìn)行初始化

我們進(jìn)去看看

上圖主要初始化了一些硬件接口,并開啟中斷,這也是我們一般的寫法,再往下看,看到一個(gè)pRb的結(jié)構(gòu)體,這是個(gè)什么呢,我們追蹤下,下面是pRb的定義

我們先來解釋下環(huán)形緩沖區(qū)的原理:

環(huán)形緩沖區(qū)通常有一個(gè)讀指針和一個(gè)寫指針。讀指針指向環(huán)形緩沖區(qū)中可讀的數(shù)據(jù),寫指針指向環(huán)形緩沖區(qū)中可寫的緩沖區(qū)。通過移動(dòng)讀指針和寫指針就可以實(shí)現(xiàn)緩沖區(qū)的數(shù)據(jù)讀取和寫入。在通常情況下,環(huán)形緩沖區(qū)的讀用戶僅僅會(huì)影響讀指針,而寫用戶僅僅會(huì)影響寫指針。

這里的rbCapacity代表緩沖區(qū)的容量,head指向了讀區(qū)域,tail指向了寫區(qū)域,rbBuff指向緩沖區(qū)的入口地址,示意圖入下

明白了結(jié)構(gòu)體的定義,我們接著往下看

rbCreate(),顧名思義,此函數(shù)的作用用于創(chuàng)建緩沖區(qū),將緩沖區(qū)的head/Tail都指向緩沖區(qū)的首地址,那么rbCapacity和rbBuff在哪里賦值的呢?我們返回去看gizwitsInit();

看到這里我們就明白了,繼續(xù)往下看

這個(gè)函數(shù)為刪除緩沖區(qū)函數(shù),將結(jié)構(gòu)體里面的數(shù)據(jù)全部清零

這個(gè)函數(shù)為獲取緩沖區(qū)的總?cè)萘?,很好理?/p>

接下來這個(gè)函數(shù)為緩沖區(qū)有多少數(shù)據(jù)可以讀,有三種情況:

1、Head和Tail都指向同一個(gè)地址,可讀大小為0,返回0,這種情況只會(huì)出現(xiàn)在緩沖區(qū)還沒有數(shù)據(jù)的時(shí)候,使用之后就不會(huì)出現(xiàn)頭尾重合的現(xiàn)象;

2、Head

3、Head>Tail,如下圖所示,緩沖區(qū)已經(jīng)寫滿,并且從開頭處重新寫了數(shù)據(jù),可讀部分為藍(lán)灰色區(qū)域(rb_capacity(rb) - (rb->rb_head - rb->rb_tail));

接下來的函數(shù)為可寫區(qū)域大小,直接用總?cè)萘縭b_capacity(rb)減去可讀區(qū)域大小就好了。

然后是讀數(shù)據(jù)函數(shù),從Head處開始讀,讀取count個(gè)數(shù)據(jù),放到data地址開始的數(shù)據(jù)區(qū)域,如下圖所示,也是分為三種情況

1、Head

2、Head>Tail,且count中的數(shù)據(jù)小于從Head到緩沖區(qū)尾部的個(gè)數(shù),即小于下圖中的藍(lán)灰色,與第一種情況一樣,直接復(fù)制相應(yīng)內(nèi)存,之后修改Head指針即可。

3、Head>Tail,且count中的數(shù)據(jù)大于從Head到緩沖區(qū)尾部的個(gè)數(shù),即大于下圖中的看灰色,這種情況我們就先把Head到緩沖區(qū)尾部的數(shù)據(jù)復(fù)制到data處,再把綠色區(qū)域的復(fù)制過去,這里綠色部分并不會(huì)超過Tail,寫操作中做了限制。

最后是寫數(shù)據(jù)函數(shù),把從data指向的地址,寫到Tail指向的地址,寫count個(gè)數(shù)據(jù),返回成功寫入的個(gè)數(shù),在這里判斷了要寫入的數(shù)據(jù)大小要小于可寫區(qū)域大小,防止數(shù)據(jù)覆蓋,如下圖所示,也是分為三種情況

1、Head

2、Head

3、Head>Tail,這個(gè)因?yàn)橐呀?jīng)做了數(shù)據(jù)合法判斷,所以直接復(fù)制數(shù)據(jù)就行。如下圖所示

那么明白了串口環(huán)形buff的機(jī)制,數(shù)據(jù)是從哪里進(jìn)入的呢,我們找到串口中斷的入口,

可以看到中斷程序非常簡(jiǎn)單,中斷之后直接往緩沖區(qū)丟一個(gè)數(shù)據(jù)就行了,采用這種數(shù)據(jù)結(jié)構(gòu),大大提高了程序的穩(wěn)定性,同時(shí)操作起數(shù)據(jù)來也很方便,需要的時(shí)候直接去讀緩沖區(qū)數(shù)據(jù)就好了。今天就先分享這么多,下期分享機(jī)智云的協(xié)議與結(jié)構(gòu)體的定義,謝謝大家!

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 串口
    +關(guān)注

    關(guān)注

    14

    文章

    1540

    瀏覽量

    76064
  • 源代碼
    +關(guān)注

    關(guān)注

    96

    文章

    2943

    瀏覽量

    66618
  • 機(jī)智云
    +關(guān)注

    關(guān)注

    2

    文章

    573

    瀏覽量

    26361

原文標(biāo)題:Gokit3.0 STM32源代碼分析之二

文章出處:【微信號(hào):IoTMaker,微信公眾號(hào):機(jī)智云開發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    GC211+Gokit3接入機(jī)智實(shí)現(xiàn)4G開發(fā)調(diào)試的過程

    本文以圖文方式講解GC211+Gokit3,接入機(jī)智,實(shí)現(xiàn)4G開發(fā)調(diào)試的過程。
    的頭像 發(fā)表于 06-16 10:35 ?3758次閱讀

    機(jī)智GoKit開發(fā)板試用進(jìn)程大匯總(2015.08.07已更新)

    (6.5)https://bbs.elecfans.com/jishu_486535_1_1.html3、【GoKit試用體驗(yàn)】+ GoKit串口數(shù)
    發(fā)表于 06-05 10:40

    GoKit試用體驗(yàn)】+機(jī)智GoKit開發(fā)套件學(xué)習(xí)分享1開箱圖

    本帖最后由 孤雨冰狐 于 2015-6-9 10:34 編輯 機(jī)智GoKit開發(fā)套件學(xué)習(xí)分享1開箱圖今天我申請(qǐng)的機(jī)智
    發(fā)表于 06-08 17:13

    【萬元大獎(jiǎng)】機(jī)智智能硬件創(chuàng)新大賽

    帖圖文并茂,有清晰的制作過程;項(xiàng)目必須鏈接上機(jī)智自助開發(fā)平臺(tái)。2)開貼名稱格式:基于Gokit 的作品:【Gokit 3
    發(fā)表于 07-06 13:42

    【試用活動(dòng)】Gokit 2.XGokit 3.X 免費(fèi)申請(qǐng)?jiān)囉?/a>

    活動(dòng)主題:Gokit 2.X、Gokit 3.X 免費(fèi)申請(qǐng)?jiān)囉茫ù嘶顒?dòng)長(zhǎng)期有效)Gokit2 集成了馬達(dá)、1600萬色的LED、Wifi模塊
    發(fā)表于 08-02 14:24

    機(jī)智想說愛你不容易 - 如何開發(fā)接入機(jī)智的物聯(lián)網(wǎng)設(shè)備

    的功能和特性比如ECE邊緣計(jì)算引擎,RTBD實(shí)時(shí)大數(shù)據(jù)平臺(tái),D3動(dòng)態(tài)數(shù)據(jù)編排引擎等印象發(fā)生了很大的改觀。對(duì)機(jī)智產(chǎn)生了濃厚的興趣,想著做一個(gè)
    發(fā)表于 09-27 13:26

    Gokit 3試用體驗(yàn)】(8)微信控制Gokit體驗(yàn)機(jī)智寵物屋

    機(jī)智匿名注冊(cè)一個(gè)機(jī)智用戶,獲得用戶 uid 和 token9. 業(yè)務(wù)根據(jù)用戶的 token 以及設(shè)備的 did 和 passcod
    發(fā)表于 10-02 12:19

    Gokit 3試用體驗(yàn)】(7)控制繼電器

    的任務(wù),應(yīng)用里再加個(gè)應(yīng)答重發(fā)機(jī)制,問題就是這樣解決了。代碼傳上來,有相同興趣的可以討論一下。串口源碼:機(jī)智的源碼在這里,跟之前的差不多。
    發(fā)表于 10-12 23:29

    MCU代碼自動(dòng)生成功能,Gokit二次開發(fā)視頻教學(xué)

    云端生成通用平臺(tái)代碼的方法,以及如何將代碼一步步移植到其他平臺(tái)。針對(duì)已有跨平臺(tái)開發(fā)經(jīng)驗(yàn)的小伙伴,并想在其他硬件平臺(tái)上實(shí)現(xiàn)機(jī)智服務(wù)(至少
    發(fā)表于 10-31 18:30

    如何使用機(jī)智開發(fā)一款智能硬件產(chǎn)品

    Gokit3】序列2:Gokit3介紹第3篇:【原創(chuàng)】【魅力Gokit3】序列
    發(fā)表于 12-26 15:56

    機(jī)智在Amazon Alexa平臺(tái)發(fā)布Smarthome和Custom Skill,實(shí)現(xiàn)亞馬遜Echo直接控制Gokit

    )是一個(gè)由自服務(wù)API、工具、文件和實(shí)例代碼的集合,可輕松構(gòu)建你自定義的Alexa skills,然后發(fā)布。機(jī)智開源套件 Gokit 是一塊標(biāo)準(zhǔn)的量產(chǎn)級(jí)嵌入式開發(fā)板,即代表了通用型智
    發(fā)表于 03-31 11:54

    機(jī)智2016~2017優(yōu)秀項(xiàng)目盤點(diǎn)

    】之無線工業(yè)粉塵監(jiān)測(cè)儀【Gokit 3倉(cāng)鼠管家和OpenHamtaro開源項(xiàng)目【Gokit智慧宿舍【
    發(fā)表于 09-22 13:03

    機(jī)友分享 | 基于Gokit+機(jī)智的低成本MCU紅外遙控器

    Gokit,通過機(jī)智的物聯(lián)網(wǎng)平臺(tái),能夠滿足我的需求,那么怎么來做呢?根據(jù)經(jīng)驗(yàn)所得,需要對(duì)這個(gè)工作拆分為幾部分:機(jī)智平臺(tái)
    發(fā)表于 07-07 12:19

    4G模組接入機(jī)智gokit3開發(fā)板

    )帖子的(3.代碼修改),繼電器部分無需參考即可。3.產(chǎn)品調(diào)試將編譯好的代碼燒錄到gokit,燒錄完成之后將4G卡插入ML301-GC211
    發(fā)表于 10-31 19:55

    機(jī)智Gokit3.X源代碼分析之一

    將每個(gè)按鍵的物理GPIO以及長(zhǎng)短按回調(diào)函數(shù)都賦值到相應(yīng)數(shù)組,這里一共初始化了2個(gè)按鍵,之后將數(shù)組地址傳到keys這個(gè)結(jié)構(gòu)體變量,初始化之后就可以通過keys來調(diào)用按鍵的所有功能了。按鍵的具體控制原理后面會(huì)將。接下來是機(jī)智協(xié)議的初始化,之后打印一串初始化成功的
    的頭像 發(fā)表于 07-13 14:47 ?3134次閱讀