STM32-串口收发HEX,文本数据包

1.HEX数据包

2.文本数据包

 3.HEX数据包接收思路

4.文本数据包接收思路

 

5.接发HEX数据包代码

前面的定义部分不需要改变,首先写我们发送数据包的代码

void Serial_SendPacket(uint8_t *Packet)
{
	Serial_SendByte(0xff);//发送包头
	Serial_SendArray(Packet,4);//发送数据
	Serial_SendByte(0xfe);//发送包尾
}

 然后我们使用状态机的方法写接收数据包的代码

void USART1_IRQHandler(void)
{
	static uint8_t Rx_stat=0;
	static uint8_t stat=0;
	if(USART_GetITStatus(USART1,USART_IT_RXNE) == SET)//判断是否为接收中断
	{
		Serial_Data = USART_ReceiveData(USART1);
		if(Rx_stat == 0)
		{
			if(Serial_Data == 0xff)
			{
				Rx_stat=1;
			}
		}
		else if(Rx_stat == 1)
		{
			Serial_RxPacket[stat]=Serial_Data;
			stat++;
			if(stat>=4)
			{
				Rx_stat=2;
				stat=0;
			}
		}
		else if(Rx_stat == 2)
		{
			if(Serial_Data == 0xfe)
			{
				Rx_stat=0;
				Serial_RXFlag=1;
			}
		}
		USART_ClearITPendingBit(USART1,USART_IT_RXNE);
	}
}

6.接发文本数据包

void USART1_IRQHandler(void)
{
	static uint8_t Rx_stat=0;
	static uint8_t stat=0;
	if(USART_GetITStatus(USART1,USART_IT_RXNE) == SET)//判断是否为接受中断
	{
		Serial_Data = USART_ReceiveData(USART1);
		if(Rx_stat == 0)
		{
			if(Serial_Data == '@' && Serial_RXFlag == 0)
			{
				Rx_stat=1;
				stat=0;
			}
		}
		else if(Rx_stat == 1)
		{
			if(Serial_Data == '\r')
			{
				Rx_stat =2;
			}
			else
			{
				Serial_RxPacket[stat]=Serial_Data;
				stat++;
			}
		}
		else if(Rx_stat == 2)
		{
			if(Serial_Data == '\n')
			{
				Rx_stat=0;
				Serial_RxPacket[stat]='\0';
				Serial_RXFlag=1;
			}
		}
		USART_ClearITPendingBit(USART1,USART_IT_RXNE);
	}
}

通过比较接收到的数据包与特定字符串相同的字符串时,启动特定的能力。STRCMP函数。 

int main(void)
{
	Serial_Init();
	OLED_Init();
	LED_Init();
	OLED_ShowString(1,1,"TXPacket:");
	OLED_ShowString(3,1,"RXPacket:");
	while(1)
	{
		if(Serial_GetRxFlag() == 1)
		{
			OLED_ShowString(4,1,"             ");
			OLED_ShowString(4,1,Serial_RxPacket);
		
			if(strcmp(Serial_RxPacket,"LED_ON")==0)
			{
				LED1_ON();
				Serial_SendString("LED_ON_OK\r\n");
				OLED_ShowString(2,1,"             ");
				OLED_ShowString(2,1,"LED_ON_OK");
			}
			else if(strcmp(Serial_RxPacket,"LED_OFF")==0)
			{
				LED1_OFF();
				Serial_SendString("LED_OFF_OK\r\n");
				OLED_ShowString(2,1,"             ");
				OLED_ShowString(2,1,"LED_OFF_OK");
			}
			else
			{
				Serial_SendString("ERROR_COMMANE\r\n");
				OLED_ShowString(2,1,"             ");
				OLED_ShowString(2,1,"ERROR_COMMANE");
			}
			Serial_RXFlag=0;
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值