本文例子參考《STM32單片機開發實體——基于Proteus虛擬仿真與HAL/LL庫》
源代碼:https://github.com/LanLinnet/STM33F103R6
專案要求
實作通過串口助手發送單位元組資料,單片機收到資料后,交換高4位與低4位,將新的資料通過串口發回串口助手,例如,串口助手發送資料“AB”,單片機回傳資料“BA”,
硬體設計
-
在第一節的基礎上,在Proteus中添加電路如下圖所示,其中我們添加了:串口組件
COMPIM,用于連接計算機虛擬串口;

一個虛擬儀器VIRTUAL TERMINAL,用來查看單片機收到的串口資料,

由于要實作串口通信,我們要將其波特率、字長、校驗方式、停止位等都設定一下,具體引數如下圖所示,相關內容的解釋會在下文中進行,
COMPIM設定

VIRTUAL TERMINAL設定

-
串口通信簡介:計算機系統內部,計算機與外設之間若要進行資料交換,則必須使用通信技術,
1)通信的基本方式有并行通信和串行通信兩種:并行通信資料傳送速率快,但需要耗費較多的資料線;串行通信只需要一對資料線,但傳輸速率較慢,
2)異步通信與同步通信:在異步通信中,資料通常以位元組為最小單位組成資料幀傳送,資料幀按照固定波特率通過發送端逐幀發送,接收端則逐幀接收,異步通信發送端與接收端采用不同的時鐘信號,一般來說,只要發送端和接收端的波特率誤差相差不超過1%就可以順利通信,同步通信與異步通信相比對雙方時鐘要求更高,
3)資料傳輸模式:單工模式、半雙工模式、全雙工模式,
本次專案中,我們采用串行異步通信方式, -
由于我們采用仿真的方式進行,還需要下載兩個軟體進行串口的模擬和串口的除錯,
Visual Serial Port Driver(簡稱VSPD),可在官網中進行下載,

串口除錯助手,我在論壇中下載(首次可能需要注冊),也可自行尋找下載,

-
打開VSPD,點擊“Add Pair”添加一對虛擬串口,這里添加的是
COM3和COM4,二者互相收發資料,

添加后可以在計算機的“設備管理器”中查看到虛擬串口如下,這里我們將單片機的串口設定為COM3,串口除錯助手的串口設定為COM4,

-
打開CubeMX,建立工程,點擊“Connectivity”串列中的“USART”進行串口配置,將Mode設定為
Asynchronous(異步),波特率設為19200Bits/s,字長設為8Bits,校驗設為None,停止位設為1,資料傳送設為Receive and Transmit(接收與發送),設定完成后,會看到右側的PA9和PA10引腳被自動設定為USART1_TX和USART1_RX,即USART1的發送端和接收端,

隨后,再點擊“NVIC Settings”,選中“USART global interrupt”,使能“Enabled”串口1的中斷功能,

-
點擊“Generator Code”生成Keil工程,
軟體撰寫
-
本次我們需要實作串口助手發送單位元組資料,單片機收到資料后交換高低4位,將新的資料通過串口發回串口助手,需要用到PWM相關函式其API檔案如下:
HAL_UART_Receive_IT 串口中斷接收設定函式,該函式再每次接收前都需要呼叫一次

HAL_UART_Transmit 串口資料發送函式

HAL_UART_RxCpltCallback 串口接收完畢回呼函式

-
點擊“Open Project”在Keil中打開工程,雙擊“main.c”檔案,
-
首先我們需要在main.c檔案中設定兩個全域變數,一個用于代表接收完畢的標志位,一個用于存放接收資料的陣列,
/* USER CODE BEGIN PV */ uint8_t rf = 0; //接收完畢標志位 uint8_t dat[1] = {0xab}; //用于存放接收資料的陣列 /* USER CODE END PV */然后,在
main函式中中插入代碼如下,打開串口1接收中斷/* USER CODE BEGIN 2 */ //打開串口1接收中斷,接收資料存入dat陣列,陣列長度為1 HAL_UART_Receive_IT(&huart1, dat, 1); /* USER CODE END 2 */隨后,在
/* USER CODE BEGIN 4 */和/* USER CODE END 4 */中插入接收完畢回呼函式代碼如下/* USER CODE BEGIN 4 */ //接收完畢回呼函式 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart==&huart1) //如果串口接收中斷完畢 { rf = 1; //接收完畢,標志位置1 } } /* USER CODE END 4 */最后,在
while(1)中插入代碼如下,進行高低4位的交換/* USER CODE BEGIN WHILE */ while (1) { uint8_t x; //中間變數x if(rf==1) //若接收完成 { rf = 0; //將標志位清0 x = dat[0]; //將接收的資料存入中間變數x dat[0]=(x<<4)|(x>>4); //高低4位互換 HAL_UART_Transmit(&huart1, dat, 1, 1); //由串口1發送存盤在dat陣列中的資料包,陣列長度為1,超時1ms HAL_UART_Receive_IT(&huart1, dat, 1); //接收前每次都需呼叫該函式 } /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */
聯合除錯
-
點擊運行,生成HEX檔案,
-
在Proteus中加載相應HEX檔案,點擊運行,
-
打開串口除錯助手“XCOM”,選擇
COM4,設定相應的波特率、停止位、資料位、奇偶校驗等,勾選“16進制顯示”和“16進制發送”,點擊“打開串口”,在發送框輸入“AB”,點擊“發送”,在Proteus中我們可以看到“VIRTUAL TERMINAL”接收到資料“AB”,同時再觀察串口除錯助手“XCOM”,可以看到接收視窗收到高低4位互換的資料“BA”,


注意
如果你發送“AB”1個位元組,接收到的卻有多個位元組:


因為0x0D、0x0A代表的分別是回車符號和換行符號,請查看是否在串口除錯助手“XCOM”中勾選了“發送新行”,取消勾選即可,
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/475699.html
標籤:其他
