什么是串口?
UART(Universal Asynchronous Receiver/Transmitter),即通用異步收發(fā)傳輸器,簡稱串口。
抓取日志、還有很多的外設(shè)也是用串口進行通訊,例如GPS模塊、藍牙模塊、電表、鎖板等
串口硬件及原理圖
串口內(nèi)部結(jié)構(gòu)
以s3c2440為例,其串口內(nèi)部結(jié)構(gòu)如下:

從圖可知,串口內(nèi)部由以下單元組成:
baud-rate generator(波特率生成器), transmitter(發(fā)送器), receiver(接收器), control unit(串口控制單元)。
發(fā)送器和接收器都包含有FIFO(先入先出緩沖區(qū))和Shifter(移位器)
工作流程:
程序預先通過串口控制單元設(shè)置波特率,由波特率發(fā)生器產(chǎn)生相應時鐘,當cpu給串口發(fā)送數(shù)據(jù)時,程序?qū)?shù)據(jù)寫入內(nèi)存,通過interrupt 或者 DMA方式寫進FIFO,Transmit Shifter移位器每次從FIFO中取出1bit數(shù)據(jù)發(fā)送出去(TX);反之,串口給cpu發(fā)送數(shù)據(jù)時,Receive Shifter讀取RX信號,每次寫1bit數(shù)據(jù)給FIFO,隨后通過interrupt 或者 DMA方式寫進內(nèi)存由cpu處理數(shù)據(jù)
串口根據(jù)硬件接入方式
常用的有TTL、RS232、RS485三種
TTL:

TTL:全雙工(邏輯1: 2.4V--5V?? 邏輯0: 0V--0.5V),傳輸距離短,用于MCU之間通信,傳輸距離通常1m左右。
RS232:

RS-232:全雙工(邏輯1:-15V--5V? 邏輯0:+3V--+15V),傳輸距離可達15m左右,常用于MCU與PC間通訊,
由于MCU使用的是TTL電平,PC使用232電平,為此之間需要接入電平轉(zhuǎn)換芯片。
RS485:

RS485:半雙工、(邏輯1:+2V--+6V? 邏輯0: -6V---2V)這里的電平指AB 兩線間的電壓差,采用AB雙絞線差分信號傳輸,抗干擾強,傳輸距離遠,可達1KM左右。
由于485采用差分傳輸,因此485是半雙工傳輸,不能同時收發(fā),因此,需要使能DE/RE 達到切換發(fā)送/接收,通常有如下兩種方式:
GPIO使能:

如上圖所示,GPIO_RX485_CTL輸出電平使能DE/RE
硬件使能:


如上圖所示,UART_EE_C_TX作為發(fā)送端TX,又作為控制腳使能DE/RE,查看MAX485真值表可知,
UART_EE_C_TX為1,DE=RE=0,DI=1,485此時輸出為高阻態(tài),接收端AB電平由外部電路即R79對VDDAO分壓決定,此時為高電平;
UART_EE_C_TX為0,DE=RE=1,DI=0,485此時AB輸出 -6V---2V,接收端AB此時為低電平。
串口通訊協(xié)議
串口參數(shù)?

串口參數(shù)由波特率、數(shù)據(jù)位、校驗位、停止位、流控組成
數(shù)據(jù)格式

起始位:上位機發(fā)出低電平0并維持一段時間,表示傳輸開始,下位機接收到0準備開始通訊;
波特率:指每秒最大可發(fā)送多少位數(shù)據(jù),確定了串口通信周期;
數(shù)據(jù)位:指一幀數(shù)據(jù)中有效數(shù)據(jù)有多少位;校驗位:用于對數(shù)據(jù)的完整性校驗,可設(shè)置奇校驗、偶校驗和無校驗,比如發(fā)送0001 0000這個數(shù)據(jù),若采用偶校驗,則這個校驗位寫1,保證有偶數(shù)個“1”,反之,采用奇校驗則這個校驗位寫0,保證有奇數(shù)個“1”;
停止位:可設(shè)置1/1.5/2位,當一幀數(shù)據(jù)發(fā)完后,發(fā)出高電平并維持一段時間,表示1幀數(shù)據(jù)傳輸結(jié)束;
流控:當發(fā)送和接收端處理串口數(shù)據(jù)速度有較大差別時,會造成數(shù)據(jù)沒有被及時讀取而丟失,此時可通過軟件或硬件的方式來控制數(shù)據(jù)發(fā)送的速度,即為流控。
硬件流控需要在TX、RX外再額外接入RTS/CTS兩條線,當接收端串口控制器FIFO數(shù)據(jù)快滿時,接收端串口控制通過使能RTS告知發(fā)送端數(shù)據(jù)還沒處理完,請稍等,當接收端FIFO數(shù)據(jù)被處理及時時,接收端串口控制器發(fā)送CTS告知發(fā)送端數(shù)據(jù)已被處理,你可以接著發(fā)送數(shù)據(jù)了!軟件流控不需要額外接線,接收端程序通過TX發(fā)送數(shù)據(jù)告知發(fā)送端先別發(fā)送或接著繼續(xù)發(fā)送,這種方式雖然不需要額外接線,但是這種通知方式本身也占用了串口數(shù)據(jù)。
串口時序

上位機發(fā)送端空閑時,其TX維持高電平
上位要發(fā)送數(shù)據(jù)時,將其TX由高電平拉低,并維持1bit時間,下位機RX被中斷收到起始信號,準備接收數(shù)據(jù),這一位即起始位;
上位機根據(jù)設(shè)置的數(shù)據(jù)位個數(shù)逐個發(fā)送相應個數(shù)的數(shù)據(jù),下位機在每1/2位的時間采樣一次下位機RX數(shù)據(jù),即端發(fā)送的即數(shù)據(jù)位的數(shù)據(jù);
上位機發(fā)送完數(shù)據(jù)位數(shù)據(jù)后,上位機串口控制器根據(jù)程序設(shè)置的校驗方式補一位1或補一位0(如果設(shè)置了無校驗,這一步跳過)并發(fā)送給下位機RX;
上位機發(fā)送校驗位數(shù)據(jù)后,意味著此幀數(shù)據(jù)發(fā)送完畢,發(fā)送高電平并維持設(shè)置好的相應停止位數(shù)的時間
停止位后上位機被保持高電平,處于空閑狀態(tài),直到下一次傳輸時起始位被拉低。
上圖,為1位起始位,8位數(shù)據(jù)位,偶校驗,1位停止位,發(fā)送0001 0000數(shù)據(jù)時序圖,有助理解以上內(nèi)容