導航:首頁 > 操作系統 > 單片機串口驅動

單片機串口驅動

發布時間:2023-05-19 04:16:42

❶ 51單片機串口發送u32丟數量

熱門頻道

首頁

博客

研修院

VIP

APP

問答

下載

社區

推薦頻道

活動

招聘

專題

打開CSDN APP
Copyright © 1999-2020, CSDN.NET, All Rights Reserved

單片機
打開APP

C51單片機串口丟包的幾種情況分析! 轉載
2021-03-22 11:29:28
3點贊

嵌入式資訊精選

碼齡敗租5年

關注

今天來總結一下C51單片機串口驅動層丟包的幾種情況.

---C51單片機串攔枯衫口收發數據的原理---

1、串口驅動模塊組成

(1)串口數據收發器,串口收發數據時,底層執行實際收發動作的硬體單元;

(2) 串口相關寄存器,

SBUF:串口數據寄存器,當有數據收或發時,用來裝載收或發的數據,實際底層是分開收和發兩個不同寄存器的,用戶(程序員)只用SBUF就可以了;

RI:串口接收中斷標志,告訴CPU現在串口收到數據了

TI:串口發簡腔送中斷標志,告訴CPU現在串口有數據要發了;

TI和RI都是系統產生用戶軟體清零的。

(3)串口中斷服務函數;串口收數據和發數據的中斷是一個,收和發在同一個中斷服務函數進行,在RI為1時把寄存器SBUF里的數據拷貝到用戶緩存里,在TI為1 時,把用戶要發的數據裝載到SBUF里。

2、收數據過程

(1)對端串口發送器發了1byte數據

(2) 串口接收器收到1byte數據,存到SBUF寄存器,並把寄存器中RI位置1

(3)系統產生一個中斷,CPU內核輪詢發現RI為1是串口中斷,從用戶程序跳轉至串口中斷服務函數

(4)串口中斷服務函數中,把SBUF寄存器中的這1byte數據拷貝至用戶緩存

收數據過程是1byte產生一個中斷,也就是說數據是1byte 1byte收的。

數據流向過程如下圖:

3、發數據過程

(1)用戶把TI置1

(2) 系統產生中斷,內核輪詢到TI為1,跳轉至串口中斷服務函數

(3) 用戶把1byte要發的數據裝載至SBUF

(4)硬體發送器發送數據,發送完成自動把TI置1

(5)系統產生中斷,重復(2)~(4)

(6) 當用戶不再往SBUF裝數據時,發送數據過程結束

發數據也是1byte 1byte發,每1byte先產生中斷再裝載數據。

數據流向過程如下圖:

---串口丟包總結---

說明下,這是無操作系統的單片機程序。

我 = 串口硬體收發器+串口軟體中斷服務函數+串口相關寄存器。

用戶 = 應用程序

1、我的硬體收發器在收發數據,用戶把系統總中斷關了

先說收數據的情況,系統中斷被用戶關了,我的硬體部分還是能收數據的,我仍然會把RI置1,但是現在總中斷關了,就不會產生中斷了,不會去調起我的軟體中斷服務函數了,那這樣就會造成我放到SBUF里的數據還沒有傳給用戶,如果關中斷期間,我又收到了新的1byte數據,我就會把新的數據放到SBUF里,覆蓋了老的數據了。

這樣老的那1byte數據就丟掉了。

舉例:串口正在收數據時,用戶要寫一些掉電記憶的參數到Flash,操作Flash會關總中斷,此時如果串口在收數據可能會丟包。

解決:關總中斷之前判斷一下串口是不是在忙,串口無數據收到連續累計一段時間才認為閑。

發數據的情況會不會有問題?如果我的硬體在發數據,用戶把總中斷關了,我發完這1byte數據仍然會把TI置1,但是此時不會產生中斷,不會再進入我的軟體中斷服務函數繼續發數據,等中斷恢復了,CPU會馬上進入我的中斷服務函數,又會繼續發數據,所以發數據過程關總中斷不會造成發數據丟包。

2、有人在中斷服務函數里待太久,耽誤我的軟體收數據

我的硬體收到了數據,我把他放到了SBUF里,同時也置起了RI標志位,但不巧,這時候CPU在另一個中斷服務函數里在執行代碼,更不巧,這個中斷服務函數很長,有很多代碼要執行,要很久很久!

這不就誤事了嗎,CPU還沒從那個中斷服務函數出來,我的硬體又收到了新的1byte數據,我又把他裝到了SBUF里,置起了RI,老的那1byte數據還在SBUF,沒傳給用戶緩存呢,新的把他覆蓋掉了。

舉例:某MCU LED驅動用調光模式(即可調亮度模式),由於其中斷服務函數太長,造成串口收數據丟包

解決:設置串口中斷優先順序高於LED中斷優先順序,C51中高優先順序中斷可以搶斷低優先順序中斷,這樣串口就不會丟包了。

3、大量數據又收又發,我的軟體部分不夠聰明,忙不過來了

同時有數據在收和發,我也是能應付的,因為咱是全雙工的啊,收數據和發數據可以同時進行,是不同的硬體單元;此時RI和TI都會被我置成1,系統會進去中斷服務函數,但系統是不知道這次進去是TI還是RI事件的,只管其中一個為1就進去了。

我的軟體中斷服務函數進去一次可以把收和發的數據都處理了,出來後就不會再次進中斷服務函數了,

如果程序員把我的軟體寫成進一次中斷服務函數只處理RI或者TI一個事件,那就效率很低啊!數據很多時極有可能會丟包!

比如如果優先處理TI事件,下次再進來想處理RI了但此時TI事件又有了,RI事件就又沒處理到了。

如果優先處理RI事件,收到的數據不會丟,但是下次進來RI事件又產生了,又要處理RI事件,想發的數據一直沒機會發。

所以,串口中斷服務函數里要能同時處理RI 和TI 中斷事件,下圖中的else if 應改成if。

又如果,串口中斷服務函數裡面太長,前一次還沒處理完,新的中斷又到了,就會自己耽誤自己。

4、當前數據還沒發完,用戶又把新數據裝到我的SBUF中

我的硬體在發數據,此時TI已經被用戶程序清0了,

如果程序員邏輯不夠清晰,馬上又要發一包新數據,把TI置1 了,那麼CPU會馬上進入中斷服務函數,中斷服務函數馬上會把新的1byte 數據裝到我的SBUF里,我剛剛正在發的那1byte 數據還沒發完就被新數據覆蓋弄丟了。

解決:程序串口驅動層介面發數據前,先判斷當前是否處於發送數據過程中,若正在發送過程中,不用再將TI置1.

5、 我們這里總中斷關了,對方還發數據給我

總中斷關了,對方給我發數據,我的硬體還是能收到數據的,我也會把RI置1,但是此時就不會產生中斷,不會進入中斷服務函數了,如果對方馬上又給我發了新的1byte數據,用戶這時還是沒有把總中斷打開,剛剛那1byte數據還在SBUF中會被新來的數據覆蓋,用戶沒取走丟掉了。

解決:對方增加重發邏輯。

6、我硬體能力不夠,收發速度跟不上

用戶竟然選擇了系統時鍾才2M,我的波特率卻被設置成了115200這么大,

此時我的波特率發生器產生的波特率已經不能達到115200了,數據還是能1byte 1byte的發出去,只是就是發出去的數據電平的長度可能不對了,

標准串口每1byte數據 = 1bit起始位+ 8bit數據位+奇偶校驗位(1或1.5或2或無)+停止位(1bit),起始電平是低電平,無數據時是高電平。

波特率115200即115200 bit/s,波特率決定了電平0/1的長度,波特率確定了1bit電平的長度就確定了,波特率越大,長度越短。

如果電平長度不對了,對方串口接收器收到這一串電平後經過解析可能就不認為這是一包正確的數據來了,因此丟棄了(底層電路具體是怎麼樣不是很了解)。

1.外媒談英偉達-Arm並購案~

2.這里聚焦了全球嵌入式技術風景~

3.航天器、導彈喜歡用單片機?

4.工程師的硬核單片機編程思想~

5.嵌入式開發需要架構設計嗎?

6.【技術轉管理必備】嵌入式產品的研發流程

免責聲明:本文系網路轉載,版權歸原作者所有。如涉及作品版權問題,請與我們聯系,我們將根據您提供的版權證明材料確認版權並支付稿酬或者刪除內容。

文章知識點與官方知識檔案匹配
Java技能樹首頁概覽
87773 人正在系統學習中
打開CSDN,閱讀體驗更佳

串口丟包受什麼影響_總結一下曾經在串口方面犯的錯誤_weixin_39772652的...
串口接收端丟包嚴重時,如果不是因為明顯錯誤導致,一般都是由於數據傳輸速度快,主控處理不過來造成的,想辦法降低傳輸速度: (1)波特率: 最直接的方法就是降低波特率,我做過一個小實驗,用幀序號來判斷丟包情況,當丟包時亮起一盞燈,波特率...
Qt串口QSerialPort丟包問題,QSerialPort和QTimer定時器中斷沖突的解決...
1.利用QTimer進行圖像顯示,每隔一定時間刷新圖像 2.另一個線程同步讀取串口中IMU的數據 3.測量時間可知,讀取串口的線程在QTimer中斷時耗時會大幅增加 還有一個問題是QSerialPort丟包。Qt5加入了QSerialPort的串口類,但經常會丟包,例如:...
51系列單片機串口緩存
51系列單片機串口緩存,已測試的單片機包括AT89C55WD、NXP89C669、STC11F60XE; buffer具有互鎖機制,完美解決串口中斷丟失數據,緩存數據等問題
填一個STC15F單片機串口通信的坑
STC單片機串口通信填坑最近在做個串口通信的案子,雙方約定通信波特率為115200,進行過程中,雙方按照50Hz頻率發送數據包,包長最大30byte,接收時,為了不掉數據,我使用了環形FIFO,數據在串口中斷寫入,主程序通過讀取FIFO來提取數據,使用FIFO讀取數據時,為了保證數據可靠性,不能同時寫入,所以需要將串口中斷暫時關閉語句內容大致如下:{ES=0;語句1,語句2,ES=1}語句1和語句...
繼續訪問
Qt串口處理數據丟包問題_少安的磚廠的博客_qt 串口數據...
1.將串口類的readyRead信號連接到自定義的readData函數 connect(serial, &QSerialPort::readyRead, this, &MainWindow::readData); 2.readData函數:數據包格式為2位開始位,這個函數中使用有限狀態機方法實現開始位判斷。
linux嵌入式串口通信丟包,IMX6 Linux系統下串口丟包錯包問題研究_墨菲...
無硬體流控串口丟包發生時機點: 處理當前串口中斷的CPU被其他中斷搶占 IMX6系列CPU,默認的IRQ中斷優先順序,是中斷號小的,優先順序高,可以優先處理。所以,如果當串口的數據已經來臨,FIFO接受到的數據,已經達到觸發中斷的閾值,此時應該是產生串口...
51單片機串口列印亂碼的解決方法
我使用的是stc的89c52rc型號,晶振是12m。是因為買的最小系統就是這個頻率。使用波特率位9600,將TL、TH都設置成0xfd後不管是英文還是中文的都是亂碼。
QT串口與51單片機通信
QT串口與51單片機通信 qt與單片機的串口通信 qt與單片機的串口通信 qt與單片機的串口通信
STC51單片機串口下載軟體
STC51單片機的高級版本燒錄器,包含串口開發助手功能,可選擇發送多位元組數據
串口通信丟包分析
RS232/RS422/RS485 非同步通信通常使用一個UART 來發送和接受數據,用UART 晶元來控制串口的傳輸。UART晶元內部有一個FIFO緩沖區,用於存儲軟體驅動程序的輸入數據。 FIFO的大小為1、16、64或128個位元組,具體取決於UART類型。 FIFO用於通過緩沖數據來提高兩個串列埠之間的通信吞吐量。接收和發送FIFO是獨立的。 數據流向 (RX) 外部的串口設備-------> UART晶元的FIFO,FIFO數據到達trigger level ,觸發中斷-...
繼續訪問

最新發布 對於串口接收數據有丟包如何處理
對於串口接收數據有丟包如何處理
繼續訪問
單片機串口中斷函數中,如果在裡面時間過長,後面來的數據會被自動丟棄嗎?答案是會丟數。很多串口測試實例上位機發送成功,但是下位機接收失敗
單片機串口中斷函數中,如果在裡面時間過長,後面來的數據會被自動丟棄嗎 我來答 分享 舉報 2個回答 #熱議#夫妻之間該做到絕對坦誠嗎? 網路網友b30480f 高粉答主 推薦於2017-09-18·繁雜信息太多,你要學會辨別 關注 不是自動丟棄,而是反復接收,導致後來的數據將先收到、未處理的數據給覆蓋了。 例如對方發給你一串0x01、0x02、0x03,假如你中斷函數太過磨嘰,可能在將0x01從緩沖區中取出後、在處理的過程中又先後收到了0x02、0x03,那麼0x03...
繼續訪問
STM32串口通訊數據丟失原因分析及解決辦法
在進行串口通訊實驗時,一時不仔細可能會發現通訊不正常,數據丟失的現象,包括丟失第一個字元,或只收到最後一個字元等等,本文接下來將就這類問題展開討論。 首先是通過MCU向上位機發送數據: 若程序如下圖所示, 直接發送數據,由於數據緩沖區(TDR)向移位寄存器發送數據是並行發送,時間較快,而從移位寄存器向外傳輸數據是串列輸出,耗時較長,如此可能導致數據丟失多個,或只接收到最後一個,因為後面並行傳輸的快,還沒等數據發送完成,下一個數據就覆蓋住了上一個數據。如此,有兩種解決辦法;一,添加發送...
繼續訪問

C51單片機多機串口通信,帶數據校驗
C51單片機多機串口通信,帶數據校驗,我自己全部編寫的好東西適合你們下載
stc51單片機串口接收多位元組數據
stc51單片機串口接收多位元組數據 簡介 51單片機有2個定時器,一個做串口波特率,一個做數據截止幀延時檢測,硬體平台測試使用的是stc8的單片機,但是可以往51移植 代碼 #include "stc8.h" unsigned char flag=0; //定義標志位,用來判斷接收了多少個字元 void UartInit(void) //[email protected] { SCON = 0x50; //8位數據,可變波特率 AUXR |= 0x40; //定時器1時鍾為Fosc,即1T
繼續訪問
51單片機的串口參數
常用模式為模式1和模式3 1. 波特率可變 2. 起始位為1,停止位為1,數據位為8, 3. 模式3可以選擇奇偶校驗位 ====================================================================== 最近剛好有項目使用到51的串口,整理了一下資料,固先記下,留待後用 模式0: 常用擴展IO 模式1: 波
繼續訪問
51中斷(數據丟失)
51中斷在沒有執行完的情況下,中斷再次發生這時是不會響應第二次中斷的。或者說中斷使能置沒有打開這是來的中斷變不會響應。 其實這是一個很明顯的問題,只是在寫程序的時候,特別遇到多中斷處理的程序時便會產生數據的丟失。而且又是很容易被忽略這么簡單的問題。
繼續訪問
單片機串口調試丟包驗證過程記錄 已解決
單片機串口調試丟包驗證過程記錄 已解決
繼續訪問
串口方面犯的錯誤
串口方面犯的錯誤 項目雖然做得不算多,但是關於串口的程序倒是寫了不少,可能是我太笨了吧,每次寫,每次錯,錯得五花八門,應有盡有,很少能一次性順順當當地搞定,更好笑的是有些錯誤是犯了好幾次的,每次找到這樣的錯誤,我都想給自己一個耳光。就在幾個小時前,我又犯了一個愚蠢的錯誤,痛定思痛,這次一定要總結起來,算是給自己敲個警鍾吧。 程序邏輯錯誤 我通常在串口接收中斷里進行協議的判斷,用不同的狀態量來記錄接收的情況,當完整地接收到一幀數據時,主控部分就可以對數據進行操作了。 假設要接收的數據協議格式為
繼續訪問
記一次串口丟包問題排查
1.項目中需要stm32和JN5169做串口通信,經測試大概有千分之一的丟包率。 2.排查步驟: 2.1.去掉關中斷的地方 2.2.提高串口中斷優先順序 2.3.確定非線路問題 2.4.剪除系統,用裸機跑 3.最終發現,是相同優先順序的中斷搶佔了串口中斷,導致丟包。 ...
繼續訪問
關於Qt5 SerialPort串口傳輸丟失數據問題。
什麼是Qt5 serialPort? 雖然現在大多數的家用PC機上已經不提供RS232介面了。但是由於RS232串口操作簡單、通訊可靠,在工業領域中仍然有大量的應用。Qt以前的版本中,沒有提供官方的對RS232串口的支持,編寫串口程序很不方便。現在好了,在 Qt5.1 中提供了QtSerialPort模塊,方便編程人員快速的開發應用串口的應用程序。 Qt5 serialPort存在的問題。
繼續訪問
串列口數據緩沖寄存器 SBUF 之 初步了解
c52系列的SBUF 有兩個緩沖器 寫SBUF 的操作完成待發送數據的載入,讀SBUF 的操作可獲得已接收到的數據。 兩個操作分別對應兩個不同的寄存器,一個是只寫寄存器,一個是只讀寄存器 在所有的串列通信方式中,在寫入SBUF信號的控制下,把數據裝入相同的九尾移位寄存器,前面八位為數據位元組,其最低位為移位寄存器的輸出位。根據不同的工作方式會自動將1或TB8的值裝入移位寄存器的第九位,並進行發送 串...
繼續訪問
串口丟包
單片機
嵌入式
寫評論

評論

10

3



分享

❷ 51單片機與rs485連接電路在串口程序中怎麼驅動485在線等!!!謝謝

驅動485有硬體驅動方式和軟體方式。

軟體方式的話硬體電路比較簡單,吧485的2、3腳連在一起,並接在51單片機的一腳上(比如P1_0),單片機發送腳TX接485的DI腳(也就是4腳),單片機的串口接收RX接485的RO腳(1腳)。

默認P1_0為低電平,當發送數據之前先把P1_0置高,發送結束後再置低。

閱讀全文

與單片機串口驅動相關的資料

熱點內容
佳明怎麼配對安卓 瀏覽:245
用什麼app校對試卷 瀏覽:101
基於單片機的光控路燈 瀏覽:33
為什麼說安卓平板適配的軟體少 瀏覽:676
三國志下載pdf 瀏覽:683
為什麼單片機c語言 瀏覽:423
演算法一定有一個或多個輸入 瀏覽:242
浪潮伺服器貴州銷售雲主機 瀏覽:844
amdlinux顯卡安裝 瀏覽:570
泰海科技雲伺服器如何卸載 瀏覽:124
有密碼打開excel加密 瀏覽:822
java生成重復字元 瀏覽:282
串口伺服器有什麼用 瀏覽:330
linux安裝red5 瀏覽:295
單片機中斷時入口地址作用 瀏覽:150
程序員的工作是重復性的嗎 瀏覽:69
照片怎麼轉換成pdf 瀏覽:134
女生學編程好嗎 瀏覽:242
目前絕地求生怎麼看伺服器地址大全 瀏覽:827
論人類不平等的起源pdf 瀏覽:438