1. 程式人生 > >ESP8266學習之NONOS MQTT DEMO 增加串列埠處理程式

ESP8266學習之NONOS MQTT DEMO 增加串列埠處理程式

專案背景

一個溫控器專案,可以本地控制空調,也可微信遠端控制。其中,遠端控制為:微信掃碼進入控制頁面,該頁面實現對空調狀態的實時顯示和控制功能。頁面也伺服器之間採用websocket協議通訊,空調與伺服器通過ESP8266進行無線通訊,採用MQTT協議,實現實時雙向通訊。因為ESP8266與空調控制器之間採用串列埠uart通訊,所以需要給官方提供的mqtt demo裡增加串列埠處理程式。

串列埠介紹

ESP8266有兩個串列埠,UART0和UART1。他們各有一個128Bytes的硬體FIFO,讀寫FIFO都在同一個地址操作。UART0一般用於通訊,UART1只有TX功能,一般用於列印日誌。但是預設情況下,os_print()函式使用的是UART0,可在uart_init中進行修改

另外,模組剛上電時會列印一串亂碼。這是因為這期間的ESP8266的串列埠波特率(115200)是跟外部晶振相關的,程式預設晶振為40M。所以如果你使用的外部晶振是26M,則應該調整串列埠工具波特率為26*(115200/40)=74880 。

增加串列埠處理程式

下圖是官方下載的demo結構,紅框裡的資料夾driver_lib是官方提供的各種驅動程式,我們使用的串列埠程式也在裡面

開啟driver_lib資料夾後,README.md就是它的使用方法

# driver_lib
## method 1
Generate libdriver.a in SDK/lib, in driver_lib folder, run:
 
    ./make_lib.sh driver

## method 2
* STEP 1: 
    
    Copy driver folder to your project sub-folder, such as app folder. Unused drivers can be removed in your project.

* STEP 2: 

    Modify Makefile in app folder.

    1). Search SUBDIRS, add driver as subdir, such as:

        SUBDIRS = user driver

    2). Search COMPONENTS_eagle.app.v6, add libdriver.a, such as:

        COMPONENTS_eagle.app.v6 = user/libuser.a driver/libdriver.a

我們採用方法2: 1)複製driver資料夾到自己的工程子資料夾裡   2)修改app的makefile檔案

上圖紅框內容為makefile增加內容

這樣,就新增成功了。另外,uart.h和uart_register.h可能也需要從driver_lib資料夾裡複製過來,不然有些巨集可能會沒有定義。

串列埠工作流程

1. 接收資料:模組串列埠接收到資料時,會先填充到FIFO裡。每當FIFO接收到的資料時,都會產生中斷,中斷處理程式為uart0_rx_intr_handler(uart_init -> uart_config->ETS_UART_INTR_ATTACH(uart0_rx_intr_handler,  &(UartDev.rcv_buff))進行註冊)。在中斷處理程式中,判斷接收的資料長度或者接收時間是否超過閾值。如果超過,則給接收任務(uart_init 裡進行註冊)傳送訊號量:system_os_post(uart_recvTaskPrio, 0, 0)。uart_recvTask接收到訊號量後,就開始進行處理:

這裡,巨集UART_BUFF_EN非常重要,如果該巨集值為0,則執行#else後面的程式,直接打印出來。如果我們需要處理,則需修改UART_BUFF_EN的值為1,進入Uart_rx_buff_enq()。在Uart_rx_buff_enq函式裡主要的功能是把接收到的資料儲存到pRxBuffer裡。然後我們就可以對pRxBuffer進行解析來處理接收的內容了。(pRxBuffer是個環形快取)

因為個人覺得Uart_rx_buff_enq這個函式寫得非常優雅,所以特地放上來和學習一下,增加了註釋:

//enqueue data from uart fifo to rx buffer
void Uart_rx_buff_enq(void)
{
    uint8 fifo_len = 0, buf_idx = 0,loop;
    ETSParam par = 0;
    uint8 fifo_data;
    uint8* tail = (pRxBuffer->pUartBuff + pRxBuffer->UartBuffSize);
    fifo_len = (READ_PERI_REG(UART_STATUS(UART0))>>UART_RXFIFO_CNT_S)&UART_RXFIFO_CNT;
    
    //如果pRxBuffer的剩餘空間不夠,則只取pRxBuffer->Space
    if(fifo_len > pRxBuffer->Space) {
        buf_idx = pRxBuffer->Space;
    }else{
        buf_idx = fifo_len;
    }
    
    loop = buf_idx;
    while (loop--) {
        *(pRxBuffer->pInPos++) = READ_PERI_REG(UART_FIFO(UART0)) & 0xFF;
        if (pRxBuffer->pInPos == tail) {
                pRxBuffer->pInPos = pRxBuffer->pUartBuff;
        }            
    }
    
    fifo_len -= buf_idx;
    //這裡是當 fifo_len > pRxBuffer->Space, 釋放fifo裡沒有被接收的資料
    //如果fifo_len < pRxBuffer->Space,則fifo_len -= buf_idx == 0,則不進行下面的迴圈
    while (fifo_len--) {
        fifo_data = READ_PERI_REG(UART_FIFO(UART0)) & 0xFF; // discard data
    }
    
    pRxBuffer->Space -= buf_idx ;
    par = buf_idx;

    //這裡給自己的任務傳送訊號量,進行串列埠接收後續處理
    if(system_os_post(1, 1, 0) != TRUE) {
        //os_printf("post fail!!!\n\r");
    }

    //中斷訊號清除和重新使能
    WRITE_PERI_REG(UART_INT_CLR(UART0), UART_RXFIFO_FULL_INT_CLR |     
    UART_RXFIFO_TOUT_INT_CLR);
    uart_rx_intr_enable(UART0);
}

2. 傳送資料:這裡跟接收資料一樣分析,省略。。。

相關推薦

ESP8266學習NONOS MQTT DEMO 增加串列處理程式

專案背景 一個溫控器專案,可以本地控制空調,也可微信遠端控制。其中,遠端控制為:微信掃碼進入控制頁面,該頁面實現對空調狀態的實時顯示和控制功能。頁面也伺服器之間採用websocket協議通訊,空調與伺服器通過ESP8266進行無線通訊,採用MQTT協議,實現實時雙向通訊。因

我的CUDA學習旅1——大影象分塊處理程式(包括求均值,最大值等)

引言 在我的第一篇文章中我簡單介紹了CUDA以及我的一些個人學習見解,在本文中我將開始正式開始CUDA實踐之旅,眾做周知CUDA目前應用的領域十分廣泛,它能把一些普通的CPU程式碼提速幾十倍甚至幾百倍。在本人所從事的影象處理領域,在一些大影象的處理上(4K以上

Esp8266學習旅⑥ 瞭解SmartConfig與Airkiss一鍵配網,給8266一鍵配網上雲端。(帶Demo)

目錄: 一、前言 聽到 SmartConfig這個單詞,字義上就是智慧配置,但是我們電子發燒友都是稱之為一鍵配網, 聽到Airkiss這個單詞就有點意思了。飛吻,象徵著速度飛一般的快。 本博文的

ESP8266學習路 十三 (SPI讀取max6675)

通過spi模組讀取四路max6675溫度資料   max6675.lua檔案: SpiPinCS1 = 8--GPIO15 SpiPinCS2 = 7--GPIO13 SpiPinCS3 = 0--GPIO16 SpiPinCS4 = 1--GPIO5 --定義四路

Ldap學習使用phpldapadmin 進行增加使用者

這段時間在玩openLdap,剛剛安裝了openLdap,安裝過程參考上一篇: 安裝好之後訪問phpldapadmin: 如下頁面: 點選左側的登入按鈕: 使用使用者名稱:cn=Manager,dc=mypaas,dc=com 密碼:123456

ESP8266學習路 十二 (讀寫檔案)

通過串列埠傳送指令控制繼電器, 掉電記憶繼電器狀態,再次上電恢復繼電器狀態。 init.lua檔案 RELAY_Stat = "" RELAY_Pin = 1 gpio.mode(RELAY_Pin, gpio.OUTPUT) if file.open("mode.lua"

ESP8266NONOS SDK開發,串列傳送、接收與中斷

ESP8266感覺要成現在物聯網的黑馬了,整合WiFi功能、能程式設計,還便宜,確實挺6的。 就是能提供的資料太少,感覺官網上的遠遠不夠用,這個串列埠收發與中斷折騰了我是在太久,在這裡小的就分享一下自己的經驗。 大家都問我要工程,我終於可以上傳啦: http://d

Tensorflow深度學習十二:基礎圖像處理

fcm 數字 ssi port con tty .net term file Tensorflow深度學習之十二:基礎圖像處理之二 from:https://blog.csdn.net/davincil/article/details/76598474 首先放出

Linux學習十一-Linux字符集及亂碼處理

gin tails 讀取 文件 latin1 style ESS 自身 win Linux字符集及亂碼處理 1、字符(Character)是各種文字和符號的總稱,包括各國家文字、標點符號、圖形符號、數字等。字符集(Character set)是多個字符的集合,字符集種類較多

JAVA學習路第2篇-JAVA第一個程式hello world

java實現hello word 第1篇中我們瞭解了什麼是機器語言以及關於儲存單位的一些知識點,知道了能夠用編寫機器語言的二進位制值程式設計,但是二進位制面向機器挺友好機器能夠快速的識別和執行,但是面向編寫它的人就不太友好了。能否有一種語言對人比較友好而且機器還能識別執行的呢?我告訴你是

給android裝置增加串列功能

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Ubuntu14_ROS學習筆記(12)Dynamixel串列U2D2Dynamixel驅動ID編寫

昨天剛買回來U2D2Dynamixel串列埠和供電模組 大體在WINDOW10上測試了一下可用,現在通過Ubuntu系統驅動舵機,舵機型號AX-12+(已編好ID),串列埠以及供電模組U2D2Dynamixel(USB2Dynamixel二代,死貴) 首先,連線

【redis學習四】Redis的過期鍵處理及鍵淘汰策略

    在redis中可以通過如下命令設定鍵的生存時間或生命週期: EXPIRE KEY TTL 命令用於將key的生存時間設定為ttl秒 PEXPIRE KEY TTL 命令用於將key的生存時間設定為ttl毫秒 EXPIREAT KEY TIMESTAMP

linux增加串列傳送檔案功能 以及minicom

特此宣告我是轉載的,紅字部分為我新增的。 安裝配置minicom並實現通過minicom傳輸檔案 參考文獻: 嵌入式linux系統與主機通過串列埠傳輸檔案 ubuntu 下minicom的安裝及使用 作業系統:ubuntu10.04 交叉編譯器:arm-linux-gcc

stm32串列通訊程式UART2(TTL)

一、硬體連線二、串列埠助手設定:三、keil下程式設計1.要新增的工程檔案二要編寫的user檔案1.main.c#include "printf.h" int main() { printf_init(); printf("

ESP8266串列處理

UART0 預設會在上電啟動期間輸出⼀一些列印,此期間列印內容的波特率與所⽤用的外部晶振頻率有關。使⽤用 40 MHz 晶振時,該段列印波特率為 115200;使⽤用 26 MHz 晶振時,該段列印波特率為 74880。如果列印 資訊影響裝置功能,建議在上電期間將 U0TX

【opencv學習二十四】OpenCV濾波處理對比

OpenCV的鄰域濾波處理函式主要都通影象的卷積操作,有 1方框濾波boxFilter(),屬於線性濾波,其原理是用一個矩陣和一個核矩陣卷積操作; 2均值濾波blur(),也屬於線性濾波,是方框濾波一種歸一化後的方框濾波; 3高斯濾波GaussianBlur(),屬於線性濾

MFC學習筆記 — VC++中自動檢測串列熱插拔事件

文章出處:(轉載文章,如有不妥,通知後我會立即刪除) 文章索引1 文章索引2 這裡主要利用Cwnd的ON_WM_DEVICECHANGE訊息來處理。 Windows作業系統傳送WM_DEVICECHANGE有些限制: 1、只有頂層窗體的程式才能收到這個訊息; 2、

windows下C語言版串列接收程式(基於VS2017)

#include "pch.h" #define _CRT_SECURE_NO_WARNINGS  #include <iostream> #include <stdio.h> #include <windows.h> #include <s

windows下C語言版串列傳送程式(基於VS2017)

#include "pch.h" #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <windows.h> #include <string.h> #include <conio.h&