SimonLiu的ESP8266與AliOS Things 學習教程系列之十八:uart0和uart1打印的進一步優(yōu)化以及不同波特率設(shè)置

歡迎加入交流群:ESP8266 AliOS Things 群 號: 107723112
所有教程請看 AliOS Things 入門教程系列
此教程在SimonLiu的CSDN博客同步更新。

小貼士: 如果使用串口接收外設(shè)數(shù)據(jù)关带,請先關(guān)閉CLI妨退,否則可能導(dǎo)致收取數(shù)據(jù)丟幀或者發(fā)生其他錯誤西轩。

SimonLiu的ESP8266與AliOS Things 學習教程系列之四:uart0和uart1串口打印一文中SimonLiu提供了一個把LOG()重定向到uart1的方法竹挡。但是某些情況下,我們還是需要同時使用uart0和uart1,那么如何實現(xiàn)呢?

1. 簡單版本

  • 向uart0發(fā)送單個字符
    uart0_write_char( char c)瞄桨, 例如 uart0_write_char('a')
  • 向uart0發(fā)送字符串
void uart0_sendStr(const char *str)
{
    while(*str){
        uart0_write_char(*str++);
    }
}

2. 復(fù)雜版本但是有bug

首先
platform\mcu\esp8266\hal\uart.c文件中,找到int32_t hal_uart_send()函數(shù)讶踪,把uart0_write_char(pdata[i]);
修改為如下內(nèi)容:

        if (uart->port == 0)
            uart0_write_char(pdata[i]);
        else
            uart1_write_char(pdata[i]);

然后下面的代碼就實現(xiàn)了uart0和uart1的輸出讲婚。但是有意思的是,這樣改還有個bug俊柔,就是LOG()輸出的信息筹麸,前面的部分[******]<V>輸出到uart1,而message from LOG輸出到了uart0雏婶。

#include <stdio.h>

#include <aos/kernel.h>
#include "aos/hal/uart.h"
#include "driver/gpio.h"
#include "uart.h"
#include "ulog/ulog.h"

int application_start(int argc, char *argv[])
{

    uart_config_t uartConfig0;
    uartConfig0.baud_rate = 9600; 
    uartConfig0.parity = 0;
    uartConfig0.stop_bits = 1;
    uart_dev_t uart0;
    uart0.port = 0; 
    uart0.config = uartConfig0;
    hal_uart_init(&uart0);

    uart_config_t uartConfig1;
    uartConfig1.baud_rate = 115200; 
    uart_dev_t uart1;
    uart1.port = 1; 
    uart1.config = uartConfig1;
    hal_uart_init(&uart1);

    while(1) {
        printf("\r\n message from printf(), to uart1 \r\n");
        LOG("message from LOG");
        const char message0[] = "\r\n hal_uart_send message to uart0\r\n";
        const char message1[] = "\r\n hal_uart_send message to uart1\r\n";
        hal_uart_send(&uart0, message0, strlen(message0), 0);
        hal_uart_send(&uart1, message1, strlen(message1), 0);
        aos_msleep(1000);
    };
}

3.關(guān)于兩個串口設(shè)置不同的波特率

串口的初始化apiplatform/mcu/esp8266/bsp/driver/uart.c中物赶,目前的代碼是默認如果不設(shè)置,uart0波特率是921600留晚。但是一旦初始化了uart1,uart0的波特率會被改為和uart1一樣酵紫。
如果要設(shè)置不同的波特率,需要修改如下函數(shù)

void
uart_init_new(uart_dev_t *uart)
{
    UART_WaitTxFifoEmpty(UART0);
    UART_WaitTxFifoEmpty(UART1);

    if (uart == NULL)
    {
        return;
    }

    if (uart->port == 1)
    {
        //printf("port= 1\n ");

        //uart1 setting
        UART_ConfigTypeDef uart_config;
        uart_config.baud_rate = uart->config.baud_rate;
        uart_config.data_bits = UART_WordLength_8b;
        uart_config.parity = USART_Parity_None;
        uart_config.stop_bits = USART_StopBits_1;
        uart_config.flow_ctrl = USART_HardwareFlowControl_None;
        uart_config.UART_RxFlowThresh = 120;
        uart_config.UART_InverseMask = UART_None_Inverse;
        /*注意修改以下部分*/
        UART_ParamConfig(UART1, &uart_config);

        //uart2 setting for log
        // uart_config.baud_rate = uart->config.baud_rate;
        // UART_ParamConfig(UART1, &uart_config);

        // UART_IntrConfTypeDef uart_intr;
        // uart_intr.UART_IntrEnMask = UART_RXFIFO_TOUT_INT_ENA | UART_FRM_ERR_INT_ENA | UART_RXFIFO_FULL_INT_ENA | UART_TXFIFO_EMPTY_INT_ENA;
        // uart_intr.UART_RX_FifoFullIntrThresh = 100;
        // uart_intr.UART_RX_TimeOutIntrThresh = 10;
        // uart_intr.UART_TX_FifoEmptyIntrThresh = 20;
        // UART_IntrConfig(UART0, &uart_intr);
        /*注意修改以上部分*/
        UART_SetPrintPort(UART1);
        UART_intr_handler_register(uart0_rx_isr, NULL);
        ETS_UART_INTR_ENABLE();
    }
    else
    {
        //printf("port= 0 \n ");
        UART_ConfigTypeDef uart_config;
        /*注意修改以下部分*/
        uart_config.baud_rate = BIT_RATE_9600;
        // uart_config.baud_rate = BIT_RATE_921600;
        /*注意修改以上部分*/
        uart_config.data_bits = UART_WordLength_8b;
        uart_config.parity = USART_Parity_None;
        uart_config.stop_bits = USART_StopBits_1;
        uart_config.flow_ctrl = USART_HardwareFlowControl_None;
        uart_config.UART_RxFlowThresh = 120;
        uart_config.UART_InverseMask = UART_None_Inverse;
        UART_ParamConfig(UART0, &uart_config);

        UART_IntrConfTypeDef uart_intr;
        uart_intr.UART_IntrEnMask = UART_RXFIFO_TOUT_INT_ENA | UART_FRM_ERR_INT_ENA | UART_RXFIFO_FULL_INT_ENA | UART_TXFIFO_EMPTY_INT_ENA;
        uart_intr.UART_RX_FifoFullIntrThresh = 10;
        uart_intr.UART_RX_TimeOutIntrThresh = 2;
        uart_intr.UART_TX_FifoEmptyIntrThresh = 20;
        UART_IntrConfig(UART0, &uart_intr);

        UART_SetPrintPort(UART0);
        UART_intr_handler_register(uart0_rx_isr, NULL);
        ETS_UART_INTR_ENABLE();
    }


    /*
    UART_SetWordLength(UART0,UART_WordLength_8b);
    UART_SetStopBits(UART0,USART_StopBits_1);
    UART_SetParity(UART0,USART_Parity_None);
    UART_SetBaudrate(UART0,74880);
    UART_SetFlowCtrl(UART0,USART_HardwareFlowControl_None,0);
    */
}

經(jīng)測試错维,uart0波特率只能通過類似uart_config.baud_rate = BIT_RATE_9600;的方式修改奖地,使用uart_config.baud_rate = uart->config.baud_rate;會導(dǎo)致兩個串口都亂碼,很奇怪赋焕。原因不明参歹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市隆判,隨后出現(xiàn)的幾起案子犬庇,更是在濱河造成了極大的恐慌,老刑警劉巖侨嘀,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件臭挽,死亡現(xiàn)場離奇詭異,居然都是意外死亡咬腕,警方通過查閱死者的電腦和手機欢峰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涨共,“玉大人纽帖,你說我怎么就攤上這事∩酚” “怎么了抛计?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長照筑。 經(jīng)常有香客問我吹截,道長,這世上最難降的妖魔是什么凝危? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任波俄,我火速辦了婚禮,結(jié)果婚禮上蛾默,老公的妹妹穿的比我還像新娘懦铺。我一直安慰自己,他們只是感情好支鸡,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布冬念。 她就那樣靜靜地躺著趁窃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪急前。 梳的紋絲不亂的頭發(fā)上醒陆,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音裆针,去河邊找鬼刨摩。 笑死,一個胖子當著我的面吹牛世吨,可吹牛的內(nèi)容都是我干的澡刹。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼耘婚,長吁一口氣:“原來是場噩夢啊……” “哼罢浇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起边篮,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤己莺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后戈轿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凌受,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年思杯,在試婚紗的時候發(fā)現(xiàn)自己被綠了胜蛉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡色乾,死狀恐怖誊册,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情暖璧,我是刑警寧澤案怯,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站澎办,受9級特大地震影響嘲碱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜局蚀,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一麦锯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧琅绅,春花似錦扶欣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽骆捧。三九已至,卻和暖如春术陶,著一層夾襖步出監(jiān)牢的瞬間凑懂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工梧宫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人摆碉。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓塘匣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親巷帝。 傳聞我的和親對象是個殘疾皇子忌卤,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容