USART串口

串口收发HEX数据包

发送:

  1. 先定义两个缓存区数组,只用于存放载荷数据uint8_t Serial_TxPacket[4] ;发送数组
    uint8_t Serial_RxPacket[4];接收数组
    uint8_t Serial_RxFlag; 收到一个数据包就置一个标志位
  2. 写一个sendpacket函数,自动发送含包头包尾的数据包 Serial_SendByte(0xFF); //包头
    Serial_SendArray(Serial_TxPacket, 4); //四位数据
    Serial_SendByte(0xFE); //包尾
  3. 填充缓存区数组接收:
    1.static uint8_t RxState = 0; //静态变量 接收状态
    2.状态0 等待包头
    if (RxState == 0) //如果s=0,等待包头
    {
    if (RxData == 0xFF) //如果接收到包头
    {
    RxState = 1; //接收到包头,状态为1
    pRxPacket = 0; //当第二个数据包来时,给第一次数据包数组清零
    }
    }
  4. 状态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. 状态1 判断包尾并接收数据else if (RxState == 1) //如果s=1,接收数据
    {
    if(RxData == '\r') //如果为包尾,跳转状态2
    {
    RxState = 2;
    }
    else //不是包尾,就接受数据
    {
    Serial_RxPacket[pRxPacket] = RxData;
    pRxPacket ++;
    }
    }
  2. 状态2

else if (RxState == 2) //如果s=2,等待包尾

{

if (RxData == '\n') //如果接收到包尾

{

RxState = 0; //状态置0

Serial_RxPacket[pRxPacket] = '\0'; //给数据最后加结束标志位,方便显示

Serial_RxFlag = 1; //接收数据包标志位

}

}


USART串口​_数组


USART串口​_数据_02



串口下载原理

在ROM 0x0800 0000 位置存储的是C语言编译后的程序代码

BOOTloader存储位置 ROM 0x1FFF F000 用途程序自我更新,串口下载