日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

vc++ cserialport 打开多个串口_STM32之USART串口

發布時間:2023/12/18 c/c++ 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 vc++ cserialport 打开多个串口_STM32之USART串口 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 簡介

串口全稱:Universal synchronous asynchronous receiver transmitter,中文名稱:通用同步異步串行接收發送器。串口可用于接收和發送數據,可以用作跟其他設備通訊,如藍牙模塊、GSM模塊、GPS模塊等。
串口中最常見的是RS-232,共有9根線用于通訊,但常用的僅3根線:RXD、TXD、GND。其中RXD用于接收,TXD用于發送,GND為信號地線,兩個通訊設備之間的收發信號(RXD與TXD)應交叉相連。

2. 基本概念

  • 波特率:串口異步通訊中由于沒有時鐘信號,所以兩個通訊設備之間需要約定好波特率,即每個碼元的長度,以便對信號進行解碼,常見的波特率為4800、9600、115200 等。波特率越高傳輸速度越快,但出錯的概率要更大。
  • 通訊的起始和停止信號:串口通訊的一個數據包從起始信號開始,直到停止信號結束。數據包的起始信號由一個邏輯 0 的數據位表示,而數據包的停止信號可由 0.5、1、1.5或 2個邏輯 1的數據位表示,只要雙方約定一致即可。
  • 有效數據:在數據包的起始位之后緊接著的就是要傳輸的主體數據內容,也稱為有效數據,有效數據的長度常被約定為 5、6、7或 8位長。
  • 數據校驗:在有效數據之后,有一個可選的數據校驗位。由于數據通信相對更容易受到外部干擾導致傳輸數據出現偏差,可以在傳輸過程加上校驗位來解決這個問題。校驗方法有奇校驗(odd)、偶校驗(even)、0校驗(space)、1校驗(mark)以及無校驗(noparity)。奇校驗要求有效數據和校驗位中“1”的個數為奇數,偶校驗與奇校驗要求剛好相反,要求幀數據和校驗位中“1”的個數為偶數,0校驗是不管有效數據中的內容是什么,校驗位總為“0”,1校驗是校驗位總為“1”。
  • 常用的設置:波特率9600,8位數據位,1位停止位,無校驗位,無硬件流控。

串口USART分為兩部分,初始化和處理。

1. 初始化分三步:GPIO、通用中斷、USART。

1.1. GPIO:時鐘、引腳、輸入輸出模式、端口初始化

  • 時鐘:需要同時使能GPIO時鐘
  • 引腳:需要選擇指定的引腳
  • 輸入輸出模式:TX引腳選擇復用推挽模式,RX引腳選擇浮空輸入模式
  • 端口初始化:初始化指定的端口

1.2. 通用中斷:優先級分組、中斷源、優先級、使能

  • 優先級分組:設定合適的優先級分組
  • 中斷源:選擇指定的中斷源:USART1_IRQn
  • 優先級:設定合適的優先級
  • 使能:調用庫函數即可,可選擇使能多個中斷,一般情況下只使能接收中斷。

1.3. USART:時鐘、波特率、數據字長、停止位、校驗位、硬件流控制、工作模式、初始化、使能。

  結構體

typedef struct { uint32_t USART_BaudRate; uint16_t USART_WordLength; uint16_t USART_StopBits; uint16_t USART_Parity; uint16_t USART_Mode; uint16_t USART_HardwareFlowControl; } USART_InitTypeDef;
  • 時鐘:需要使能USART1時鐘

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

  • 波特率:一般可選的設置項包括4800、9600、115200等,常用的波特率為9600。

USART_InitStructure.USART_BaudRate = 9600;

  • 數據字長:可選8位或9位,常用的是8位。

USART_InitStructure.USART_BaudRate = 9600;

  • 停止位:可選0.5、1、1.5、2個,常用的是1個停止位。

USART_InitStructure.USART_BaudRate = 9600;

  • 奇偶校驗:可選無校驗、奇校驗和偶校驗,常用的是無校驗。

USART_InitStructure.USART_Parity = USART_Parity_No;

  • 模式:可選發送、接收,或者同時啟用,一般都是同時啟用。

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  • 硬件流控:可選有使能RTS、使能CTS、同時使能、不使能,一般選擇不使能。

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  • 初始化配置

USART_Init(USART1, &USART_InitStructure);

  • 使能

USART_Cmd(USART1, ENABLE);

2. 處理

處理分為接收和發送。
接收處理通常放在中斷中,中斷服務函數名稱為USART1_IRQHandler(),調用庫函數USART_ReceiveData()得到接收的數據,并自動清除接收中斷標志位;
發送直接調用庫函數USART_SendData()即可,發送完成之后會調用函數來獲取相應標志來實現發送完成等待功能,即USART_SendData()函數返回時,相應的數據已經確保發送完成,并可發送下一個數據,發送不同類型的數據可以封裝成不同的函數,但最終都是調用USART_SendData()函數。


接收:

// 串口中斷服務函數 void USART1_IRQHandler(void) {uint8_t ucTemp;if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET){ ucTemp = USART_ReceiveData(USART1);} }

發送:

//發送一個字節 void Usart_SendByte(USART_TypeDef * pUSARTx, uint8_t ch) {//發送一個字節數據到USARTUSART_SendData(pUSARTx,ch);//等待發送數據寄存器為空,即發送完成while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET); } //發送一個數組 void Usart_SendArray(USART_TypeDef * pUSARTx, uint8_t *array, uint16_t num) //發送字符串 void Usart_SendString(USART_TypeDef * pUSARTx, char *str)

完整代碼(僅自己編寫的部分)

void NVIC_Configuration(void) {NVIC_InitTypeDef NVIC_InitStructure;/* 嵌套向量中斷控制器組選擇 */NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);/* 配置USART為中斷源 */NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;/* 搶斷優先級*/NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;/* 子優先級 */NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;/* 使能中斷 */NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;/* 初始化配置NVIC */NVIC_Init(&NVIC_InitStructure); }void USART_Config(uint32_t baudrate) {GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;// 打開串口GPIO的時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 打開串口外設的時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);// 將USART Tx的GPIO配置為推挽復用模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);// 將USART Rx的GPIO配置為浮空輸入模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);// 配置串口的工作參數// 配置波特率USART_InitStructure.USART_BaudRate = baudrate;// 配置 幀數據字長USART_InitStructure.USART_WordLength = USART_WordLength_8b;// 配置停止位USART_InitStructure.USART_StopBits = USART_StopBits_1;// 配置校驗位USART_InitStructure.USART_Parity = USART_Parity_No ;// 配置硬件流控制USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;// 配置工作模式,收發一起USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;// 完成串口的初始化配置USART_Init(USART1, &USART_InitStructure);// 串口中斷優先級配置NVIC_Configuration();// 使能串口接收中斷USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);// 使能串口USART_Cmd(USART1, ENABLE); }//發送一個字節 void Usart_SendByte(USART_TypeDef * pUSARTx, uint8_t ch) {//發送一個字節數據到USARTUSART_SendData(pUSARTx,ch);//等待發送數據寄存器為空,即發送完成while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET); }//發送數組 void Usart_SendArray(USART_TypeDef * pUSARTx, uint8_t *array, uint16_t num) {uint8_t i;for(i = 0; i < num; i++){/* 發送一個字節數據到USART */Usart_SendByte(pUSARTx, array[i]);}/* 等待發送完成 */while(USART_GetFlagStatus(pUSARTx, USART_FLAG_TC)==RESET); }//發送字符串 void Usart_SendString(USART_TypeDef * pUSARTx, char *str) {uint32_t k = 0;do{Usart_SendByte(pUSARTx, *(str + k));k++;} while(*(str + k)!='0');/* 等待發送完成 */while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET); }//發送16位數 void Usart_SendHalfWord(USART_TypeDef * pUSARTx, uint16_t ch) {uint8_t temp_h, temp_l;/* 取出高八位 */temp_h = (ch & 0xFF00) >> 8;/* 取出低八位 */temp_l = ch & 0xFF;/* 發送高八位 */USART_SendData(pUSARTx, temp_h);while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);/* 發送低八位 */USART_SendData(pUSARTx, temp_l);while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET); }// 串口中斷服務函數 void USART1_IRQHandler(void) {uint8_t ucTemp;if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){ucTemp = USART_ReceiveData(USART1);USART_SendData(USART1, ucTemp);} }int main(void) {USART_Config(9600);Usart_SendString(USART1, "Hello World!n");while(1){} }

仿真結果

1. 發送

編譯完成后,點擊

開始仿真,點擊

,打開串口監視串口(點擊右側的箭頭可以選擇第幾個串口),然后運行程序,可以在串口監視窗口看到串口發送的信息。

2. 接收

如果想要仿真串口接收,需要使用虛擬串口軟件vspd,下載安裝完成后,運行該軟件:


可以看到左側有COM1-5共 5個物理串口,點擊右側的添加端口,可以添加COM6和COM7兩個虛擬串口,并自動連接這兩個串口。


此時可以打開2個串口工具,分別設置為COM6和COM7,并分別發送數據,看看對方是否能夠正常接收,如果可以,表示虛擬串口添加并連接成功,此時在串口工具中關閉COM6。

運行KEIL,并開始仿真后,在COMMAND串口中輸入
MODE COM6 9600,0,8,1
ASSIGN COM6 <S1IN> S1OUT
第一條命令設置COM6波特率9600,無校驗位,8個數據位,1個停止位,注意這里的設置應該與程序中串口的設置保持一致。
第二條命令將COM6和單片機的第一個串口進行綁定,即單片機第一個串口的收發數據通過計算機的COM6進行收發。
此時在串口工具打開COM7,并通過串口工具發送數據,程序即可接收到發送的數據。


從上圖可以看到從COM7發送了一個A給單片機,單片機接收到了A,并將A又發送出去,COM7接收到了A。
因此,通過虛擬串口軟件,即可在無開發板、無串口線、無串口設備的情況下,通過串口工具即可調試串口接收及發送程序,實現純軟件環境調試。

學習資料分享交流群:1093776732 入群有全套學習視頻資料電子書免費贈送!

參考資料:

嵌入式開發直播課 - STM32 USART串口的應用?www.makeru.com.cn物聯網開發入門直播課 - 基于STM32講解串口操作?www.makeru.com.cn物聯網開發入門直播課 - 通過Z-stack協議棧實現串口透傳?www.makeru.com.cn嵌入式開發直播課 - 帶你揭曉STM32定時器深藏不露的絕技?www.makeru.com.cn物聯網STM32入門 - 帶你揭曉STM32定時器深藏不露的絕技?www.makeru.com.cn

總結

以上是生活随笔為你收集整理的vc++ cserialport 打开多个串口_STM32之USART串口的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。