STM32之串列埠通訊之printf重定向

2021-08-18 05:12:38 字數 4095 閱讀 2151

當我們在學習一款cpu時,最經典的實驗莫過於流水燈了,掌握流水燈的話就基本等於學會操作i/o口了,那麼在學會i/o之後,相對於我們來說會把學習串列埠的操作放在第二位。在程式執行的時候我們可以點亮乙個led來顯示**的執行狀態,但有時候我們還想把某些中間量後者其他程式狀態資訊列印出來顯示在計算機上,那麼這時候串列埠的作用就可顯而知了。

下面我們來看一下什麼是串列埠

序列介面

簡稱串列埠

,也稱序列通訊

介面或序列通訊介面

(通常指

com介面

),是採用序列通訊方式的擴充套件介面。序列

介面(serial inte***ce) 是指資料一位一位地順序傳送,其特點是

通訊線路

簡單,只要一對傳輸線就可以實現雙向通訊(可以直接利用**線作為傳輸線),從而大大降低了成本,特別適用於遠距離通訊,但傳送速度較慢

與並口的區別:

串列埠形容一下就是一條車道,而

並口就是有8個車道同一時刻能傳送8位(乙個位元組)資料。但是並不是說並口快,由於8位通道之間的互相干擾(串擾),傳輸時速度就受到了限制,傳輸容易出錯。串列埠沒有互相干擾。並口同時傳送的資料量大,但要比串列埠慢。

[3]串列埠硬碟

就是這樣被人們重視的。

串列埠通訊:串列埠通訊(serial communication),是指外設和計算機間,通過資料訊號線、地線等,按位進行傳輸資料的一種通訊方式。 

串列埠是一種介面標準,它規定了介面的電氣標準,沒有規定介面外掛程式電纜以及使用的協議。

串列埠通訊協議:

在串列埠通訊中,常用的協議包括rs-232、rs-422和rs-485。 

•rs-232:標準串列埠,最常用的一種序列通訊介面。有三種型別(a,b和c),它們分別採用不同的電壓來表示on和off。最被廣泛使用的是rs-232c,它將mark(on)位元的電壓定義為-3v到-12v之間,而將space(off)的電壓定義到+3v到+12v之間。傳送距離最大為約15公尺,最高速率為20kb/s。rs-232是為點對點(即只用一對收、發裝置)通訊而設計的,其驅動器負載為3~7kω。所以rs-232適合本地裝置之間的通訊。 

•rs-422:最大傳輸距離為1219公尺,最大傳輸速率為10mb/s。其平衡雙絞線的長度與傳輸速率成反比,在100kb/s速率以下,才可能達到最大傳輸距離。只有在很短的距離下才能獲得最高速率傳輸。一般100公尺長的雙絞線上所能獲得的最大傳輸速率僅為1mb/s。 

•rs-485:從rs-422基礎上發展而來的,最大傳輸距離約為1219公尺,最大傳輸速率為10mb/s。平衡雙絞線的長度與傳輸速率成反比,在100kb/s速率以下,才可能使用規定最長的電纜長度。只有在很短的距離下才能獲得最高速率傳輸。一般100公尺長雙絞線最大傳輸速率僅為1mb/s。

資料傳輸通訊方式:

(1)單工通訊:

單工通訊(******x communication)是指訊息只能單方向傳輸的工作方式。

在單工通訊中,通訊的通道是單向的,傳送端與接收端也是固定的,即傳送端只能傳送資訊,不能接收資訊;接收端只能接收資訊,不能傳送資訊。基於這種情況,資料訊號從一端傳送到另外一端,訊號流是單方向的。

(2)半雙工通訊:

半雙工通訊(half-duplex communication)可以實現雙向的通訊,但不能在兩個方向上同時進行,必須輪流交替地進行。

在這種工作方式下,傳送端可以轉變為接收端;相應地,接收端也可以轉變為傳送端。但是在同乙個時刻,資訊只能在乙個方向上傳輸。因此,也可以將半雙工通訊理解為一種切換方向的單工通訊。

(3)全雙工通訊:

全雙工通訊(full duplex communication)是指在通訊的任意時刻,線路上存在a到b和b到a的雙向訊號傳輸。 全雙工通訊允許資料同時在兩個方向上傳輸,又稱為雙向同時通訊,即通訊的雙方可以同時傳送和接收資料。在全雙工方式下,通訊系統的每一端都設定了傳送器和接收器,因此,能控制資料同時在兩個方向上傳送。全雙工方式無需進行方向的切換,因此,沒有切換操作所產生的時間延遲,這對那些不能有時間延誤的互動式應用(例如遠端監測和控制系統)十分有利。這種方式要求通訊雙方均有傳送器和接收器,同時,需要2根資料線傳送資料訊號。(可能還需要控制線和狀態線,以及地線)。

同步方式:

同步通訊:是一種位元同步通訊技術,要求發收雙方具有同頻同相的同步時鐘訊號,只需在傳送報文的最前面附加特定的同步字元,使發收雙方建立同步,此後便在同步時鐘的控制下逐位傳送/接收。如:spi匯流排,i2c匯流排。 

非同步通訊:指兩個互不同步的裝置通過計時機制或其他技術進行資料傳輸。也就是說,雙方不需要共同的時鐘。傳送方可以隨時傳輸資料,而接收方必須在資訊到達時準備好接收。如:串列埠(usart)。

們再來看看stm32開發板上是如何實現串列埠通訊的,本文以實現printf重定向為例來進行分析!

**如下:

/*

*函式名 :fputc

*描述 :重定向c庫函式printf到usart2

* 輸入 :無

* 輸出 :無

* 呼叫 :由printf呼叫

*/int fputc(int ch,file *f)

這個**中呼叫了兩個st庫函式。usart_senddata()和usart_getflagstatus()。

重定向時,我們把fput()的形參ch,作為串列埠將要傳送的資料,也就是說,當使用printf()時,先呼叫這個fputc()函式,然後使用st庫的串列埠傳送函式usart_send data(),把資料轉移到傳送資料暫存器tdr,觸發我們的串列埠向pc傳送乙個相應的資料。呼叫完

usart_senddata()後,要使用 

while(usart_getflagstatus(usart2,usart_flag_tc) != set)  語句不停地檢查串列埠傳送是否完成的 標誌位tc,一直檢測到標誌為完成,才進入下一步操作,避免出錯。在這段while迴圈檢測的延時中,串列埠外設已經由傳送控制器以及根據我們的配置把資料從移位暫存器一位一位的通過串列埠線tx傳送出去了。

主**:

/*

* 函式名:main

* 描述 :主函式

* 輸入 :無

* 輸出 :無**/

#include "printf.h"

#include int main()

printf.c

/*

* 函式名:main

* 描述 :主函式

* 輸入 :無

* 輸出 :無**/

#include "printf.h"

#include int main()

#include "stm32f10x_gpio.h"

#include "stm32f10x_rcc.h"

#include "stm32f10x_usart.h"

#include "printf.h"

#include "misc.h"

#include "stm32f10x.h"

/* *函式名 :fputc

*描述 :重定向c庫函式printf到usart2

* 輸入 :無

* 輸出 :無

* 呼叫 :由printf呼叫

*/int fputc(int ch,file *f)

/** 函式名 :usart_init

* 描述 :usart gpio 配置,工作模式配置。115200 8—n-1

* 輸入 :無

* 輸出 :無

* 呼叫 :外部呼叫

*/void usart_init(void)

printf.h

#include "stm32f10x_gpio.h"

#include "stm32f10x_rcc.h"

#include "stm32f10x_usart.h"

#include "stm32f10x.h"

#include extern void usart_init(void);

extern int fputc(int ch, file *f);

STM32之串列埠通訊

一 rs232通訊協議 1 概念 個人計算機上的通訊介面之一,由電子工業協會 electronic industries association,eia 所制定的非同步傳輸標準介面。2 電氣特性 邏輯1 mark 3v 15v 邏輯0 space 3 15v 3 介面 實現全雙工非同步通訊只需要三根...

stm32之串列埠通訊

1 首先對tx和rx進行配置 void init gpio void 2 對串列埠進行配置 3 對總中斷進行配置 4 傳送中斷 void usart1 it void 5 傳送位元組和字串 void usart sendbyte usart typedef pusartx,uint8 t ch vo...

STM32之串列埠

名稱 stm32之串列埠 說明 對於stm32的串列埠通訊來說,從外部看,和c51差不多。從內部看,啊。我還不了解。從使用上說,也是需要先配置usart,然後通過終端或者輪詢的方式接受或者輸出資料。由於有了韌體庫函式的幫助,stm32的串列埠配置起來比c51還要方便不少。本實驗完成的是輸入輸出重定向...