現在我們再網上找了一個小小的例子,我們可以綜合做一下:
首先:上電后LED1和LED2點亮,然后熄滅,高電平點亮(根據開發板電路來進行設定,比如野火的開發板就是低電平點亮的,)
之后,上電后,開發板向串口發送“hello world”
在然后,LED1進行一個秒閃燈,再字符發送完成后,開始每0.5秒一次的一個回圈,并且啟動時間的一個記錄:“XX : XX : XX”
最后,通過輸入0xF1這類似的格式,設定一個命令,使得我輸入命令后,LED2可以開關,
比如0XA1開LED2
再比如0XA2關LED24
然后會回傳“XX : XX :XX”的信號,
首先我們需要學習一個新的東西,叫做sprintf();
主要用于字串的格式化,可以用于把格式化的資料寫入某個字串中,
因為我自己的學習,總是把C++和C有寫語法搞混,所以說,需要進行一定的區別,
要用這個函式的話,需要用到#include <stdio.h>
一般來說,使用sprintf();
Int sprintf(char *string,char*format,[argument……]);
比如說,有一個表示溫度的TMP,要將其格式化為字串“溫度是:XX攝氏度”,并且將它輸入出去,就需要先進行定義,然后格式化輸入
Uint8_t Str_buff[64];
Sprintf((char*)Str_buff,”溫度是:%d攝氏度”,TMP);
HAL_UART_Transmit(&huart1,Str_buff,sizeof(Str_buff),0xFF);
那么接下來,我把調整過的回呼函式和主函式里的內容給大家展示在下面,
#include "main.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"
#include "stdio.h"
void SystemClock_Config(void);
#define LED1_ON HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_RESET)
#define LED1_OFF HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET)
#define LED2_ON HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_RESET)
#define LED2_OFF HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_SET)
#define LED1_TOG HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2);
#define LED2_TOG HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3);
uint8_t str1[]="===================welcome=====================\r\n";
uint8_t hh = 0,mm = 0,ss = 0,ss05 = 0;
uint8_t str_buff[64];//字串緩沖陣列
uint8_t Rx_data[16];
/*一些函式的定義*/
void CheckLED()
{
LED1_ON;
HAL_Delay(500);
LED2_ON;
HAL_Delay(500);
LED1_OFF;
HAL_Delay(500);
LED2_OFF;
HAL_Delay(500);
}
/*定時器的回呼函式撰寫,主要是計算時間的*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
LED1_TOG;
ss05++;
if(ss05==2){
ss05=0;
ss++;
if(ss==60){
ss=0;
mm++;
if(mm==60){
mm=0;
hh++;
}
}
}
}
/*串口接收的回呼函式*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
if(Rx_data[0] == 0xBF && Rx_data[2] == 0xFB)
{
switch(Rx_data[1])
{
case 0xa1:
LED2_ON;
sprintf((char*)str_buff,"%d:%d:%d LED2 OPEN!!!\r\n",hh,mm,ss);
break;
case 0xa2:
LED2_OFF;
sprintf((char*)str_buff,"%d:%d:%d LED2 OFF!!!\r\n",hh,mm,ss);
break;
default:
sprintf((char*)str_buff,"%d:%d:%d 這是錯噠!\r\n",hh,mm,ss);
break;
}
HAL_UART_Transmit(&huart1,str_buff,sizeof(str_buff),10000);
HAL_UART_Receive_IT(&huart1,Rx_data,3);
}
}
}
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM2_Init();
MX_USART1_UART_Init();
/* 開機燈的閃爍 */
CheckLED();
/* 阻塞式發送 */
HAL_UART_Transmit(&huart1,str1,sizeof(str1),10000);//阻塞式串口發送
/*非阻塞式接收*/
HAL_UART_Receive_IT(&huart1,Rx_data,3);
/* 打開定時器2 */
HAL_TIM_Base_Start_IT(&htim2);
while (1)
{
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/323226.html
標籤:其他
