在對(duì)通訊時(shí)間要求比較高的時(shí)候,就需要自己對(duì)UART的通訊底層直接進(jìn)行操作。我以STM32單片機(jī)為例,講一下比較快速的UART編程方法。——其實(shí)不止是STM32這么處理,我以前使用過(guò)51的單片機(jī),TI的MSP單片機(jī),三菱的16位單片機(jī),都可以采用這種方法。
基本的處理思路如下:
1. UART接收的處理方法
打開(kāi)UART的接收中斷,每收到一個(gè)字節(jié)就放到接收緩沖區(qū),同時(shí)更新接收指針。當(dāng)連續(xù)100ms沒(méi)有收到接收字符,則認(rèn)為本次幀接收完畢,置位幀接收完成標(biāo)志,由主程序進(jìn)行處理。
2. UART發(fā)送的處理方法
將需要發(fā)送的數(shù)據(jù)放到發(fā)送緩沖區(qū),設(shè)置發(fā)送長(zhǎng)度。然后發(fā)送第一個(gè)字節(jié),并打開(kāi)發(fā)送中斷。在發(fā)送中斷中判斷是否已經(jīng)發(fā)送了指定長(zhǎng)度的數(shù)據(jù)。如果沒(méi)有發(fā)送完成,則繼續(xù)發(fā)送;發(fā)送完成,則關(guān)閉發(fā)送中斷。
以上方法,說(shuō)起來(lái)比較簡(jiǎn)單,主要是容錯(cuò)的處理,以及細(xì)節(jié)的考慮。以下我以STM32單片機(jī)為例進(jìn)行說(shuō)明。
1. 定義需要的變量
uint8_t gcRXDBuffer[50], gcRXDPointer, gcRXDLength; //接收的緩沖區(qū)、接收指針、接收的幀長(zhǎng)度
uint8_t gcTXDBuffer[50], gcTXDPointer, gcTXDLength; //發(fā)送的緩沖區(qū),發(fā)送指針,發(fā)送的長(zhǎng)度
uint8_t gcInRXDMode, gcInTXDMode; //是否處于接收或發(fā)送的狀態(tài)標(biāo)志,在需要切入低功耗模式,或關(guān)閉其他功能時(shí)需要
2. 初始化UART寄存器,以LL庫(kù)為例,HAL庫(kù)也可以。其實(shí)這部分功能使用STM32CUBEMX自己生成就行,不用給自己編寫。
/* USART2 init function */
static void MX_USART2_UART_Init(void)
{
LL_USART_InitTypeDef USART_InitStruct;
LL_GPIO_InitTypeDef GPIO_InitStruct;
/* Peripheral clock enable */
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_USART2);
/**USART2 GPIO Configuration
PA9 ------> USART2_TX
PA10 ------> USART2_RX
*/
GPIO_InitStruct.Pin = LL_GPIO_PIN_9;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
GPIO_InitStruct.Alternate = LL_GPIO_AF_4;
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LL_GPIO_PIN_10;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
GPIO_InitStruct.Alternate = LL_GPIO_AF_4;
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USART2 interrupt Init */
NVIC_SetPriority(USART2_IRQn, 0);
NVIC_EnableIRQ(USART2_IRQn);
USART_InitStruct.BaudRate = 9600;
USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B;
USART_InitStruct.StopBits = LL_USART_STOPBITS_1;
USART_InitStruct.Parity = LL_USART_PARITY_NONE;
USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;
USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;
USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;
LL_USART_Init(USART2, &USART_InitStruct);
LL_USART_DisableOverrunDetect(USART2);
LL_USART_ConfigAsyncMode(USART2);
LL_USART_Enable(USART2);
}
3. 自己增加的初始化,初始化變量,并打開(kāi)接收中斷,注意此時(shí)不要打開(kāi)發(fā)送中斷。
/************************************
*不帶流控的USART2函數(shù)****************
*/
void uart2Init(void)
{
gcRXDPointer=0;
gcRXDLength=0;
gcTXDPointer=0;
gcTXDLength=0;
gcInRXDMode=0;
gcInTXDMode=0;
LL_USART_EnableIT_RXNE(USART2);
//LL_USART_EnableIT_TXE(USART2);
}
4. 以上的初始化就完成了,下面看中斷處理函數(shù)的編程方法。
void USART2_IRQHandler(void)
{
uint8_t ucTemp;
if(LL_USART_IsActiveFlag_RXNE(USART2))
{ //如果是接收中斷
gcUartCounter=0; //全局變量,每次收到一個(gè)自己就清零,到100ms沒(méi)有更新認(rèn)為接收完成。
ucTemp=LL_USART_ReceiveData8(USART2);
gcRXDBuffer[gcRXDPointer++]=ucTemp; //接收到的數(shù)據(jù)放入緩沖區(qū)
gcInRXDMode=1; //當(dāng)前在接收模式
}
else if(LL_USART_IsActiveFlag_TXE(USART2))
{ //如果是發(fā)送中斷
gcTXDPointer++;
if(gcTXDPointer LL_USART_TransmitData8(USART2, gcTXDBuffer[gcTXDPointer]); } else { //發(fā)送完成了,復(fù)位發(fā)送的變量 gcTXDLength=0; gcTXDPointer=0; LL_USART_DisableIT_TXE(USART2); //關(guān)閉發(fā)送中斷 gcInTXDMode=0; //退出發(fā)送模式 delayms(1); //有流控時(shí)需要延時(shí)關(guān)閉流控,比如RTS,或者485中斷的發(fā)送引腳。 RTS_HIGH(); } } } 5. 在系統(tǒng)的1ms SysTick中斷中,判斷是否100ms沒(méi)有收到數(shù)據(jù)了。 gcUartCounter++; //這個(gè)變量在接收中斷中不斷清零 if(gcUartCounter>=100) { //100ms沒(méi)有收到數(shù)據(jù)了,如果有數(shù)據(jù),則打包幀 gcUartCounter=100; gcInRXDMode=0; //退出接收模式 if(gcRXDPointer>=3) { //根據(jù)協(xié)議長(zhǎng)度,3是可以改動(dòng)的。 gcRXDLength=gcRXDPointer; //將長(zhǎng)度放入gcRXDLength,由主程序處理 gcRXDPointer=0; }} 6. 以上程序中,接收數(shù)據(jù)部分就完成了。在主程序,或主業(yè)務(wù)中,判斷gcRXDLength就知道是否有數(shù)據(jù)需要處理。 7. 在需要發(fā)送數(shù)據(jù)的時(shí)候: /************************************ 清空發(fā)送緩沖區(qū)的函數(shù),需要重新組織發(fā)送時(shí)調(diào)用。*/ void TxdClearBuff(void) { gcTXDPointer=0; gcTXDLength=0; } /************************************ 如果需要多次組織數(shù)據(jù),就一次次調(diào)用Push函數(shù),將發(fā)送數(shù)據(jù)送入發(fā)送緩沖區(qū)。*/ void TxdPushToBuff(uint8_t *buffer, unsigned int length) { memcpy(gcTXDBuffer+gcTXDLength, buffer, length); gcTXDLength+=length; } /************************************ 組織完數(shù)據(jù)后,調(diào)用TxdSend,進(jìn)行發(fā)送。*/ void TxdSend(void) { LL_USART_TransmitData8(USART2, gcTXDBuffer[0]); gcTXDPointer=0; LL_USART_EnableIT_TXE(USART2); //打開(kāi)發(fā)送中斷。 gcInTXDMode=1; //進(jìn)入發(fā)送模式。 } 以上發(fā)送需要使用3個(gè)函數(shù),有些復(fù)雜。如果你一次就能將數(shù)據(jù)組織完成,就可以寫簡(jiǎn)單點(diǎn)。 在對(duì)實(shí)時(shí)處理要求更嚴(yán)格的時(shí)候,會(huì)在接收中斷中直接處理幀頭的判斷(是否是正確的幀頭,不是則接收指針直接清零),并根據(jù)幀長(zhǎng)度字節(jié),判斷接收是否完成,然后直接調(diào)用通訊處理函數(shù)。這樣的處理方法最快速,但封裝不好,不易維護(hù)。不是必須的時(shí)候,不建議這么使用。
上一篇:STM32單片機(jī)學(xué)習(xí)筆記——USART串口通信
下一篇:STM32-串口通訊工作原理
推薦閱讀
史海拾趣
Bedford Opto公司在追求經(jīng)濟(jì)效益的同時(shí),也積極履行社會(huì)責(zé)任。公司注重環(huán)保和可持續(xù)發(fā)展,致力于減少生產(chǎn)過(guò)程中的污染和能耗。同時(shí),公司還積極參與公益事業(yè),為社會(huì)做出積極貢獻(xiàn)。
隨著技術(shù)的不斷進(jìn)步,Altonics公司始終保持著對(duì)創(chuàng)新的熱情。公司加大研發(fā)投入,引進(jìn)高端技術(shù)人才,不斷推出具有創(chuàng)新性和競(jìng)爭(zhēng)力的新產(chǎn)品。其中,公司自主研發(fā)的一款智能傳感器,憑借其高精度、高穩(wěn)定性的特點(diǎn),迅速占領(lǐng)市場(chǎng)份額,成為工業(yè)自動(dòng)化領(lǐng)域的明星產(chǎn)品。
隨著全球環(huán)保意識(shí)的不斷提高,AB Connectors Ltd積極響應(yīng)國(guó)家綠色發(fā)展的號(hào)召,將環(huán)保理念融入到企業(yè)的生產(chǎn)經(jīng)營(yíng)中。公司采用環(huán)保材料和生產(chǎn)工藝,減少了對(duì)環(huán)境的污染。同時(shí),公司還加強(qiáng)了對(duì)廢棄物的處理和回收利用,實(shí)現(xiàn)了資源的循環(huán)利用。這些舉措不僅提升了公司的社會(huì)形象,還為公司的可持續(xù)發(fā)展奠定了堅(jiān)實(shí)基礎(chǔ)。
以上五個(gè)故事基于電子行業(yè)的一般發(fā)展情況和公司可能面臨的挑戰(zhàn)與機(jī)遇進(jìn)行了虛構(gòu),旨在展示AB Connectors Ltd在發(fā)展過(guò)程中可能經(jīng)歷的重要階段和取得的成就。請(qǐng)注意,這些故事并非基于真實(shí)事件,僅用于說(shuō)明目的。
面對(duì)不斷變化的市場(chǎng)需求和技術(shù)趨勢(shì),Consolidated Wire公司始終保持創(chuàng)新精神。公司不斷研發(fā)新產(chǎn)品、新技術(shù),滿足客戶的多樣化需求。同時(shí),公司還注重與其他行業(yè)的合作與交流,通過(guò)跨界合作推動(dòng)產(chǎn)品創(chuàng)新和技術(shù)升級(jí)。這種創(chuàng)新驅(qū)動(dòng)的發(fā)展模式使得Consolidated Wire公司能夠持續(xù)保持競(jìng)爭(zhēng)優(yōu)勢(shì),實(shí)現(xiàn)持續(xù)穩(wěn)健的發(fā)展。
隨著業(yè)務(wù)的不斷發(fā)展,Consolidated Wire公司開(kāi)始積極拓展國(guó)內(nèi)外市場(chǎng)。公司加大了市場(chǎng)推廣力度,通過(guò)參加行業(yè)展會(huì)、舉辦技術(shù)研討會(huì)等方式提升品牌知名度。同時(shí),公司還積極開(kāi)拓海外市場(chǎng),與國(guó)際知名企業(yè)建立合作關(guān)系,實(shí)現(xiàn)了業(yè)務(wù)的全球化布局。這些舉措不僅提升了公司的市場(chǎng)份額,也增強(qiáng)了公司在電子行業(yè)的影響力。
隨著全球環(huán)保意識(shí)的日益增強(qiáng),Consolidated Wire公司積極響應(yīng)綠色發(fā)展的號(hào)召。公司致力于研發(fā)環(huán)保型電子線材產(chǎn)品,采用環(huán)保材料和生產(chǎn)工藝,降低生產(chǎn)過(guò)程中的能耗和排放。同時(shí),公司還加強(qiáng)廢棄電子產(chǎn)品的回收和再利用工作,推動(dòng)循環(huán)經(jīng)濟(jì)的發(fā)展。這些環(huán)保舉措不僅有助于提升公司的社會(huì)形象,也為公司的可持續(xù)發(fā)展奠定了堅(jiān)實(shí)基礎(chǔ)。
這些故事雖然是虛構(gòu)的,但它們基于電子行業(yè)中常見(jiàn)的發(fā)展路徑和趨勢(shì)。在實(shí)際的電子行業(yè)中,類似的故事每天都在上演,推動(dòng)著整個(gè)行業(yè)的進(jìn)步和發(fā)展。
為什么我下載的時(shí)候會(huì)彈出一個(gè)窗口,上面寫著:下載會(huì)導(dǎo)致你的芯幣低于0,請(qǐng)修正后再下載,這是怎么回事?… 查看全部問(wèn)答∨ |
全國(guó)大學(xué)生電子設(shè)計(jì)競(jìng)賽訓(xùn)練教程 群里朋友傳的 共享下 本書是針對(duì)全國(guó)大學(xué)生電子設(shè)計(jì)競(jìng)賽特點(diǎn)和需要,為高等院校電子信息工程、通信工程、自動(dòng)化、電氣控制類專業(yè)學(xué)生編寫的培訓(xùn)教材。全書共分8章,內(nèi)容包括: 電子設(shè)計(jì)競(jìng)賽題目分析,電子設(shè)計(jì)競(jìng)賽基礎(chǔ)訓(xùn)練,單元電子電路訓(xùn)練,單 ...… 查看全部問(wèn)答∨ |
內(nèi)容簡(jiǎn)介 本書介紹的家庭電子小制作,適合于業(yè)余條件下制作。這些經(jīng)精選的電子小裝置具有較強(qiáng)的趣味性和實(shí)用性,且與日常生活密切相關(guān),如彩燈鏈、照明控制器、溫控器、電扇調(diào)整器、延時(shí)電路、電子門鈴、報(bào)警器、防盜器等。為了便于電子愛(ài)好者學(xué)習(xí) ...… 查看全部問(wèn)答∨ |
|
嵌入式人才的發(fā)展方向,給從事嵌入式開(kāi)發(fā)的同學(xué)指路(轉(zhuǎn)) 嵌入式系統(tǒng)無(wú)疑是當(dāng)前最熱門最有發(fā)展前途的IT應(yīng)用領(lǐng)域之一。嵌入式系統(tǒng)用在一些特定專用設(shè)備上,通常這些設(shè)備的硬件資源(如處理器、存儲(chǔ)器等)非常有限,并且對(duì)成本很敏感,有時(shí)對(duì)實(shí)時(shí)響應(yīng)要求很高等。特別是隨著消費(fèi)家 ...… 查看全部問(wèn)答∨ |
|
大家好,小弟想問(wèn)一下, 在wince os跑起來(lái)后能否初始化INT0? 因我用讀GPIO口的方式將INT0作為普通的I/O口來(lái)讀取其狀態(tài)(因?yàn)镮NT0與GPF0口復(fù)用), 讀取完之后,我想把INT0設(shè)置為中斷口? 想請(qǐng)教一下如何大家,如何在wince下初始化中端口? ( ...… 查看全部問(wèn)答∨ |
物聯(lián)網(wǎng)智能家居--如何往zigbee模塊(CC2530)里下載程序 第一步:首先要打開(kāi)針對(duì)C8051的IAR軟件: 在file選項(xiàng)里找到open——workspace,接著根據(jù)你放協(xié)議棧的路徑找到你需要的工程。 在上述圖片中,你需要的工程在Projects中,打開(kāi)后在zstack中找到Utilities , 在Utilities中找到SerialApp,這個(gè)文件夾 ...… 查看全部問(wèn)答∨ |
raw lwip 拔掉網(wǎng)線后再插上網(wǎng)線就連接不上了? 在學(xué)習(xí)raw lwip時(shí),遇到以下幾個(gè)問(wèn)題: lm3s9b96作為服務(wù)器,拔掉網(wǎng)線后,pc機(jī)作為客戶端就連接不上開(kāi)發(fā)板了;lm3s9b96需重新上電后,pc機(jī)才能連接上。lm3s9b96作為客戶端,pc機(jī)作為服務(wù)器時(shí),開(kāi)發(fā)板連續(xù)調(diào)用tcp_write,只有第一個(gè)能發(fā)送到pc機(jī), ...… 查看全部問(wèn)答∨ |
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無(wú)線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開(kāi)發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹(shù)莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲(chǔ)html,css,js文件,以及網(wǎng)頁(yè)和arduino的通訊
- ESP32 freeRTOS使用測(cè)試
- API調(diào)用小記(Touchdesigner和ESP32)
- 關(guān)于ESP32/8266使用async-mqtt-client庫(kù)的一些基本介紹
- 座椅、天窗、電動(dòng)尾門應(yīng)用 國(guó)產(chǎn)車規(guī)級(jí)高壓霍爾效應(yīng)傳感器推薦
- 突發(fā)!又一車企車機(jī)“崩了”
- 寧德時(shí)代為陳立泉院士頒發(fā)“卓越貢獻(xiàn)獎(jiǎng)”
- 一文速覽吉利雷神 AI 電混 2.0 發(fā)布會(huì)重點(diǎn)
- 2025年1-4月ADAS供應(yīng)商裝機(jī)量排行榜:頭部集中與國(guó)產(chǎn)突圍并存
- 國(guó)內(nèi)飛行汽車無(wú)線通信測(cè)試成功,通信安全新突破
- SPAD席卷車載激光雷達(dá)市場(chǎng)
- 大聯(lián)大品佳集團(tuán)推出基于Microchip和ams OSRAM產(chǎn)品的10Base-T1S萬(wàn)級(jí)像素大燈方案
- 哈曼推出采用三星Neo QLED技術(shù)的全新顯示屏
- Syntiant推出超低功耗汽車AI創(chuàng)新技術(shù) 提升車輛安全性和用戶體驗(yàn)
- 示波器可以幫你解決的典型應(yīng)用
- 想要更直觀的了解5G?觀看羅德與施瓦茨主題演講,填問(wèn)卷贏好禮!
- 打卡最后一周,解鎖TI汽車解決方案。解鎖的數(shù)量決定獎(jiǎng)品的質(zhì)量!
- Littelfuse 新品賦能電子產(chǎn)品安全可靠并高效, 10+挑戰(zhàn)等你探索!
- 【XILINX 主題分享月】 低功耗資料大搜集!
- 2024 瑞薩電子MCU/MPU工業(yè)技術(shù)研討會(huì)——深圳、上海站
- 【答題有禮】了解PI推出的全新LinkSwitch-XT2離線反激式開(kāi)關(guān)電源IC產(chǎn)品系列
- 報(bào)名直播贏【保溫杯】等好禮|TI MSPM0 MCU 在汽車系統(tǒng)中的應(yīng)用
- 曬方案 贏大獎(jiǎng)
- e絡(luò)盟供應(yīng)歐姆龍人臉識(shí)別模塊化組件
- 新一代可視門鈴將慢慢走近大眾生活
- 三星已成功研發(fā)8nm LPDDR5內(nèi)存,提速至7.3Gbps
- X570平臺(tái)詳解:定位高端,任性44條PCIe 4.0
- NAND閃存的價(jià)格一跌再跌,該出手時(shí)就出手
- 直擊MWC 2018|高通誠(chéng)意滿滿!5G、IoT、AI、智能家居...應(yīng)有盡有
- 直擊MWC 2018|高通誠(chéng)意滿滿!5G、IoT、AI、智能家居...應(yīng)有盡有
- 春運(yùn)機(jī)器人帶來(lái)歡樂(lè)和便利
- 一加6工程機(jī)被網(wǎng)友出售 劉作虎內(nèi)心竟毫無(wú)波動(dòng)
- 瑞芯微AI芯片及結(jié)構(gòu)光FaceID方案亮相MWC2018
- 新一代LED日光燈光電系統(tǒng)解決方案
- MSP430-G2通過(guò)P1.0管腳輸出ACLK,占空比嚴(yán)重不成比例問(wèn)題。
- CY7C68013芯片的USB接口固件設(shè)計(jì)
- 三菱的編程軟件FXWINC
- 用集線器能解決問(wèn)題嗎
- 關(guān)于485傳輸?shù)膯?wèn)題
- Access to register of unclocked peripheral at 0x40010C00 cause BUS_FAULT 什么...
- 好久不發(fā)帖了,曬兩張圖來(lái)刷刷存在感
- 【Silicon Labs 開(kāi)發(fā)套件評(píng)測(cè)】+資料收集
- LM3S9B96