① SBUF的詳細介紹!(51單片機)
這個不好講...有兩個SBUF...但地址是一樣的...一個只能寫,不能讀...另一個只能寫,不能讀...但用的時候不用管它只管讀就好了
② 8051單片機的串列口控制寄存器中有2個中斷標志位 它們是什麼和什麼
8051單片機的串列口控制寄存器中有2個中斷標志位 它們是RI和TI。TI是發送中斷標志,RI是接收中斷標志。標准51有5個中斷向量(不算復位),分別是外部中斷0,定時器0,外部中斷1,定時器1,串列口;總共有6個中斷標志,串列口的發送和接收共享一個中斷向量。
(2)51單片機串口寄存器擴展閱讀:
作用:SCON寄存器用來控制串列口的工作方式和狀態,可以位定址在復位時所有位被清零,位元組地址98HPCON主要是為CHMOS型單片機的電源控制設置的專用寄存器,單位地址87H,不能位定址,最高位SMOD,為波特率選擇位。
8051單片機是PC 機的CPU 是基於馮諾伊曼的體系結構。單片機的存儲器配置:
1、 一個8 位的微處理器(CPU)。
2、 片內數據存儲器RAM(128B/256B),用以存放可以讀/寫的數據,如運算的中間結果、最終結果以及欲顯示的數據等,SST89 系列單片機最多提供1K 的RAM。
3、 四個8 位並行I/O 介面P0~P3,每個口既可以用作輸入,也可以用作輸出。
4、 五個中斷源的中斷控制系統。新推出的單片機都不只5 個中斷源,例如SST89E58RD 就有9 個中斷源。
5、 一個全雙工UART(通用非同步接收發送器)的串列I/O 口,用於實現單片機之間或單機與微機之間的串列通信。
6、 片內振盪器和時鍾產生電路,但石英晶體和微調電容需要外接。最高允許振盪頻率為12MHz。SST89V58RD 最高允許振盪頻率達40MHz,因而大大的提高了指令的執行速度。
參考資料來源:網路_8051單片機
③ 51單片機有串口嗎
51 單片機內部有一個全雙工串列介面。什麼叫全雙工串口呢?一般來說,只能接受或只能發送的稱為單工串列;既可接收又可發送,但不能同時進行的稱為半雙陵清工;能同時接收和發送的串列口稱為全雙工串列口。串列通信是指數據一位一位地按順序傳送的通信方式,其突出優點是只需一根傳輸線,可大大降低硬體成本,適合遠距離通信。其缺點是傳輸速度較低。
串口可以有底下四種工作方式
1、方式0
串列介面的工作方式0為移位寄存器I/O方式。在串列口外接移位寄存器以擴展I/O介面,也可以外接串列同步I/O的設備。
(1)方式0輸出
串列口以方式0發送時,數據以RXD端串列輸出,TXD端輸出同步信號。當一個數據寫入串列口發送緩沖器以後,就啟動串列口發送器以振盪頻率的十二分之一的波特率,將數據從RXD端串列輸出。
(2)方式0輸入
當串列口定義為方式0並置位REN後,便啟動串列口以方式0接收數據,此時RXD端為數據輸入端,TXD端為同步脈沖信號輸出端。接收器以振盪率的十二分之一的波特率接收RXD端輸入的數據信息。但接收器接收到8位數據時,置1中斷標志RI。
2、方式1
串列介面定義為工作方式1時,則被控制為8位的非同步通訊介面,傳送一幀信息為10位,其中1位為起始位,8位數據位(先低位後高位),1位停止位。
(1)方式1輸出
串列介面以方式1發送時,數據由TXD端輸出。CPU執行一條數據寫入發送緩沖
器SBUF的指令(例如,MOVSBUF,A),數據位元組寫入SBUF後,便啟動串列口發送器發送,發送完一幀信息,置1放送中斷標志TI。
(2)方式1輸入
串列口以方式1接收時,數據從RXD端輸入。在REN置1以後,就允許接收器接收。接收器以所建立的波特率的16倍分頻計數器,以便實現時間同步。計數器的16個狀態把一位的時間等分成16份,在每位時間的第7、8和9個計數狀態,位檢測器采樣RXD的值,接收的值是3次采樣中取至少二次相同的值,以排除雜訊的干擾。如尺歷前果在起始接收的值不是0,則起始位無效,復位接收電路。在檢測到另一個1到0的跳變時,再重新啟動接收器。如果接收到值為0,起始位有效,則開始接收本幀的其餘信息。當RI=0並且接收到的停止位為1(或SM2=0)時,停止位進入RB8,接收到的8位數據進入接收緩沖器SBUF,置位RI中斷標志。接著接收便搜索另一幀信息的起始位。
3、方式2和方式3
串列介面工作方式2和方式3時,則被定義為9位的非同步通信介面。傳送一幀信息為11位,其中1位起始位,8位數據位(從低位至高位),1位是附加的可程式控制為1或0的第9位數據,1位停止位。
方式2和方式3的差別僅僅在於波特率不一樣,方式2的波特率是固定的,波特率為2SMOD/64(振盪頻率);方式3的波特率是可變的,波特率=2SMOD/32(T1的溢出率)。
方式2和方式3在發送和接收時唯一的區別就是波特率不同爛仔。
(1)方式2和方式3發送
方式2或方式3發送時,數據由TXD端輸出,發出一幀信息為11位,附加的第9位數據是SCON中的TB8,CPU執行一條數據寫入發送緩沖器SBUF的指令,就啟動發送器發送,發送完一幀信息,置「1」TI中斷標志。
(2)方式2和方式3接收
串列口被定義為方式2或方式3接收時,數據從RXD端輸入,置REN=1以後,開始接收過程。當檢測到RXD端從高到低的負跳變時,確認起始位有效,開始接收本幀的其餘信息。在接收完一幀信息後,在RI=0、SM2=0時,或接收到第9位數據為「1」時,8位數據裝入接收緩沖器,第9位數據裝入SCON中RB8,並置RI=1。若不滿足上述的兩個條件,接收到的信息將會丟失,也不置位RI
④ 51單片機串口發送「」是怎麼回事
一、51單片機串口概念
1、51單片機的串列口
51單片機的串列口是一個可編程全雙工的通信介面,具有UART(通用非同步收發器)的全部功能。
2、51單片機的硬體連接
簡單雙向串口通信有兩根數據通信線:
發送端TXD(Transmit Data)
接收端RXD(Receive Data)
TXD和RXD要交叉連接
3、51單片機串口通信的基本結構
51單片機的串列口主要是由兩個獨立的串列數據緩存器SUBF(一個發送緩存寄存器,一個接收緩存寄存器)和發送控制器、接收控制器、輸入移位寄存器及若干控制門電路組成。串列口的基本結構如圖所示:
關於SUBF:串口數據緩存寄存器,物理上是兩個獨立的寄存器,但是佔用相同的地址。寫操作時,寫入的是發送寄存器;讀操作時,讀出的是接收寄存器。
①:接收端:數據通過RXD接收引腳,再通過移位寄存器將數據轉存到接收寄存器中
②:發送端:講數據從發送寄存器中移出,通過TXD發送引腳將數據發送出去
③:波特率:通過設置定時器1的初值,獲取T1溢出率,通過SMOD模式的設置求取波特率
④:中斷:通過發送中斷標志位或接收中斷標志位是否被置位,判斷是否進入串口中斷程序,在接收數據完成後,會將RI置位,產生一個接收中斷;在發送完成後,會將TI置位,產生發送中斷
4、傳播速率——比特率
比特率是指每秒傳送的比特(bit)數。單位為bps(bit per second)也可表示為b/s,比特率越高,單位時間傳送的數據量(位數)越大。
5、波特率
在串口通信中,收發雙方對發送或接收數據的速率有約定,即雙方要有相同的波特率,我們可以通過編程對單片機串列口設定4中工作方式:
其中,T1的溢出率 = 1/T1溢出的時間
①:關於定時器1方式的選擇
在說選取定時器1方式之前插一句:這里的定時器1方式2不是串口那4中方式中的方式2;
在學習定時器的相關知識的時候,我們知道定時器有4種不同的工作方式,在串口通信的實驗中,我們選擇的是定時器1的工作方式2;
定時器T1工作於方式0:溢出所需周期數=8192-x
定時器T1工作於方式1:溢出所需周期數=65536-x
定時器T1工作於方式2:溢出所需周期數=256-x
為什麼不選擇定時器1的工作方式1:
如果我們使用定時器1的工作方式1在中斷中裝初值的方法來T1溢出率的話,在進入中斷、重裝值、出中斷這個過程中很容易產生時間上的微小的誤差,當多次操作時微小的誤差不斷累積,終會產生錯誤;
為什麼選擇定時器1的工作方式2:
因為方式2為自動重裝初值的8位定時器/計數器模式(自動重裝載就是在定時器溢出後自動裝入設定的初值,這樣的好處當然是顯而易見的,不需要在中斷伺服器裏手動賦值了,所以可以精確的定時)所以用它來做波特率發生器最恰當。
②:波特率的計算
在上面介紹串口四種方式的時候提到了波特率的計算公式,由公式可以看出,串口方式0和方式2的波特率是固定的;方式1和方式3的波特率是可變的(根據定時器T1的溢出率來控制)
話不多說,根據題來理解:
根據已知波特率,如何計算定時器1方式2下計數寄存器中的初值:
已經波特率 = 9600,系統的晶振頻率 = 12Mhz,求給TH1和TL1的初值:
由此可見,當系統的晶振頻率為12Mhz時,定時器的初值不是整數;經過計算可得,當晶振頻率為11.0592Mhz時,(256-x) = 3;
當時鍾頻率選用11.0592MHZ時,取易獲得標準的波特率,所以很多單片機系統選用這個看起來「怪」的晶振就是這個道理。
6、波特率與比特率關系與區別
碼元:在數字通信中常常用時間間隔相同的符號來表示一個 二進制數字 ,這樣的時間間隔內的信號稱為 (二進制)碼元。
在信息傳輸通道中,攜帶數據信息的信號單元叫碼元,每秒鍾通過信道傳輸的碼元數稱為碼元傳輸速率,簡稱波特率。即波特率是指數據信號對載波的調制速率,它用單位時間內載波調制狀態改變次數來表示。每秒鍾通過信道傳輸的信息量稱為位傳輸速率,簡稱比特率。比特率表示有效數據的傳輸速率。波特率與比特率的關系是比特率=波特率X單個調制狀態對應的二進制位數。波特率是傳輸通道頻寬的指標。
二、串口通信有關寄存器
1、數據緩存寄存器
SBUF是可以直接定址的專用寄存器。物理上,它對應著兩個寄存器,即一個發送寄存器一個接收寄存器,CPU寫SBUF就是修改發送寄存器;讀SBUF就是讀接收寄存器。接收器是雙緩沖的,以避免在接收下一幀數據之前,CPU未能及時的響應接收器的中斷,沒有把上一幀的數據讀走而產生兩幀數據重疊的問題。對於發送器,為了保持最大的傳輸速率,一般不需要雙緩沖,因為發送時CPU是主動的,不會產生重疊問題。
2、電源寄存器PCON
該寄存器是用來管理單片機的電源部分,包括上電復位檢測,掉電模式,空閑模式等
在串口通信中,我們僅僅需要關注SMOD這一位
SMOD = 0且串口方式為1、2、3時,波特率正常
SMOD = 1且串口方式為1、2、3時,波特率加倍
3、狀態寄存器SCON(98H)
SM0 SM1:工作方式選擇位,串列口有四種工作方式,他們由SM0和SM1設定,其對應關系表如下:
SM2:多機通信時的接收允許標志位
REN:允許串列接收位
TB8,RB8:發送接收數據的第9位,當串口工作於方式2或3 時使用到,指向的是串列傳輸的第9位數據;
1)SM2=0,在方式2或3下,TB8、RB8 發送與接收第9位奇偶校驗位;
2)SM2=1,多機通信時的接收允許位,並且在方式2或3下工作;
TI:發送中斷標志位,在方式0時,當串列發送第8位數據結束時,或在其他方式,串列發送停止位的開始時,由其內部硬體使TI置1,向CPU發出中斷申請。在中斷服務程序中,必須用軟體將其清 0,取消此中斷申請。
RI:接收中斷標志位,在方式0時,當串列接收第8位數據結束時,或在其他方式,串列接收停止位的中間時,由內部硬體使RI置1,向CPU發出中斷申請。也必須在中斷服務程序中,用軟體將其清0,取消此中斷申請。
三、串口通信代碼
串列口在工作之前,應對其進行初始化,主要是設置產生波特率的定時器1,串列口控制和中斷控制。
void usart_init()
{
TMOD = 0x20; //選擇定時器1的工作方式2
TH1 = 0xF3; //通過設置定時器1的初值來選擇波特率
TL1 = 0xf3;
TR1 = 1; //打開計數器
SCON = 0x50; //0101 0000
PCON = 0x80;
ES = 1; //打開通信中斷 ①
EA = 1; //打開總中斷 ②
}
或者
void usart_init()
{
TMOD = 0x20;
TH1 = 253;
TL1 = 253;
TR1 = 1;
SM0 = 0;
SM1 = 1;
// REN = 1
// EA = 1;
// ES = 1;
}
在編寫串口發送端程序時,無需用到接收數據和中斷服務函數,所以REN、EA、ES不需要對他們進行操作
⑤ 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
踩
分享