接线图
![](https://i-blog.csdnimg.cn/direct/7d99c67c6a344bbe9d30093295405e2f.png)
![](https://i-blog.csdnimg.cn/direct/597051b5eb2a4372a1c034f571c83dde.png)
HEX数据包接收
![](https://i-blog.csdnimg.cn/direct/14ab5e9d4464495db869f4ea9c6ed4da.png)
文本数据包接收
![](https://i-blog.csdnimg.cn/direct/0bac086ddd9348ebb73c2b07f8cbbd9b.png)
代码配置
发送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)
{
}
}
![](https://i-blog.csdnimg.cn/direct/5c9693c1ff874da2ad6b21558a0ae94a.png)
接收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);
}
}
}
![](https://i-blog.csdnimg.cn/direct/e0363ea3c7024748a0007ef16c60244b.png)
![](https://i-blog.csdnimg.cn/direct/85f8cf38ff4247e2a93522564baa8691.jpeg)
按键控制
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;
}
}
}
![](https://i-blog.csdnimg.cn/direct/4c7dcfd5524b47baa5bf3acefa020fb8.png)
![](https://i-blog.csdnimg.cn/direct/ccc3d3d2fcc6494db0a2dbc5ea3cba79.jpeg)
![](https://i-blog.csdnimg.cn/direct/7b97feff90804e069165937f987e8da5.png)
![](https://i-blog.csdnimg.cn/direct/42ae2a87520b4da7a36c546019a637aa.jpeg)
![](https://i-blog.csdnimg.cn/direct/89eafeaf27634e058df3c3b04ec1d9b2.png)
![](https://i-blog.csdnimg.cn/direct/8a4e67ba6bc6406493bb63a47ee3b607.jpeg)