STM32串口服務(wù)

串行接口是指數(shù)據(jù)一位一位地順序傳送,其特點(diǎn)是通信線路簡(jiǎn)單,只要一對(duì)傳輸線就可以實(shí)現(xiàn)雙向通信(可以直接利用電話線作為傳輸線)榄融,從而大大降低了成本,特別適用于遠(yuǎn)距離通信救湖,但傳送速度較慢愧杯。一條信息的各位數(shù)據(jù)被逐位按順序傳送的通訊方式稱為串行通訊。串行通訊的特點(diǎn)是:數(shù)據(jù)位的傳送鞋既,按位順序進(jìn)行力九,最少只需一根傳輸線即可完成;成本低但傳送速度慢邑闺。串行通訊的距離可以從幾米到幾千米跌前;根據(jù)信息的傳送方向,串行通訊可以進(jìn)一步分為單工陡舅、半雙工和全雙工三種抵乓。來(lái)自百度百科

STM32 的串口資源相當(dāng)豐富的,功能也相當(dāng)強(qiáng)勁。

串口服務(wù)靶衍,當(dāng)串口有數(shù)據(jù)要接收時(shí)灾炭,MCU產(chǎn)生中斷將串口中的數(shù)據(jù)讀入。現(xiàn)將串口的服務(wù)程序?qū)崿F(xiàn)如下:

  • 串口隊(duì)列颅眶,當(dāng)MCU有數(shù)據(jù)讀入時(shí)蜈出,將MCU的數(shù)據(jù)讀入串口隊(duì)列中;
  • 串口服務(wù)程序在while主循環(huán)中涛酗,若串口隊(duì)列中有數(shù)據(jù)铡原,將數(shù)據(jù)讀入到串口接收緩存內(nèi)。
  • 當(dāng)串口接收緩存內(nèi)的數(shù)據(jù)達(dá)到了自定義數(shù)據(jù)的一幀煤杀,則進(jìn)行后續(xù)的數(shù)據(jù)處理眷蜈。

串口隊(duì)列(uart_queue_buf):一個(gè)隊(duì)列沪哺,每當(dāng)發(fā)生串口中斷時(shí)沈自,在串口中接受的數(shù)據(jù)放入這個(gè)隊(duì)列中。
queue_head:隊(duì)列頭指針辜妓,當(dāng)串口服務(wù)程序從這個(gè)隊(duì)列中讀取數(shù)據(jù)時(shí)的開始位置枯途。
queue_tail:隊(duì)列尾指針,隊(duì)列數(shù)據(jù)的截止位置籍滴。
queue_total_data_length:隊(duì)列中有效數(shù)據(jù)的總長(zhǎng)度酪夷。

串口接收緩存(uart_rx_buf):串口服務(wù)程序從串口隊(duì)列中讀取到數(shù)據(jù)放到這個(gè)接收緩存中,進(jìn)行數(shù)據(jù)解析孽惰。
串口發(fā)送緩存(uart_tx_buf):將需要發(fā)生的數(shù)據(jù)放入發(fā)送緩存晚岭,調(diào)用發(fā)送接口將數(shù)據(jù)發(fā)送到串口。

串口中斷讀取串口數(shù)據(jù)到串口隊(duì)列

void USART1_IRQHandler(void)
{
    uint8_t data;

    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
        data = USART_ReceiveData(USART1);
        // 接收串口的數(shù)據(jù)
        uart_receive_input(data);

        USART_ClearFlag(USART1,USART_FLAG_RXNE);
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
    }
}

串口數(shù)據(jù)接收函數(shù)

void uart_receive_input(unsigned char value)
{
    //隊(duì)列不滿
    if(queue_total_data < sizeof(uart_queue_buf) {
        if(queue_head >= (unsigned char *)(uart_queue_buf + sizeof(uart_queue_buf))) {
            queue_head = (unsigned char *)(uart_queue_buf);
        }
    
        *queue_head ++ = value;
        queue_total_data ++;
    } else {
        //數(shù)據(jù)隊(duì)列滿
    }
}

獲取隊(duì)列內(nèi)數(shù)據(jù)的總長(zhǎng)度

unsigned short get_uart_queue_total_length(void)
{
    return queue_total_data_length;
}

讀取隊(duì)列1字節(jié)數(shù)據(jù)

unsigned char queue_read_byte(void)
{
    unsigned char value = 0;
    
    // 串口隊(duì)列緩存內(nèi)有數(shù)據(jù)
    if (queue_total_data_length > 0) {
        if (queue_tail >= (unsigned char *) (uart_queue_buf + sizeof(uart_queue_buf))) {
            //數(shù)據(jù)已經(jīng)到末尾勋功,將尾指針指向頭
            queue_tail = (unsigned char *) (uart_queue_buf);
        }

        value = *queue_tail++;
        queue_total_data_length--;
    }

    return value;
}

串口服務(wù)程序(請(qǐng)將此函數(shù)放到while的主循環(huán)里)

void uart_service()
{
    // 當(dāng)隊(duì)列內(nèi)有數(shù)據(jù)時(shí)坦报,讀取隊(duì)列內(nèi)的所有數(shù)據(jù)
    while((rx_in < sizeof(uart_rx_buf)) && get_uart_queue_total_data() > 0) {
        uart_rx_buf[rx_in ++] = queue_read_byte();
    }
    
    // 串口數(shù)據(jù)處理(此處內(nèi)的函數(shù)由作者自己實(shí)現(xiàn))
    uart_data_handle(offset);

  // 注意處理完后库说,請(qǐng)?jiān)谶@個(gè)位置將已經(jīng)處理過的數(shù)據(jù)刪除(可以使用memcpy內(nèi)存拷貝將后面需要處理的數(shù)據(jù)拷貝到緩存區(qū)開始)
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市片择,隨后出現(xiàn)的幾起案子潜的,更是在濱河造成了極大的恐慌,老刑警劉巖字管,帶你破解...
    沈念sama閱讀 223,126評(píng)論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件啰挪,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡嘲叔,警方通過查閱死者的電腦和手機(jī)亡呵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)借跪,“玉大人政己,你說(shuō)我怎么就攤上這事√统睿” “怎么了歇由?”我有些...
    開封第一講書人閱讀 169,941評(píng)論 0 366
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)果港。 經(jīng)常有香客問我沦泌,道長(zhǎng),這世上最難降的妖魔是什么辛掠? 我笑而不...
    開封第一講書人閱讀 60,294評(píng)論 1 300
  • 正文 為了忘掉前任谢谦,我火速辦了婚禮,結(jié)果婚禮上萝衩,老公的妹妹穿的比我還像新娘回挽。我一直安慰自己,他們只是感情好猩谊,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,295評(píng)論 6 398
  • 文/花漫 我一把揭開白布千劈。 她就那樣靜靜地躺著,像睡著了一般牌捷。 火紅的嫁衣襯著肌膚如雪墙牌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,874評(píng)論 1 314
  • 那天暗甥,我揣著相機(jī)與錄音喜滨,去河邊找鬼。 笑死撤防,一個(gè)胖子當(dāng)著我的面吹牛虽风,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 41,285評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼辜膝,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼陌凳!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起内舟,我...
    開封第一講書人閱讀 40,249評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤合敦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后验游,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體充岛,經(jīng)...
    沈念sama閱讀 46,760評(píng)論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,840評(píng)論 3 343
  • 正文 我和宋清朗相戀三年耕蝉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了崔梗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,973評(píng)論 1 354
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡垒在,死狀恐怖蒜魄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情场躯,我是刑警寧澤谈为,帶...
    沈念sama閱讀 36,631評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站踢关,受9級(jí)特大地震影響伞鲫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜签舞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,315評(píng)論 3 336
  • 文/蒙蒙 一秕脓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧儒搭,春花似錦吠架、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至默穴,卻和暖如春怔檩,著一層夾襖步出監(jiān)牢的瞬間褪秀,已是汗流浹背蓄诽。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評(píng)論 1 275
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留媒吗,地道東北人仑氛。 一個(gè)月前我還...
    沈念sama閱讀 49,431評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親锯岖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子介袜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,982評(píng)論 2 361

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

  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司出吹,掛了不少遇伞,但最終還是拿到小米、百度捶牢、阿里鸠珠、京東、新浪秋麸、CVTE渐排、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,281評(píng)論 11 349
  • 史上最全的iOS面試題及答案 iOS面試小貼士———————————————回答好下面的足夠了----------...
    Style_偉閱讀 2,360評(píng)論 0 35
  • __block和__weak修飾符的區(qū)別其實(shí)是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用,...
    LZM輪回閱讀 3,335評(píng)論 0 6
  • GCD調(diào)度隊(duì)列是執(zhí)行任務(wù)的強(qiáng)大工具灸蟆。調(diào)度隊(duì)列允許您相對(duì)于調(diào)度者異步或者同步的執(zhí)行任意代碼塊驯耻。您能夠使用調(diào)度隊(duì)列來(lái)執(zhí)...
    坤坤同學(xué)閱讀 6,677評(píng)論 1 3
  • ———————————————回答好下面的足夠了---------------------------------...
    恒愛DE問候閱讀 1,720評(píng)論 0 4