STM32串列埠環形緩衝區

2021-07-23 19:11:33 字數 2222 閱讀 5113

目錄

1:概述

2:**

1:概述

1.1:本篇實現串列埠驅動,實現printf函式的重定向,實現串列埠的中斷接受和傳送,效仿modbus協議中的3.5t超時機制,判斷是否接受完畢;

1.2:如果串列埠僅僅是實現乙個控制台,列印一些debug資料,使用printf函式(串列埠傳送資料忙等待),如果是需要用串列埠進行外設裝置的控制,比如串列埠gprs模組,需使用串列埠中斷進行控制,因為受限於串列埠的傳輸速率,如果使用忙等待傳送資料,會阻塞主程式中的其它任務;

1.3:使用sysclk作為超時定時器,sysclk的中斷優先順序需高於串列埠中斷;

1.4:除過使用3.5t超時時間判斷接受資料是否完成外,還可使用ascll碼的形式,利用字元操作庫函式,自定義串列埠通訊協議;

1.5:開發板:stm32f103zert   軟體環境:keil mkd5

1.6:115200 波特率,間隔1ms傳送字串 "password",主程式將接收到"password"後返回"123456\r\n",測試主程式響應迅速,不丟幀;

unsigned int t_35 = 0; //串列埠傳送3.5個位元組的時間,由波特率得出,單位為ms

int main(void)

} }}

usart_init.c

#include "usart_init.h"

u8 usart_receive_ok = 0;

u8 start_receive_flag = 0;

u8 usart_tx_buff[tx_re_buff_length];

u8 usart_rx_buff[tx_re_buff_length];

comx_define cycle;

/*******************printf()函式重定向***************/

//傳送函式

int fputc(int ch, file *f)

//接受函式

int fgetc(file *f)

void usart_init(u32 baud)

void usart_send_byte(u8 data)

}/*串列埠傳送函式*/

void usart_send_data(u8 *ptr,u8 num)

} else //傳送num位元組資料 }

}/*串列埠接收函式,當接收到可用的資料幀時,對接收到的資料進行處理,main函式中呼叫*/

void usart_handle_func(void)

buff[i] = '\0';

// usart_send_data(buff,0);

// usart_send_data("\r\n",0);

if(memcmp(buff,"password",8) == 0) }

///*中斷處理函式*/

void usart2_irqhandler(void)

else

}else

if(usart_getitstatus(usart2, usart_it_rxne) != reset) //接收完成中斷

}

STM32串列埠通訊(基於緩衝區)

一 串列埠的初始化和中斷設定 1 初始化gpio 根據手冊的8.1.11節,我們可以找到下表 在全雙工的模式下,傳送引腳需要設定為推挽復用輸出,接收引腳則設定為浮空輸入或帶上拉的輸入。因為一般不用同步和流量控制的方式,所以ck rst cts引腳不作配置。當然啦,在使用stm32外設的時候不要忘記開...

stm32 環形緩衝區

ringbuff.h ifndef ringbuff h define user ringbuff 1 使用環形緩衝區形式接收資料 if user ringbuff 如果使用環形緩衝形式接收串列埠資料 define ringbuff len 200 最好是2 n,此時就可以進行用取模運算 defin...

stm32串列埠通訊

通訊方式 1 同步通訊 帶時鐘同步訊號傳輸 spi,iic等 2 非同步通訊 不帶時鐘用途訊號 usrt,單匯流排 stm32串列埠引腳表 串口號 rxd txd 1 pa10 pa9 2 pa3pa2 3 pb11 pb10 4 pc11 pc10 5 pd2pc12 通訊過程 接收過程 由rx入...