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

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

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

Linux中裸機(jī)串口通信的基本方法

嵌入式開發(fā)愛好者 ? 來(lái)源:嵌入式開發(fā)愛好者 ? 作者:嵌入式開發(fā)愛好者 ? 2022-12-12 09:32 ? 次閱讀

大家好,我是ST。

今天主要和大家聊一聊,如何使用串口進(jìn)行通信的方法。

第一:串口的基本簡(jiǎn)介

串口又叫做串行接口,通常叫做COM接口,串行接口指的是數(shù)據(jù)一個(gè)一個(gè)的順序傳輸,通信線路簡(jiǎn)單。使用兩條線即可實(shí)現(xiàn)雙向通信,一條用于發(fā)送,一條用于接收。

UART作為串口的一種,其工作原理也是將數(shù)據(jù)一位一位的進(jìn)行傳輸,發(fā)送和接收各用一條線,因此通過(guò) UART 接口與外界相連最少只需要三條線:TXD(發(fā)送)、RXD(接收)和 GND(地線)。

263e8604-7944-11ed-8abf-dac502259ad0.png

各個(gè)為含義如下:

空閑位:數(shù)據(jù)線在空閑狀態(tài)的時(shí)候?yàn)檫壿嫛?”狀態(tài),也就是高電平,表示沒有數(shù)據(jù)線空閑,沒有數(shù)據(jù)傳輸。

起始位:當(dāng)要傳輸數(shù)據(jù)的時(shí)候先傳輸一個(gè)邏輯“0”,也就是將數(shù)據(jù)線拉低,表示開始數(shù)據(jù)傳輸。

數(shù)據(jù)位:數(shù)據(jù)位就是實(shí)際要傳輸?shù)臄?shù)據(jù),數(shù)據(jù)位數(shù)可選擇 5~8 位,我們一般都是按照字節(jié)傳輸數(shù)據(jù)的,一個(gè)字節(jié) 8 位,因此數(shù)據(jù)位通常是 8 位的。低位在前,先傳輸,高位最后傳輸。

奇偶校驗(yàn)位:這是對(duì)數(shù)據(jù)中“1”的位數(shù)進(jìn)行奇偶校驗(yàn)用的,可以不使用奇偶校驗(yàn)功能。停止位:數(shù)據(jù)傳輸完成標(biāo)志位,停止位的位數(shù)可以選擇 1 位、1.5 位或 2 位高電平,一般都選擇 1 位停止位。

波特率:波特率就是 UART 數(shù)據(jù)傳輸?shù)乃俾?,也就是每秒傳輸?shù)臄?shù)據(jù)位數(shù),一般選擇 9600、19200、115200 等。

第二:UART的特點(diǎn)

①、兼容 TIA/EIA-232F 標(biāo)準(zhǔn),速度最高可到 5Mbit/S。

②、支持串行 IR 接口,兼容 IrDA,最高可到 115.2Kbit/s。

③、支持 9 位或者多節(jié)點(diǎn)模式(RS-485)。

④、1 或 2 位停止位。

⑤、可編程的奇偶校驗(yàn)(奇校驗(yàn)和偶校驗(yàn))。

⑥、自動(dòng)波特率檢測(cè)(最高支持 115.2Kbit/S)。

接下來(lái)看一下UART幾個(gè)重要的寄存器,第一個(gè)就是 UART 的控制寄存器 1,即UARTx_UCR1(x=1~8)。

第二個(gè)寄存器UARTx_UFCR、UARTx_UBIR和UARTx_UBMR,寄存器UARTx_UFCR中要用的是位RFDIV(bit9:7),用來(lái)設(shè)置參考

2667332e-7944-11ed-8abf-dac502259ad0.png

通過(guò)這三個(gè)寄存器可以設(shè)置UART的波特率,波特率的計(jì)算公式為:

267ab930-7944-11ed-8abf-dac502259ad0.png? ?

Ref Freq:經(jīng)過(guò)分頻以后進(jìn)入 UART 的最終時(shí)鐘頻率。

UBMR:寄存器 UARTx_UBMR 中的值。

UBIR:寄存器 UARTx_UBIR 中的值。

通過(guò) UARTx_UFCR 的 RFDIV 位、UARTx_UBMR 和 UARTx_UBIR 這三者的配合即可得

到我們想要的波特率。比如現(xiàn)在要設(shè)置 UART 波特率為 115200,那么可以設(shè)置 RFDIV 為

5(0b101),也就是 1 分頻,因此 Ref Freq=80MHz。設(shè)置 UBIR=71,UBMR=3124,根據(jù)上面的

公式可以得到:

26b19a54-7944-11ed-8abf-dac502259ad0.png

第三:UART的配置步驟

1、設(shè)置 UART1 的時(shí)鐘源

設(shè)置 UART 的時(shí)鐘源為 pll3_80m,設(shè)置寄存器 CCM_CSCDR1 的 UART_CLK_SEL 位為 0

即可。

2、初始化 UART1

初始化 UART1 所使用 IO,設(shè)置 UART1 的寄存器 UART1_UCR1~UART1_UCR3,設(shè)置內(nèi)

容包括波特率,奇偶校驗(yàn)、停止位、數(shù)據(jù)位等等。

4、使能 UART1

UART1 初始化完成以后就可以使能 UART1 了,設(shè)置寄存器 UART1_UCR1 的位 UARTEN

為 1。

5、編寫 UART1 數(shù)據(jù)收發(fā)函數(shù)

編寫兩個(gè)函數(shù)用于 UART1 的數(shù)據(jù)收發(fā)操作。

第四:代碼基本實(shí)現(xiàn)

先實(shí)現(xiàn)串口的頭文件的基寫法:

#ifndef _BSP_UART_H
#define_BSP_UART_H


//函數(shù)聲明
void uart_init(void);
void uart_to_init(void);
void uart_disable(UART_Type *base);
voiduart_enable((UART_Type*base);
#endif

函數(shù)聲明中,繼續(xù)編寫對(duì)應(yīng)的源文件內(nèi)容:

#include "uart.h"


//初始化串口1,波特率為115200
void uart_init(void)
{
//初始化串口IO
uart_io_init();

/*2、初始化UART1*/
uart_disable(UART1);/*先關(guān)閉UART1*/
uart_softreset(UART1);/*軟件復(fù)位UART1*/

UART1->UCR1=0;/*先清除UCR1寄存器*/
UART1->UCR1&=~(1<<14);?/*?關(guān)閉自動(dòng)波特率檢測(cè)?*/
/*
?*?設(shè)置?UART?的?UCR2?寄存器,設(shè)置字長(zhǎng),停止位,校驗(yàn)?zāi)J?,關(guān)閉硬件流控
?*?bit14:?1?忽略?RTS?引腳
?*?bit8:?0?關(guān)閉奇偶校驗(yàn)
?*?bit6:?0?1?位停止位
?*?bit5:?1?8?位數(shù)據(jù)位
?*?bit2:?1?打開發(fā)送
?*?bit1:?1?打開接收
?*/
?UART1->UCR2|=(1<<14)?|?(1<<5)?|?(1<<2)?|?(1<<1);
?UART1->UCR3|=1<<2;?/*?UCR3?的?bit2?必須為?1?*/
?
?/*
?*?設(shè)置波特率
?*?波特率計(jì)算公式:Baud?Rate?=?Ref?Freq?/?(16?*?(UBMR?+?1)/(UBIR+1))?
?*?如果要設(shè)置波特率為?115200,那么可以使用如下參數(shù):
?*?Ref?Freq?=?80M?也就是寄存器?UFCR?的?bit9:7=101,?表示?1?分頻
?*?UBMR?=?3124
?*?UBIR?=?71
?*?因此波特率=?80000000/(16?*?(3124+1)/(71+1))
?*?=?80000000/(16?*?3125/72)?
?*?=?(80000000*72)?/?(16*3125)?
?*?=?115200
?*/
?UART1->UFCR=5<<7;?/*?ref?freq?等于?ipg_clk/1=80Mhz?*/
?UART1->UBIR=71;
UART1->UBMR=3124;

#if0
uart_setbaudrate(UART1,115200,80000000);/*設(shè)置波特率*/
#endif
uart_enable(UART1);/*使能串口*/
}

總結(jié):實(shí)現(xiàn)串口的基本功能,對(duì)后面利用串口來(lái)調(diào)試程序,具有重要的實(shí)踐意義。

審核編輯:湯梓紅

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

    關(guān)注

    87

    文章

    11178

    瀏覽量

    208500
  • uart
    +關(guān)注

    關(guān)注

    22

    文章

    1216

    瀏覽量

    101008
  • 串口通信
    +關(guān)注

    關(guān)注

    34

    文章

    1605

    瀏覽量

    55328

原文標(biāo)題:Linux中裸機(jī)串口通信的基本方法

文章出處:【微信號(hào):嵌入式開發(fā)愛好者,微信公眾號(hào):嵌入式開發(fā)愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于Linux環(huán)境下串口通信的應(yīng)用設(shè)計(jì)

    本文介紹了Linux環(huán)境下串口通信的設(shè)計(jì)方法和步驟,并介紹了ARM9微處理器s3c2440在Linux下和C8051Fxxx系列單片機(jī)進(jìn)行串
    發(fā)表于 05-24 10:50 ?2803次閱讀

    Linux裸機(jī)點(diǎn)燈

    Linux裸機(jī)
    怎么啦
    發(fā)布于 :2023年10月27日 08:47:24

    請(qǐng)問(wèn)串口裸機(jī)程序只能在nand運(yùn)行嗎?

    串口裸機(jī)程序只能在nand運(yùn)行嗎?在UBOOT里用GO命令總是卡死在“Application Starting”那。這是為什么?還有,在LINUX想用USB向板子傳輸BIN文件怎么傳
    發(fā)表于 07-05 00:40

    linux裸機(jī)程序下載的兩種方法

    的UBOOT命令 nand 燒寫程序到開發(fā)板。 1,通過(guò)SD_Writer.exe將mmc.bin燒寫到SD 卡 ,將開發(fā)板設(shè)置到SD卡啟動(dòng)。(具體方法參見飛凌開發(fā)板linux3.0.1用戶手冊(cè).pdf) 2
    發(fā)表于 07-18 10:09

    Linux下ARM和單片機(jī)的串口通信設(shè)計(jì)資料分享

    /KaqA4mMbmq9AXnxgHWTAXQLinux下ARM和單片機(jī)的串口通信設(shè)計(jì)原創(chuàng) wonhere華和技術(shù)2016-04-15 本文介紹Linux 環(huán)境下串口
    發(fā)表于 12-13 06:32

    基于Labview的串口通信數(shù)據(jù)校驗(yàn)和的實(shí)現(xiàn)方法

    基于Labview的串口通信數(shù)據(jù)校驗(yàn)和的實(shí)現(xiàn)方法
    發(fā)表于 01-09 17:58 ?172次下載
    基于Labview的<b class='flag-5'>串口</b><b class='flag-5'>通信</b>數(shù)據(jù)校驗(yàn)和的實(shí)現(xiàn)<b class='flag-5'>方法</b>

    組態(tài)軟件串口設(shè)備通信實(shí)現(xiàn)方法設(shè)計(jì)

    本文分析了組態(tài)軟件串口設(shè)備通信的原理及開發(fā)方法,并提出了一種使用VC++6.0開發(fā)組態(tài)軟件串口設(shè)備通信模塊的具體實(shí)現(xiàn)
    發(fā)表于 06-17 08:00 ?18次下載

    串口通信基本接線方法

    串口通信基本接線方法 目前較為常用的串口有9針串口(DB9)和25針串口(DB25),
    發(fā)表于 04-07 08:30 ?9844次閱讀

    基于Linux的ARM/單片機(jī)串口通信設(shè)計(jì)

    介紹Linux 環(huán)境下串口通信的設(shè)計(jì)方法和步驟,并介紹了ARM9 微處理器s3c2440 在Linux 下和C8051Fxxx 系列單片機(jī)進(jìn)
    發(fā)表于 05-24 09:45 ?2803次閱讀
    基于<b class='flag-5'>Linux</b>的ARM/單片機(jī)<b class='flag-5'>串口</b><b class='flag-5'>通信</b>設(shè)計(jì)

    Linux下ARM 和單片機(jī)的串口通信設(shè)計(jì)

     介紹Linux 環(huán)境下串口通信的設(shè)計(jì)方法和步驟,并介紹了ARM9 微處理器s3c2440 在Linux 下和C8051Fxxx 系列單片機(jī)
    發(fā)表于 05-24 10:16 ?3444次閱讀
    <b class='flag-5'>Linux</b>下ARM 和單片機(jī)的<b class='flag-5'>串口</b><b class='flag-5'>通信</b>設(shè)計(jì)

    Linux下ARM和單片機(jī)的串口通信設(shè)計(jì)

    介紹Linux 環(huán)境下串口通信的設(shè)計(jì)方法和步驟,并介紹了ARM9 微處理器s3c2440 在Linux 下和C8051Fxxx 系列單片機(jī)進(jìn)
    發(fā)表于 09-29 10:06 ?1982次閱讀
    <b class='flag-5'>Linux</b>下ARM和單片機(jī)的<b class='flag-5'>串口</b><b class='flag-5'>通信</b>設(shè)計(jì)

    如何編寫基于ARM的裸機(jī)程序和基于Linux的驅(qū)動(dòng)程序

    在嵌入式開發(fā),ADC應(yīng)用比較頻繁,本文主要講解ADC的基本原理以及如何編寫基于ARM的裸機(jī)程序和基于Linux的驅(qū)動(dòng)程序。
    的頭像 發(fā)表于 09-13 09:25 ?3249次閱讀
    如何編寫基于ARM的<b class='flag-5'>裸機(jī)</b>程序和基于<b class='flag-5'>Linux</b>的驅(qū)動(dòng)程序

    Linux單片機(jī)串口通信總結(jié)

    這是一個(gè)目錄Linux與單片機(jī)串口通信運(yùn)行ROS串口發(fā)送節(jié)點(diǎn)后異常中斷棧溢出問(wèn)題catkin_make報(bào)錯(cuò):函數(shù)未定義的引用ERROR L107: ADDRESS SPACE OVER
    發(fā)表于 11-23 18:06 ?9次下載
    <b class='flag-5'>Linux</b>單片機(jī)<b class='flag-5'>串口</b><b class='flag-5'>通信</b>總結(jié)

    CC2530無(wú)線通信模塊使用串口通信參考方法

    CC2530無(wú)線通信模塊使用串口通信參考方法
    發(fā)表于 04-24 17:20 ?13次下載

    基于Linux的ARM和單片機(jī)的串口通信設(shè)計(jì)

    電子發(fā)燒友網(wǎng)站提供《基于Linux的ARM和單片機(jī)的串口通信設(shè)計(jì).pdf》資料免費(fèi)下載
    發(fā)表于 10-11 10:35 ?0次下載
    基于<b class='flag-5'>Linux</b>的ARM和單片機(jī)的<b class='flag-5'>串口</b><b class='flag-5'>通信</b>設(shè)計(jì)