吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

怎樣用UART與PC通信

454398 ? 來源:工程師吳畏 ? 2019-07-31 17:12 ? 次閱讀

示意圖

怎樣用UART與PC通信

微控制器通信 - 什么是UART

微控制器經常發現自己處于具有特定功能的專用電路中,例如測量,監控和控制。但是,有些情況下將微控制器連接到計算機可能非常有益甚至是必要的(例如,設備配置)。有幾種方法可以實現PC-Microcontroller通信

通過Wi-Fi(如ESP8266模塊)

以太網

USB

雖然這些形式的通信可能允許高數據傳輸速率,但它們很難使用,大多數微控制器都有另外一種類型的通信,稱為UART,它代表通用異步接收器/發送器。

這是一個簡單的串行連接,可以是用于以低速發送少量數據,并且使用和實現極其簡單。使UART更加便捷的是,有USB轉串口轉換器可用于允許微控制器通過USB使用虛擬COM端口與PC通信。

串行概述

使用微控制器和計算機的串行通信可包括許多不同的設置,包括奇偶校驗和停止位。但是,在本教程中,我們將介紹最簡單的串行通信形式,這也是最常見的形式之一。所以我們首先要看的是如何發送串行數據。首先,我們來看看硬件!

微控制器上最簡單形式的串行外設是一個美化的移位寄存器,它使用兩個獨立的I/O引腳來發送數據(TxDn)和接收數據(RxDn)

當需要從設備發送數據時,它會將數據發送到其發送移位寄存器中,然后逐位計時數據,直到所有數據都已發送完畢。當需要讀取數據時,接收器首先需要檢測是否正在接收某些數據。

一旦滿足此條件,接收器就會將數據移入移位寄存器。完成后,可以從接收移位寄存器中讀取器件,并以其認為合適的任何方式處理數據。

UART模塊的簡單框圖

UART模塊中使用的協議本身(有時稱為RS-232)包含有助于數據傳輸/接收的選項和附加功能。下圖顯示了典型的UART傳輸,包括起始位,數據本身,奇偶校驗位和停止位。

從ATmega168數據表中獲取的圖像

IDLE - 如果沒有發生傳輸,則傳輸線必須保留邏輯1(5V,3.3V等)

起始位 - UART線上的下降沿表示傳輸即將開始

數據位 - 這些是我們的實際數據位發送,并且位首先發送到最低位(位0,位1 。..位7)

奇偶校驗位 - 此可選位可用作錯誤檢查的基本形式具有等于所有位組合的異或(XOR)的值

停止位 - 這是停止傳輸所必需的并且是邏輯1.有時,可以使用兩個停止位,但通常只使用一個

ATmega上的UART

ATmega168上的UART模塊非常復雜,因為它允許不同的操作模式(包括同步傳輸),但我們將配置UART以使用適用于99%基于UART的項目的最常見設置。

時鐘

我們需要配置的第一件事是UART模塊的時鐘源(這也配置了UART運行的模式) 。由于我們將使用異步傳輸(時鐘不傳輸,只有數據),我們將使用“正常異步”。為此,我們在UCSRnC寄存器中將UMSEL位設置為0.

奇偶校驗位和停止位

由于大多數傳輸不需要奇偶校驗,我們將禁用該位。為此,我們需要將兩個UPM位都設置為0,這可以在UCSR寄存器中找到。

對于停止位,我們只會使用一個停止位,通過清除UCSRnB寄存器中的USBS位來完成。

數據大小

UART模塊能夠以不同的位寬發送數據,但對于大多數項目,我們將使用8位數據大小,因為我們的微控制器是一個8位器件。為此,我們將寄存器UCSRnB和UCSRnC中的UCSZ位的值設置為011。

波特率

在談到串行通信時,波特率通常是指每秒傳輸的數據位數,可以認為是連接速度。串行通信的典型波特率包括9600,115200和10417.

對于我們的串行設置,我們將使用9600的波特率(非常常見的波特率)。波特率可以使用下面的公式計算,但是,使用第163-165頁上的表格更容易。

由于我們的ATmega168連接到8MHz振蕩器,我們可以查看下表,看看我們將UBRR寄存器設置為什么值。

對于9600波特,我們將使用值51.請注意,您的CLKDIV8位可能已設置,如果是這種情況,那么您的波特率可能比您預期的慢8倍。如果是這種情況,請嘗試使用UBRR值12而將U2X0設置為開,或使用更高的時鐘速度。

啟用接收/傳輸

我們需要設置幾個啟用位,其他啟用位是可選的。我們需要使能的前兩位是RXEN和TXEN,它們使能接收器和發送器。

我們可以設置兩個中斷使能位,這意味著當我們的UART模塊完成發送或接收數據時,中斷將觸發(對實時應用程序有用)。

讀/寫UART

有趣的是,AVR UART外設對接收和發送寄存器使用相同的I/O地址。當寫入UART數據寄存器(UDRn)時,數據被發送到UART發送器移位寄存器,當從UART數據寄存器讀取時,返回來自UART接收器的數據。

一些有用的控制信號

一個寄存器UCSR0A可以幫助確定UART的狀態模塊,因為它有幾個狀態位。

RXC0,第7位,如果接收緩沖區中有需要讀取的數據,則為1

TXC0,第6位,一旦傳輸將為1已完成

如果發送緩沖區為空,UDRE0,位5將為1

FE0,位4,發出幀錯誤警告

DOR0,第3位,發出數據溢出警告(當收到的數據太多且接收緩沖區已滿時)

當奇偶校驗時,UPE0,位2將為1在接收到的字節上檢測到錯誤

一個簡單的UART示例

此示例將介紹如何創建一個echo設備,該設備將等待連接的PC向UART線路發送一個字節。一旦檢測到,AVR將立即發回相同的字節以回顯消息。

/*

* AVR UART.c

*

* Created: 09/01/2018

* Author : RobinLaptop

*/

// These are really useful macros that help to get rid of unreadable bit masking code

#define setBit(reg, bit) (reg = reg | (1 《《 bit))

#define clearBit(reg, bit) (reg = reg & ~(1 《《 bit))

#define toggleBit(reg, bit) (reg = reg ^ (1 《《 bit))

#define clearFlag(reg, bit) (reg = reg | (1 《《 bit))

#include

int main(void)

{

// Initialize Registers

// Configure register UCSRA

setBit(UCSR0A, U2X0); // Double the BRG speed (since I am using a 8MHz crystal which is divided by 8)

clearBit(UCSR0A, MPCM0); // Normal UART communication

// Configure register UCSRB

clearBit(UCSR0B, RXCIE0); // We will not enable the receiver interrupt

clearBit(UCSR0B, TXCIE0); // We will not enable the transmitter interrupt

clearBit(UCSR0B, UDRIE0); // We will not enable the data register empty interrupt

setBit(UCSR0B, RXEN0); // Enable reception

setBit(UCSR0B, TXEN0); // Enable transmission

clearBit(UCSR0B, UCSZ02); // 8 bit character size

// Configure register UCSRC

clearBit(UCSR0C, UMSEL00); // Normal Asynchronous Mode

clearBit(UCSR0C, UMSEL01);

clearBit(UCSR0C, UPM00); // No Parity Bits

clearBit(UCSR0C, UPM01); // No Parity Bits

clearBit(UCSR0C, USBS0); // Use 1 stop bit

setBit(UCSR0C, UCSZ01); // 8 bit character size

setBit(UCSR0C, UCSZ00);

// Configure the baud rate register (this is a combination of both UBRR0L and UBRR0H)

// Despite using an 8MHz crystal my Fosc is 1MHz since the CLK8DIV fuse bit is dividing the clock

// by 8. When I try to change this fuse the AVR locks me out!

UBRR0 = 12;

while (1)

{

// Wait until data has been received

while(?。║CSR0A & (1 《《 RXC0)));

// Now send the same byte back

UDR0 = UDR0;

// Wait until the Data Transmit Register is empty

while(?。║CSR0A & (1 《《 TXC0)));

}

}

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • PC
    PC
    +關注

    關注

    9

    文章

    2102

    瀏覽量

    154662
  • uart
    +關注

    關注

    22

    文章

    1243

    瀏覽量

    101769
  • ATmega168
    +關注

    關注

    0

    文章

    9

    瀏覽量

    9313
收藏 人收藏

    評論

    相關推薦

    UC-006:4線UARTPC接口

    電子發燒友網站提供《UC-006:4線UARTPC接口.pdf》資料免費下載
    發表于 01-14 16:30 ?0次下載
    UC-006:4線<b class='flag-5'>UART</b>至<b class='flag-5'>PC</b>接口

    通信技術:UART串口通信開源代碼實操!

    今天我們分享的是關于UART串口通信示例,歡迎大家探討
    的頭像 發表于 11-05 11:56 ?3177次閱讀
    <b class='flag-5'>通信</b>技術:<b class='flag-5'>UART</b>串口<b class='flag-5'>通信</b>開源代碼實操!

    UART串口通信示例:開啟通信寶藏之門的定位模組LuatOS入門

    今天我們要講解的是UART串口通信示例,關于Air201資產定位模組LuatOS入門,我會從搭建環境、代碼燒錄、示例效果等來細說:
    的頭像 發表于 11-03 19:55 ?1030次閱讀
    <b class='flag-5'>UART</b>串口<b class='flag-5'>通信</b>示例:開啟<b class='flag-5'>通信</b>寶藏之門的定位模組LuatOS入門

    UART通信協議介紹和數據傳輸工作流程

    UART是一種通用串行數據總線,用于異步通信。該總線雙向通信,可實現全雙工傳輸和接收。UART通常用來實現與PC之間數據
    的頭像 發表于 10-24 14:20 ?942次閱讀
    <b class='flag-5'>UART</b><b class='flag-5'>通信</b>協議介紹和數據傳輸工作流程

    怎樣用THS3201實現輸出功率可調?

    怎樣用THS3201實現輸出功率可調?
    發表于 08-26 08:28

    OPA735加OPA333,怎樣用TINA TI去仿真?

    當輸入信號VG1從7.06V慢慢變化到7.22V時。 輸出電壓Vout的變化必須是接近線性變化的。我想知道我該怎樣用TINA TI去仿真?怎樣設置那個輸入信號VG1才能達到我的目的。因為這個電壓源好像
    發表于 08-02 08:39

    簡單認識UART通信協議

    UART(Universal Asynchronous Receiver/Transmitter,通用異步收發傳輸器)通信協議是一種常見的串行通信協議,廣泛應用于計算機、嵌入式系統、傳感器、無線
    的頭像 發表于 07-25 18:07 ?1563次閱讀

    簡單認識UART串行通信協議

    在電子通信領域,UART(Universal Asynchronous Receiver/Transmitter,通用異步收發傳輸器)是一種非常常見的串行通信協議。它被廣泛應用于各種設備之間
    的頭像 發表于 05-27 16:09 ?2251次閱讀

    怎樣用STM8L的PB3/TIM2_TRIG的引腳測量脈寬?

    怎樣用STM8L的PB3/TIM2_TRIG的引腳測量脈寬?
    發表于 05-07 06:55

    stm32f100怎樣用重映射功能?

    的是stm32f100c8t6b芯片,現在想用將PB1映射為TIM1_CH3N,在調用GPIO_PinAFConfig(GPIOB,GPIO_PinSource1,GPIO_AF_TIM1)時, GPIO_PinAFConfig和GPIO_AF_TIM1都沒定義,stm32f100
    發表于 05-07 06:06

    如何用cubemx做lin通信?

    怎樣用cubemx做lin通信,沒有找到相應的函數,只有一個init函數,如下設置后,生成了與lin有關的代碼,連中斷都沒有。請高手指點 /* USART3 init function
    發表于 04-26 07:44

    UART串口通信實驗及工作原理

    UART通信過程需要設置波特率、數據長度、開始/停止位等參數。波特率決定了發送數據的速度,而數據長度和開始/停止位則用于確保數據的正確傳輸和接收。
    的頭像 發表于 03-21 17:10 ?4120次閱讀
    <b class='flag-5'>UART</b>串口<b class='flag-5'>通信</b>實驗及工作原理

    UART串口通信協議是什么?

    UART (Universal Asynchronous Receiver/Transmitter) 是一種通信接口協議,用于實現串口通信。它是一種簡單的、可靠的、廣泛應用的串口通信
    的頭像 發表于 03-19 17:26 ?1546次閱讀

    STM32F412G-DISCO怎樣用MX生成fatfs的代碼?

    STM32F412G-DISCO怎樣用MX生成fatfs的代碼? SD卡例程能跑,但mx生成的代碼不能正常運行,我生成代碼后是不是還要配置一些東西?(我生成后只寫了測試代碼) 問題解決了,雖然我不知道我為什么不能直接使用mx生成的代碼去操作sd卡,但我通過復制粘貼例程的代碼完成了測試。
    發表于 03-12 08:15

    淺談UART通信的異步通信機制

    波特率表示每秒鐘傳送的碼元符號的個數,它是對符號傳輸速率的一種度量。在UART通信中,波特率用于描述通信速度,其單位是bps(每秒鐘傳輸的bit的數量)。
    發表于 02-19 16:19 ?968次閱讀
    淺談<b class='flag-5'>UART</b><b class='flag-5'>通信</b>的異步<b class='flag-5'>通信</b>機制
    大发888娱乐城下载平台| 德州扑克| 百家乐怎么| 百家乐官网博牌规| 百家乐官网出闲几率| 澳门博彩官网| 星期八百家乐的玩法技巧和规则| 百家乐翻天粤| 金海岸百家乐官网的玩法技巧和规则 | 广东百家乐桌布| 游戏百家乐押发| 百家乐官网制胜绝招| 大家旺百家乐官网娱乐城| 大家赢娱乐城| 龙岩棋牌乐| scc太阳城俱乐部| 网上百家乐赌场娱乐网规则| 在百家乐二庄两闲揽的概率| 24山72向局图解| 澳门赌百家乐官网的玩法技巧和规则 | 百家乐在线直播| 百家乐官网一邱大师打法| 怎么玩百家乐官网能赢钱| 永利百家乐官网娱乐| 大发888 34| 威尼斯人娱乐城代理| 百家乐永利赌场娱乐网规则| 百家乐园sun811.com| 百家乐翻天qvod粤语| 百家乐高手论坮| 百家乐官网8点| 百家乐官网代理商博彩e族| 奉新县| 会宁县| 通道| 真钱娱乐游戏| 百乐坊娱乐场| 真钱百家乐赌博| 环球百家乐的玩法技巧和规则| 百家乐八卦九| 网上百家乐是真是假天涯论坛|