STM32 串口收发数据包

接线图

HEX数据包接收

文本数据包接收

代码配置

发送HEX数据包

cs 复制代码
//存储发送或接收的载荷数据
uint8_t TX_Packet[4];
uint8_t RX_Packet[4];

void Serial_SendPacket(void)
{
	Serial_SendByte(0xFF);//发送包头
	Serial_SendArray(TX_Packet, 4);//发送4个载荷数据
	Serial_SendByte(0xFE);//发送包尾
	
	
}

主函数

cs 复制代码
#include "USART.h"
int main(void)
{
	OLED_Init();
	USART_Config();
	TX_Packet[0] = 0x01;
	TX_Packet[1] = 0x02;
	TX_Packet[2] = 0x03;
	TX_Packet[3] = 0x04;
	Serial_SendPacket();
	while(1)
	{
		
		
	}
	
	
}

接收HEX数据包

需要在中断函数里写

cs 复制代码
//存储发送或接收的载荷数据
uint8_t TX_Packet[4];
uint8_t RX_Packet[4];

//中断函数
void USART1_IRQHandler(void)
{
	static uint8_t RX_State = 0;
	static uint8_t pRX_Packet = 0;
	//判断中断标志位
	if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
	{
		RX_Data = USART_ReceiveData(USART1);//读取数据寄存器,并存放在数据变量里
		if(RX_State == 0)
		{
			//如果接收到了包头
			if(RX_Data == 0xFF)
			{
				RX_State = 1;
				pRX_Packet = 0;
			}
		}
		else if(RX_State == 1)
		{
			RX_Packet[pRX_Packet] = RX_Data;//将RX_Data存在接收数组里
			pRX_Packet++;
			if(pRX_Packet >= 4)
			{
				RX_State = 2;
			}
		}
		else if(RX_State == 2)
		{
			//判断是不是包尾
			if(RX_Data == 0xFE)
			{
				RX_State = 0;
				RX_Flag = 1;//标志位置1
			}
		}
		
		//清除标志位
		USART_ClearITPendingBit(USART1, USART_IT_RXNE);
	}
	
}

主函数

cs 复制代码
#include "USART.h"
int main(void)
{
	OLED_Init();
	USART_Config();
	TX_Packet[0] = 0x01;
	TX_Packet[1] = 0x02;
	TX_Packet[2] = 0x03;
	TX_Packet[3] = 0x04;
	Serial_SendPacket();
	while(1)
	{
		if(Serial_GetRXFlag() == 1)
		{
			OLED_ShowHexNum(1, 1, RX_Packet[0], 2);
			OLED_ShowHexNum(1, 4, RX_Packet[1], 2);
			OLED_ShowHexNum(1, 7, RX_Packet[2], 2);
			OLED_ShowHexNum(1, 10,RX_Packet[3], 2);
		}
		
	}
	
	
}

按键控制

cs 复制代码
int main(void)
{
	KEY_Init();
	OLED_Init();
	USART_Config();
	TX_Packet[0] = 0x01;
	TX_Packet[1] = 0x02;
	TX_Packet[2] = 0x03;
	TX_Packet[3] = 0x04;
	OLED_ShowString(1, 1, "TXPacket");
	OLED_ShowString(3, 1, "RXPacket");
	while(1)
	{
		if(KEY_Scanf(GPIOB, GPIO_Pin_0) == 1)
		{
				TX_Packet[0]++;
				TX_Packet[1]++;
				TX_Packet[2]++;
				TX_Packet[3]++;
				Serial_SendPacket();
			OLED_ShowHexNum(2, 1, TX_Packet[0], 2);
			OLED_ShowHexNum(2, 4, TX_Packet[1], 2);
			OLED_ShowHexNum(2, 7, TX_Packet[2], 2);
			OLED_ShowHexNum(2, 10,TX_Packet[3], 2);
		}
		if(Serial_GetRXFlag() == 1)
		{
			OLED_ShowHexNum(4, 1, RX_Packet[0], 2);
			OLED_ShowHexNum(4, 4, RX_Packet[1], 2);
			OLED_ShowHexNum(4, 7, RX_Packet[2], 2);
			OLED_ShowHexNum(4, 10,RX_Packet[3], 2);
		}
		
	}

发送与接收文本数据包

cs 复制代码
char RX_Packet2[100];

//中断函数
void USART1_IRQHandler(void)
{
	static uint8_t RX_State = 0;
	static uint8_t pRX_Packet = 0;
	//判断中断标志位
	if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
	{
		RX_Data = USART_ReceiveData(USART1);//读取数据寄存器,并存放在数据变量里
		if(RX_State == 0)
		{
			//如果接收到了包头
			if(RX_Data == '@' && RX_Flag == 0)
			{
				RX_State = 1;
				pRX_Packet = 0;
			}
		}
		else if(RX_State == 1)
		{
			//判断是不是第一个包尾
			if(RX_Data == '\r')
			{
				RX_State = 2;
			}
			else
			{
				RX_Packet2[pRX_Packet] = RX_Data;//将RX_Data存在接收数组里
				pRX_Packet++;
			}
		}
		else if(RX_State == 2)
		{
			//判断是不是第二个包尾
			if(RX_Data == '\n')
			{
				RX_State = 0;
				RX_Packet2[pRX_Packet] = '\0';//加结束标志位
				RX_Flag = 1;//标志位置1
			}
		}
		
		//清除标志位
		USART_ClearITPendingBit(USART1, USART_IT_RXNE);
	}
	
}

主函数:

cs 复制代码
int main(void)
{
	
	OLED_Init();
	LED_Init();
	USART_Config();
	OLED_ShowString(1, 1, "TXPacket");
	OLED_ShowString(3, 1, "RXPacket");
	while(1)
	{
		if(RX_Flag == 1)
		{
			OLED_ShowString(4, 1, "            ");
			OLED_ShowString(4, 1, RX_Packet2);
			
			if(strcmp(RX_Packet2, "LED_ON") == 0)
			{
				LED2(0);
				Serial_SendString("LED_ON_OK\r\n");
				OLED_ShowString(2, 1, "           ");
				OLED_ShowString(2, 1, "LED_ON_OK");
			}
			else if(strcmp(RX_Packet2, "LED_OFF") == 0)
			{
				LED2(1);
				Serial_SendString("LED_OFF_OK\r\n");
				OLED_ShowString(2, 1, "            ");
				OLED_ShowString(2, 1, "LED_OFF_OK");
			}
			else
			{
				Serial_SendString("ERROR_COMMAND\r\n");
				OLED_ShowString(2, 1, "              ");
				OLED_ShowString(2, 1, "ERROR_COMMAND");
			}
			RX_Flag = 0;
		}
		
	}
	
	
}
相关推荐
亿道电子Emdoor8 分钟前
【Arm】MDK查看语句的执行累积时间和次数
stm32·单片机·物联网
l3538o6757316 分钟前
国产POE降压恒压芯片方案选型:48v-52v输入转5v-12v/1-3A电源芯片
人工智能·科技·单片机·嵌入式硬件·电脑·智能家居
JSMSEMI1118 分钟前
SC6D10170H-JSM 碳化硅肖特基二极管
stm32·单片机·嵌入式硬件
roman_日积跬步-终至千里33 分钟前
【Starrocks】StarRocks 排错:`Invalid method name: ‘heartbeat‘`(BE 心跳端口/协议错误)
服务器·网络·php
想不出名字ಥ_ಥ35 分钟前
STM32学习笔记--01学会如何点亮一颗LED灯
笔记·stm32·学习
松涛和鸣1 小时前
34、 Linux IPC进程间通信:无名管道(Pipe) 和有名管道(FIFO)
linux·服务器·c语言·网络·数据结构·数据库
叽里咕噜怪1 小时前
Ansible Playbook 从入门到精通:零基础玩转自动化部署与配置管理
网络·自动化·ansible
小虾米vivian1 小时前
dmetl5 web管理平台 监控-流程监控 看不到运行信息
linux·服务器·网络·数据库·达梦数据库
老蒋新思维1 小时前
创客匠人:从个人IP到知识变现,如何构建可持续的内容生态?
大数据·网络·人工智能·网络协议·tcp/ip·创客匠人·知识变现
点灯小铭1 小时前
基于单片机的智能传送带自动计数与数据管理系统设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业