USART串口
串口收发HEX数据包
发送:
- 先定义两个缓存区数组,只用于存放载荷数据uint8_t Serial_TxPacket[4] ;发送数组
uint8_t Serial_RxPacket[4];接收数组
uint8_t Serial_RxFlag; 收到一个数据包就置一个标志位 - 写一个sendpacket函数,自动发送含包头包尾的数据包 Serial_SendByte(0xFF); //包头
Serial_SendArray(Serial_TxPacket, 4); //四位数据
Serial_SendByte(0xFE); //包尾 - 填充缓存区数组接收:
1.static uint8_t RxState = 0; //静态变量 接收状态
2.状态0 等待包头
if (RxState == 0) //如果s=0,等待包头
{
if (RxData == 0xFF) //如果接收到包头
{
RxState = 1; //接收到包头,状态为1
pRxPacket = 0; //当第二个数据包来时,给第一次数据包数组清零
}
} - 状态1 接受数据 else if (RxState == 1) //如果s=1,接收数据
{
Serial_RxPacket[pRxPacket] = RxData; //存入接受缓存数组
pRxPacket ++; //下标+1,存下一个
if (pRxPacket >= 4) //如果四个数据接收完毕,就切换状态 {
RxState = 2; //状态置2
}
4.状态2等待包尾
else if (RxState == 2) //如果s=2,等待包尾
{ if (RxData == 0xFE) //接收到包尾
{ RxState = 0; //状态置0
Serial_RxFlag = 1; //一个数据包接受完毕,接收标志位置1 } }
5:显示数组里面的结果OLED_ShowHexNum(uint8_t Serial_RxPacket[0-3]);
串口收发文本数据包
1 发送
2接收
1char Serial_RxPacket[100]; 数组长度设置多一点,防止超出
2.状态0 等待包头
if (RxState == 0) //如果s=0,等待包头
{
if (RxData == ‘@’) //如果接收到包头
{ RxState = 1; //接收到包头,状态为1
pRxPacket = 0; //当第二个数据包来时,给第一次数据包数组清零 } }
- 状态1 判断包尾并接收数据else if (RxState == 1) //如果s=1,接收数据
{
if(RxData == '\r') //如果为包尾,跳转状态2
{
RxState = 2;
}
else //不是包尾,就接受数据
{
Serial_RxPacket[pRxPacket] = RxData;
pRxPacket ++;
}
} - 状态2
else if (RxState == 2) //如果s=2,等待包尾
{
if (RxData == '\n') //如果接收到包尾
{
RxState = 0; //状态置0
Serial_RxPacket[pRxPacket] = '\0'; //给数据最后加结束标志位,方便显示
Serial_RxFlag = 1; //接收数据包标志位
}
}
串口下载原理
在ROM 0x0800 0000 位置存储的是C语言编译后的程序代码
BOOTloader存储位置 ROM 0x1FFF F000 用途程序自我更新,串口下载