接收一段报文
有报头0x81
数据长度0x01或0x02
指令名0x9?
数据 1~2位
bcc验证 1位
void USART1_IRQHandler(void) //串口中断服务函数
{
static uint8_t RxState = 0;//状态步
static uint8_t count = 0;//接收计数
if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
{
uint8_t RxData = USART_ReceiveData(USART1);
if (RxState == 0)
{
if (RxData == 0x81)
{
RxState = 1; count = 0;
}
else
{
RxState = 0;
}
}
else if (RxState == 1)
{
Serial_Length = RxData; RxState = 2;
}
else if (RxState == 2)
{
Serial_RxPacket[count] = RxData; count++;
if(count == Serial_Length)
{
RxState = 3;
}
}
else if (RxState == 3)
{
Serial_RxPacket[count] = RxData; count++;
if(count > Serial_Length)
{
RxState = 0; Serial_RxFlag = 1;
}
}
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
}
}
主循环里一直通过OLED显示数据位的2个数
接收的是16进制,显示10进制
while (1)
{
if (Serial_GetRxFlag() == 1)
{
if(Serial_Length == 0x02)
{
OLED_ShowNum(1, 10,Serial_RxPacket[2], 4);
OLED_ShowNum(2, 10,Serial_RxPacket[1], 4);
}
}
}
利用串口助手发送数据,实际接收后发现总要发送2-3次才能刷新数据,并且数据位修改后第一次发送会出现乱码
希望能指导一下如何修改
排查问题分两步走。第一先排查串口,你改个程序,串口调试助手发送数据,32收到数据后立马回发,验证下你串口收发程序和硬件。如果这样都有问题,你用示波器打下串口转换芯片靠32这测的收发看数据是否正常。排除虚焊可能。 硬件没问题就看看你的串口收发程序,你用库应该问题不大。 最后单独看看你显示程序是否有异常。按这个思路排查!
不知道你这个问题是否已经解决, 如果还没有解决的话: