嵌入式之硬件學習(三)通信方式、串口通信

目錄

一、通信種類

1、并行通信

2、串行通信

3、單工模式(Simplex Communication)

4、半雙工通信(Half-Duplex Communication)

5、全雙工通信(Full-Duplex Communication)

6、串行的異步通信與同步通信

(1)異步通信

(2)同步通信

二、串行口通信

(一)UART定義(串行通信協議)

(二)串口通信通信時序(底層邏輯)

1、空閑時

2、起始位

3、數據位

4、校驗位

5、停止位

6、簡述串口通信的通信邏輯(面問)

(三)波特率(bps)

三、三種串行通信方式在物理表現形式的不同

(一)TTL(Transistor-Transistor Logic)

(二)RS232標準

(三)RS485標準

四、串行口寄存器

(一)SBUF寄存器(串行口數據緩沖寄存器)

(二)串行口控制寄存器SCON

(三)電源控制寄存器PCON

五、USB下載電路模塊

六、練習(實現51單片機與電腦之間的通信)

uart.c

main.c

xdata 的作用

計算定時器初值的計算公式

七、MODBUS通信協議

一、通信種類

1、并行通信

????????并行通信是指多個比特同時通過并行線進行傳輸,這種方式的傳輸速率較高,但會占用大量的芯片資源;

2、串行通信

????????串行通信是指將數據拆分成一個個比特,按照先后次序在一根總線上進行發送,串行通信有著系統占用資源少,結構簡單等優點,是主機間通信的常用方式。

注:串口通信(Serial Port)是串行通信的一種,屬于串行通信中的異步通信。我們經常聽到的RS232、RS485、RS422都是串行通信。

3、單工模式(Simplex Communication)

????????主機間通信時如果一方固定為發送端另外一方固定為接收端,通過一根總線實現數據通信。這種通信方式就像是你只能聽別人說話,但無法回答他們一樣,只能單向傳遞信息。

4、半雙工通信(Half-Duplex Communication)

? ? ? ? 半雙工通信是一種通信方式,其中數據傳輸可以在兩個方向之間交替進行,但不能同時進行。換句話說,通信雙方可以既發送數據又接收數據,但不能同時進行這兩種操作。比方說,就像你可以和別人交替說話和傾聽對方說話一樣。當你在說話時,對方在聽你說;當對方在說話時,你在傾聽對方。這種方式允許雙方之間在發送和接收數據之間切換,但不能同時進行。半雙工通信常用于對話式交流和一些簡單的通信場景中。

5、全雙工通信(Full-Duplex Communication)

? ? ? ? 全雙工通信是一種通信方式,其中數據傳輸可以同時在兩個方向進行,允許通信雙方同時發送和接收數據,實現雙向通信。就像打電話一樣,你可以同時說話也可以聽對方說話,雙方可以同時進行數據傳輸,實現雙向溝通。

6、串行的異步通信與同步通信

(1)異步通信

????????指通信中兩個字符(8位)之間的時間間隔是不固定的,而在一個字符內各位的時間間隔是固定的;
? ? ? ? 收發雙方的波特率必須是事先約定好的;

(2)同步通信

????????要求發收雙方具有同頻同相的同步;
? ? ? ? 用專用時鐘信號線來控制時鐘的節奏,以為例:

  • SDA(數據線)
  • SCL(時鐘線):用于同步雙方時鐘的節奏,一般由發送方決定;

? ? ? 異步通信

????????串口通信時,收發雙方的波特率必須是事先約定好的,否則數據傳輸就會出現混亂。很明顯,為保證每個比特占用數據線的時間,發送方和接收方需按照各自的系統計時且雙方之間的誤差不能太大。通常不能超過(6%)。這種雙方各自“計時”的方式稱為異步。就好比在打字一樣,每次敲擊鍵盤發送一個字母,速度快慢由打字者自己控制,沒規定每敲擊一個字母之間要等多久,只要保證接收端能夠正確識別并解析即可。

同步通信

????????同步通信設備之間除了有數據線(SDA)以為還有一條時鐘線(SCL)。其中SCL就是時鐘線(serial clock)。發送方負責控制時鐘線的變化,每發送一個比特,都需要將時鐘線按照規則進行改變。就好比在合唱團里,大家一起唱歌的節奏是由指揮員指揮的,每個人都按照指揮員的節奏唱歌,保證大家唱的是同一首歌且節奏一致。這種通信方式就稱為同步通信。譬如IIC、SPI等。

注:同步串行通信方式與異步串行通信方式的區別:存在時鐘線的為同步串行

通信方式通信,沒有時鐘線的為異步串行通信方式。

二、串行口通信(全雙工串行通信,異步通信)

(一)UART定義(串行通信協議)

????????UART(Universal Asynchronous Receiver/Transmitter,通用異步收發器)是一種廣泛使用的串行通信協議。它用于在計算機或其他設備之間傳輸數據。UART通信協議通過兩根線(通常稱為TXD和RXD)實現數據的異步傳輸。

TXD(Transmit,發送)線:用于從設備發送數據到另一設備。

RXD(Receive,接收)線:用于從另一設備接收數據到本設備。

(二)串口通信通信時序(底層邏輯)

作為常用的串行通信方式,以TTL為例,串口通信在不同主機之間的數據格式為:

1、空閑時

? ? ? ? 空閑時數據線為高電平;

2、起始位

????????發送放發送一個低電平表示起始位;

3、數據位

????????依據低位先行原則(發送的第一個比特是最低位(最右邊))發送;

4、校驗位

????????分為奇校驗,偶校驗和無校驗;校驗位可發可不發

????????????????奇校驗是指確保數據位加上校驗位中"1",1的總數為奇數;

????????????????偶校驗是指確保數據位加上校驗位中"1",1的總數為偶數;

5、停止位

????????為保證下一個字節發送前的起始位能夠表現出來(把兩個數據二者之間分隔開),校驗位之后發送一個停止位1。(停止位也可是1個、1.5個、2個)

6、簡述串口通信的通信邏輯(面問)

? ? ? ? 雙方在空閑時數據線保持高電平;發送數據時發送方先要發送一個起始位,起始位為低電平;發送數據位(8個bit)以低位先行原則發送(從右往左發);發完后有一個可以選擇的校驗位,校驗分三種,分別為奇校驗、偶校驗、無校驗,奇校驗是數據位加校驗位中1的個數總數為奇數,偶校驗數據位加校驗位1的總數為偶數;校驗位結束后還要發送一個停止位,停止位為高電平。? ??

(三)波特率(bps)

串口通信用波特率來描述數據的傳輸速率問題:

????????很明顯上圖的縱坐標為電壓值,橫坐標就是時間了。無論起始位、數據為還是停止位、校驗位,每個比特在數據線上的時間決定了數據傳輸的速率。

????????串行通信用波特率(bit per second)來描述數據傳輸的速率,記作bps。

????????常見的波特率有1200、2400,4800,9600,115200等,表示每秒鐘傳輸的比特數。以9600為例,表明每秒能傳輸9600個比特。每個比特傳輸時所需的時間為1/9600秒=1.041*10-4秒。

三、三種串行通信方式在物理表現形式的不同

????????主機間通信無論采用并行還是串行方式,都無法避免一個物理現象:導線內阻不為零造成的電壓衰減。以之前討論的TTL電平為例,主機之間的距離會造成高電平在接收端出現衰減現象和串擾(指不同信號之間相互干擾導致信號失真)影響。

(一)TTL(Transistor-Transistor Logic)

????????TTL(Transistor-Transistor Logic)通常指的就是芯片引腳產生的電壓,這個電壓值跟選擇的芯片有關,在51單片機系統下是5v;在2440下是3.3v等等。5vTTL通信距離通常被限制在10~20米之間。(使用TTL方式進行數據傳輸距離受到很大限制)

? ? ? ? 邏輯0:0V低電壓

? ? ? ? 邏輯1:取決于芯片本身(供電電壓)

(二)RS232標準

????????5vTTL通信距離通常被限制在10~20米之間,如果需要更遠的距離,怎么解決呢?為解決這個問題IEEE(Institute of Electrical and Electronics Engineers)頒布了RS232標準,其中規定了:

邏輯高電平(邏輯1):在-3V到-15V之間

邏輯低電平(邏輯0):在+3V到+15V之間

收發主機間有三根線,分別是收、發和地,因此RS232是全雙工的。

理論上RS232能夠傳輸20~30米。

(三)RS485標準

????????同理RS485使用兩根信號線(A和B)來傳輸數據,通過比較A和B之間的電壓差來識別信息,電壓范圍分別為+7V到+12V和-7V到-12V。正電壓表示高電平,負電壓表示低電平。這種差分信號傳輸方式提高了抗干擾能力。RS485的傳輸距離可達1200米,適用于大范圍的數據傳輸需求。由于采用的是壓差,RS485在傳輸數據的某一時刻,兩根線都要用到,所以它是半雙工的。

比較A和B之間的電壓差:

????????邏輯1:+7V到+12V

? ? ? ? 邏輯0:-7V到-12V

四、串行口寄存器

(一)SBUF寄存器(串行口數據緩沖寄存器)

(二)串行口控制寄存器SCON

(三)電源控制寄存器PCON

五、USB下載電路模塊

六、練習(實現51單片機與電腦之間的通信)

uart.c

?void init_uart(void)
?{
?//串口接收
? ? SCON &= ~(3 << 6);
?? ?SCON |= (1 << 6) | (1 << 4);

?//使參數生效
?? ?PCON &= ~(1 << 6);
?? ?PCON |= (1 << 7);?

?//設置波特率,51單片機使用定時器1
?? ?TMOD &= ~(0x0F << 4);
?? ?TMOD |= (2 << 4); //1<<5 與其效果是一樣的,改變第四位和第五位,2為0000 0010
?? ?TL1 = 232;//計算出的定時器初值
?? ?TH1 = 232;

?//?? ?打開定時器1
?? ?TCON |= (1 << 6);

//打開中斷控制位及串口控制位
?? ?IE |= (1 << 7) | (1 << 4);
}
/*
//全局變量字符型數組
char rcv_buffer[32];
*/
//數組不放到內部RAM放到外部擴展RAM(擴展內存不清0,數組內都是隨機數)
xdata char rcv_buffer[32];
unsigned int pos = 0;

//中斷服務函數(TI RI都會導致中斷);接收需要使用中斷
?void uart_handler(void) interrupt 4
?{
??? ?if((SCON & (1 << 0)) == 1)?
?? ?{
?? ??? ?if(pos < 32) //防止越界訪問
?? ??? ?{
?? ??? ??? ?rcv_buffer[pos++] = SBUF;//接收的數據依次存入到該數組
?? ??? ??? ?rcv_buffer[pos] = 0; //接收的字符串后加/0標志
?? ??? ?}
?? ??? ?//P2 = SBUF;
?? ??? ?SCON &= ~(1 << 0);//軟件復位RI(接收中斷請求標志位)清0
?? ?}
?}

?//發送(輪詢)
?void send_char(char ch)
?{
? ? SBUF = ch;
?? ?while((SCON & (1 << 1)) == 0);
?? ?SCON &= ~(1 << 1);?? ?//軟件復位TI(發送中斷請求標志位)清0
?}

void send_buffer(const char *p, unsigned int len)
{
?? ?while(len--)
?? ?{
?? ??? ?send_char(*p++);
?? ?}
}

? // 發送字符串函數?
? void send_str(const char *str)?
? {?
? ?? ?unsigned int len = 0;
? ? while (str[len] != '\0') // 計算字符串長度?
? ? {?
? ??? ??? ?len++;?
? ? }?
? ? send_buffer(str, len); // 調用send_buffer函數發送字符串
? }
?

main.c

int main(void)
{
?? ?const char *s = "Hello World!"; //不常用
?? ?//char buffer[] = {0xAA ,0xBB, 0x00, 0x1A};
?? ?xdata char buffer[16]; //???
? ? init_uart();
? ? while(1)
? ? {
?? ??? ? if(pos != 0)//至少收到一個字節
?? ??? ? {
?? ??? ? ?? ?delay(0xAFFF);//保證數據全部收完,有延遲
?? ??? ??? ?if(strcmp(rcv_buffer,"Hello") == 0)
?? ??? ??? ?{
?? ??? ??? ??? ?send_str("Hi");
?? ??? ??? ?}
?? ??? ??? ?else if(strcmp(rcv_buffer,"See You Later") == 0)
?? ??? ??? ?{
?? ??? ??? ??? ?send_str("Bye");
?? ??? ??? ?}
?? ??? ??? ?/*
?? ??? ??? ?send_buffer(rcv_buffer, pos);
?? ??? ??? ?*/
?? ??? ??? ?pos = 0;//保證下一輪從頭開始收?? ?
?? ??? ? }
? ?? ? ?? ?//send_buffer(buffer, sizeof(buffer) / sizeof(*buffer));
? ?? ? ?? ?//send_buffer(s,strlen(s));
? ? ??? ?//send_char('A');
?? ? ?? ?//delay(0xAFFF);
? ? }
}

xdata 的作用

????????不將內容放在芯片內部的RAM中,放在擴展的RAM中 ;

計算定時器初值的計算公式

????????2^8-2^smod?* focs / 32 / bps / 12

其中smod表示PCON的B7,根據實際情況帶入,不是0就是1(SMOD=1波特率翻倍);

focs晶振頻率,我們這是11.0592M;

bps目標波特率我們這是2400

2^8?這里的8來自定時器的工作方式,因為我們使用的是8位自動重裝方式,所以是8

按照我們的要求2400bps,smod=1時,該公式計算結果為:232。

七、MODBUS通信協議

modbus協議:

????????????????unsigned char s[xx] = ......

????????該協議對數組每個元素內容都做了定義

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/87323.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/87323.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/87323.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【微信小程序】3、SpringBoot整合WxJava發送訂閱消息

1、創建消息模板 在公共模板庫里面選擇符合自己業務場景的消息模板&#xff0c;例如&#xff1a; 每個消息模板最多選擇5項&#xff0c;可根據自己業務需求自行選擇&#xff0c;順序也可以自己決定。提交后&#xff0c;我們就得到了屬于自己的消息模板ID 2、文檔閱讀 官方文…

Flask 快速精通:從入門到實戰的輕量級 Web 框架指南

Flask 作為 Python 生態中最受歡迎的輕量級 Web 框架&#xff0c;以其簡潔靈活的設計理念贏得了開發者的青睞。本文將系統梳理 Flask 的核心概念與實戰技巧&#xff0c;幫助你快速掌握這一強大框架。 一、Flask 框架概述 1.1 輕量級框架的核心特性 Flask 誕生于 2010 年&…

Python爬取豆瓣短評并生成詞云分析

一、項目概述 本項目的目標是爬取豆瓣上某部電影的短評數據&#xff0c;并生成詞云進行情感分析。我們將使用Python編程語言&#xff0c;借助爬蟲技術獲取數據&#xff0c;并利用自然語言處理和數據可視化工具進行分析。具體步驟包括&#xff1a; 爬取豆瓣短評數據。數據清洗…

Controller Area Network (CAN) 通信機制簡介

目錄 1. CAN 概述 2. 物理結構與傳輸機制 3. 消息格式與仲裁機制 4. 錯誤檢測與總線狀態 5. 工業用 CAN 接口 6. 本講總結 1. CAN 概述 CAN&#xff08;Controller Area Network&#xff09;是由德國博世&#xff08;Bosch&#xff09;公司于 1983 年提出的串行通信協議…

我有一個想法

我有一個想法 我想為家鄉做點事情&#xff0c;但是又不知道從哪里開始。 也許為家鄉的教育做點事情是比較靠譜的。 于是&#xff0c;我就想到了&#xff0c;是不是可以在高中學校&#xff0c;設立一個“鴻鵠”獎學金&#xff1f; 這個獎學金怎么使用呢&#xff1f; 在每年9月份…

【Pandas】pandas DataFrame stack

Pandas2.2 DataFrame Reshaping sorting transposing 方法描述DataFrame.droplevel(level[, axis])用于**從 DataFrame 的索引&#xff08;行或列&#xff09;中刪除指定層級&#xff08;level&#xff09;**的方法DataFrame.pivot(*, columns[, index, values])用于重塑 Dat…

Java 自動關閉資源語法糖 - try-with-resources

文章目錄 Java 自動關閉資源語法糖 - try-with-resources前言優勢1、自動資源管理2、處理多重資源3、異常處理更健壯4、適用條件 總結 Java 自動關閉資源語法糖 - try-with-resources 前言 日常開發中&#xff0c;我們經常會看到如下代碼&#xff1a; try (InputStream is …

MyBatis中的動態SQL是什么?

大家好&#xff0c;我是鋒哥。今天分享關于【MyBatis中的動態SQL是什么&#xff1f;】面試題。希望對大家有幫助&#xff1b; MyBatis中的動態SQL是什么&#xff1f; 超硬核AI學習資料&#xff0c;現在永久免費了&#xff01; MyBatis中的動態SQL指的是根據不同的條件&#x…

【Java反射】如何新增對象中的屬性,與JavaScript中的直接添加屬性有什么區別?

問&#xff1a; Object obj new Object(); //獲取一個類的class對象 Class<?> objClass Object.class; try { //通過newInstance方法創建一個新的屬性 Field newField Field.class.newInstance(); newField.setAccessible(true); newField.set(obj, “index”); }ca…

java spring boot Swagger安裝及使用

https://springdoc.org/ 可能原因分析 &#x1f50d; 原因 1&#xff1a;SpringFox 版本與 Spring Boot 版本不兼容 ? SpringFox 3.0.0 不完全兼容 Spring Boot 2.6 及更高版本&#xff0c;可能導致 NullPointerException。 Spring Boot 3.x 完全不支持 SpringFox&#xff0c…

電商云倉/前置倉的物流高效監控、管理、預警系統,快遞鳥DMS

在電商行業蓬勃發展的當下&#xff0c;電商云倉和前置倉作為物流配送體系的關鍵環節&#xff0c;其高效運作直接影響著消費者體驗與企業競爭力。快遞鳥 DMS 物流交付管理平臺&#xff0c;以其卓越的物流監控、管理及預警功能&#xff0c;成為電商企業優化云倉和前置倉物流管理的…

HarmonyOS Next深度解析:高德定位SDK高效集成與實戰指南

HarmoyOS Next 實現高德定位SDK 注&#xff1a;作者采用版本為 HarmonyOS 5.0.0 Release SDK和DevEco Studio 5.0.0 Release。 1.獲取本地AppID&#xff1a; 在index.pages的abountToAppear( ) 方法中獲取appID、并打印在Log日志&#xff0c;即可在程序運行時獲取本地項目的…

【技術】記一次 Docker 中的 ES 數據遷移,使用 Reindex API

記一次 Docker 中的 ES 數據遷移&#xff0c;使用 Reindex API 環境背景需求背景開始遷移確認老 ES 的訪問地址在新 ES 中創建索引的 Mapping (選配)在新 ES 中配置老 ES 的地址開始遷移數據數據驗證 首先聲明&#xff0c;是因為環境限制&#xff0c;沒有辦法使用同步工具&…

yii2基礎版本安裝記錄,實錄有點亂看標題即可

因為使用php 安裝的是docker環境所有進入到容器安裝ridh_mfe_api 為掛載目錄 Nginx及PHP掛載配置 因為使用php 安裝的是docker環境所有進入到容器安裝 ridh_mfe_api 為掛載目錄 進入容器 % docker exec -it php sh /var/www/html # ls index.html index.php composer crea…

前端跨域解決方案(3):CORS

1 CORS 核心 CORS&#xff08;Cross-Origin Resource Sharing&#xff09;&#xff0c;即跨域資源共享&#xff0c;是目前最主流的跨域方案&#xff0c;它通過服務器返回的特殊 HTTP 頭&#xff0c;允許瀏覽器放行跨域請求。與傳統的 JSONP 相比&#xff0c;CORS 具有明顯的優…

SpringBoot源碼解析(十五):spring-boot-autoconfigure.jar的模塊化設計

前言 SpringBoot的自動配置是其革命性特性的核心&#xff0c;而spring-boot-autoconfigure.jar則是這一機制的物理載體。本文將深入剖析這個JAR包的模塊化設計哲學&#xff0c;從包結構劃分、條件注解體系到自動配置加載機制&#xff0c;全方位解析SpringBoot如何通過精妙的模…

學習筆記九:docker容器日志問題

docker容器日志問題 背景如何處理日志問題主要通過日志輪詢方式處理。修改 Docker 配置日志快速清理 背景 Docker 默認使用的是 json-file 日志驅動。日志會一直寫&#xff0c;一直寫&#xff0c;沒有限制、沒有輪轉、沒有清理&#xff01; 日志默認位置&#xff1a; /var/lib…

低成本同屏方案:電腦 + 路由器實現 50 臺安卓平板實時同屏

引言 在教育機構、小型培訓場景或企業簡易會議中&#xff0c;常面臨以最低成本實現多設備同屏的需求。本文針對 "電腦 路由器 50 臺安卓平板" 的極簡硬件組合&#xff0c;詳細剖析實時同屏的實現路徑&#xff0c;從問題分析到技術落地提供全流程解決方案&#xff0…

Unity ECS DOTS技術實現50000個cube隨機循環移動流程

前言 之前使用過ECS面向組件開發&#xff0c;一直想試一下Unity的ECS DOTS技術&#xff0c;但是苦于入門門檻太高&#xff0c;下載官方的Demo&#xff0c;發現代碼哪哪兒都看不懂&#xff0c;一大堆API聞所未聞&#xff0c;而且沒有一個入門的流程&#xff0c;導致無法進行下去…

設計模式精講 Day 3:抽象工廠模式(Abstract Factory Pattern)

【設計模式精講 Day 3】抽象工廠模式&#xff08;Abstract Factory Pattern&#xff09; 文章簡述 在軟件開發中&#xff0c;隨著業務復雜度的提升&#xff0c;系統需要支持多種產品族的創建。抽象工廠模式正是為了解決這一問題而誕生的設計模式之一。本文作為“設計模式精講”…