▼點(diǎn)擊下方名片亚侠,關(guān)注公眾號性置,獲取更多精彩內(nèi)容▼
![](http://www.kinghanhotel.com/skin/qiye/image/lazy.gif)
歡迎關(guān)注【玩轉(zhuǎn)單片機(jī)與嵌入式】公眾號扎狱,回復(fù)關(guān)鍵字獲取更多免費(fèi)視頻和資料
回復(fù)【加群】侧到,【單片機(jī)】、【STM32】淤击、【硬件知識】匠抗、【硬件設(shè)計(jì)】、【經(jīng)典電路】污抬、【論文】汞贸、【畢業(yè)設(shè)計(jì)】、【3D封裝庫】印机、【PCB】矢腻、【電容】、【TVS】射赛、【阻抗匹配】多柑、【資料】、【終端電阻】楣责、【Keil】平俘、【485】、【CAN】玻温、【振蕩器】猴豁、[USBCAN]、【PCB】级闭、【智能手環(huán)】悲碰、【智能家居】、【智能小車】茄妇、【555】昌嘶、【I2C】、【華為】晨丸、【中興】诱榴,等……
![](http://www.kinghanhotel.com/skin/qiye/image/lazy.gif)
一:第一次命令輸入
![](http://www.kinghanhotel.com/skin/qiye/image/lazy.gif)
#include "stm32f4xx_hal.h"
#define PACKET_START_BYTE 0x7E
#define PACKET_END_BYTE 0x7E
#define MAX_PACKET_SIZE 20 // 最大數(shù)據(jù)包大小秧秉,根據(jù)實(shí)際情況調(diào)整
typedef struct {
uint8_t device_address;
uint8_t command;
uint8_t data_length;
uint8_t data[MAX_PACKET_SIZE];
uint8_t checksum;
uint8_t is_valid;
} SerialPacket;
SerialPacket received_packet;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
static uint8_t buffer[MAX_PACKET_SIZE];
static uint8_t buffer_index = 0;
static uint8_t is_inside_packet = 0;
if (huart == &huart2) {
if (!is_inside_packet) {
if (buffer_index == 0 && received_byte == PACKET_START_BYTE) {
is_inside_packet = 1;
buffer[buffer_index++] = received_byte;
}
} else {
buffer[buffer_index++] = received_byte;
if (buffer_index >= 4) {
uint8_t data_length = buffer[3] - 2; // 計(jì)算數(shù)據(jù)區(qū)長度(不包括校驗(yàn)和和包尾)
if (buffer_index == (data_length + 6)) { // 收到完整的數(shù)據(jù)包
received_packet.device_address = buffer[1];
received_packet.command = buffer[2];
received_packet.data_length = data_length;
for (int i = 0; i < data_length; i++) {
received_packet.data[i] = buffer[4 + i];
}
received_packet.checksum = buffer[data_length + 4];
received_packet.is_valid = 1;
// 處理接收到的數(shù)據(jù)包褐桌,例如執(zhí)行相應(yīng)的命令
// ...
// 復(fù)位接收緩沖區(qū)和狀態(tài)
buffer_index = 0;
is_inside_packet = 0;
}
}
}
HAL_UART_Receive_IT(&huart2, &received_byte, 1); // 啟動下一次接收中斷
}
}
int main(void) {
// 初始化HAL庫和串口2
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART2_UART_Init();
// 啟動接收中斷
HAL_UART_Receive_IT(&huart2, &received_byte, 1);
while (1) {
// 在這里可以執(zhí)行其他任務(wù)
// ...
}
}
![](http://www.kinghanhotel.com/skin/qiye/image/lazy.gif)
二:第二次命令輸入
![](http://www.kinghanhotel.com/skin/qiye/image/lazy.gif)
UART_HandleTypeDef huart2;
typedef struct {
uint8_t device_address;
uint8_t command;
uint8_t data_length;
uint8_t data[MAX_PACKET_SIZE];
uint8_t checksum;
uint8_t is_valid;
} SerialPacket;
SerialPacket received_packet;
// 接收緩沖區(qū)
uint8_t rx_buffer[MAX_PACKET_SIZE];
uint8_t rx_buffer_index = 0;
uint8_t is_inside_packet = 0;
void process_received_data() {
// 在這里可以解析和處理接收到的數(shù)據(jù)包
// 訪問 received_packet 中的數(shù)據(jù)進(jìn)行解析
// 例如,你可以根據(jù) received_packet.command 執(zhí)行相應(yīng)的操作
// ...
// 清除接收緩沖區(qū)园湘,準(zhǔn)備接收下一個(gè)數(shù)據(jù)包
memset(rx_buffer, 0, sizeof(rx_buffer));
rx_buffer_index = 0;
is_inside_packet = 0;
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
if (huart == &huart2) {
if (!is_inside_packet) {
if (rx_buffer_index == 0 && rx_buffer[0] == PACKET_START_BYTE) {
is_inside_packet = 1;
}
} else {
rx_buffer[rx_buffer_index++] = received_byte;
if (rx_buffer_index >= 4) {
uint8_t data_length = rx_buffer[3] - 2; // 計(jì)算數(shù)據(jù)區(qū)長度(不包括校驗(yàn)和和包尾)
if (rx_buffer_index == (data_length + 6)) { // 收到完整的數(shù)據(jù)包
received_packet.device_address = rx_buffer[1];
received_packet.command = rx_buffer[2];
received_packet.data_length = data_length;
for (int i = 0; i < data_length; i++) {
received_packet.data[i] = rx_buffer[4 + i];
}
received_packet.checksum = rx_buffer[data_length + 4];
received_packet.is_valid = 1;
process_received_data(); // 處理接收到的數(shù)據(jù)包
// 啟動下一次接收中斷
HAL_UART_Receive_IT(&huart2, rx_buffer, 1);
}
}
}
}
}
int main(void) {
// 初始化HAL庫和串口2
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART2_UART_Init();
// 啟動接收中斷
HAL_UART_Receive_IT(&huart2, rx_buffer, 1);
while (1) {
// 在這里可以執(zhí)行其他任務(wù)
// ...
}
}
![](http://www.kinghanhotel.com/skin/qiye/image/lazy.gif)
三:總結(jié)及應(yīng)對挑戰(zhàn)
![](http://www.kinghanhotel.com/skin/qiye/image/lazy.gif)
其中一條:持續(xù)學(xué)習(xí)和更新技能烦租,在任何時(shí)代延赌、任何領(lǐng)域都是保持自身競爭力的手段之一。比如:關(guān)注小編的公眾號叉橱,一起學(xué)習(xí)挫以、一起成長。比如加入小編的微信及技術(shù)交流群窃祝,與高手一起學(xué)習(xí)掐松。
END
![](http://www.kinghanhotel.com/skin/qiye/image/lazy.gif)
![](http://www.kinghanhotel.com/skin/qiye/image/lazy.gif)
掃描上方二維碼加群殴蹄,回復(fù)【加群】或掃碼加我好友,限時(shí)免費(fèi)進(jìn)入技術(shù)交流群侄侨。
![](http://www.kinghanhotel.com/skin/qiye/image/lazy.gif)
推薦閱讀![](http://www.kinghanhotel.com/skin/qiye/image/lazy.gif)
END
![](http://www.kinghanhotel.com/skin/qiye/image/lazy.gif)
![](http://www.kinghanhotel.com/skin/qiye/image/lazy.gif)
掃描上方二維碼加群殴蹄,回復(fù)【加群】或掃碼加我好友,限時(shí)免費(fèi)進(jìn)入技術(shù)交流群侄侨。
![](http://www.kinghanhotel.com/skin/qiye/image/lazy.gif)
![](http://www.kinghanhotel.com/skin/qiye/image/lazy.gif)
![](http://www.kinghanhotel.com/skin/qiye/image/lazy.gif)
感謝大家閱讀兄哮,如果喜歡
請點(diǎn)贊和“在看”吧,或者分享到朋友圈气凫。
點(diǎn)擊跳轉(zhuǎn)到原文参匀,限時(shí)優(yōu)惠加入我們的知識星球(加好友獲取免費(fèi)券)