艾特我 2022-02-08 18:15 采纳率: 50%
浏览 38
已结题

52单片机接收0x0d 0x0a缺失,发送端发送了0x0d 0x0a,能收到0x0d但是收不到0x0a,Receive_State总是被置0

使用proteus8.9仿真时,遇到一个奇怪的Bug:发送端发送了0x0d 0x0a,能52只收到0x0d但是收不到0x0a,当校验是否收到
0x0a时Receive_State总是被置0,导致无法接收到完整字符串,如果屏蔽掉校验就能正常使用,很费解。

unsigned char Receive_State=0; //0-5位:长度位  第7位:接受完成标志位  第6位:\r0x0d接受完成标志位
unsigned char Receivr_Buff[30];// 串口接受缓存,最多接受30个字符

void Usart_Serial() interrupt 4
{
    unsigned char Buff_byte;
    ES = 0; //关闭串行中断
    if(RI == 1)
    {
        RI = 0; //清除串行接受标志位
        Buff_byte = SBUF; //从串口缓冲区接收数据
        if((Receive_State&0x80) == 0) // 接收未完成
        {
            if((Receive_State&0x40)) // 接收到了0x0d
            {
//                if(Buff_byte != 0x0a) // 接收错误重新接收  /*Bug发送端发送了0x0d 0x0a,但是收不到0x0a,Receive_State总是被置0*/
//                    Receive_State=0;
//                else
                {
                    Receive_State|=0x80; // 接收完成
                    Receivr_Buff[Receive_State&0X3F] = '\0';
                }
                
            }
            else // 未接收到0x0d
            {
                if(Buff_byte == 0x0d)
                    Receive_State|=0x40;
                else
                {
                    Receivr_Buff[Receive_State&0x3F] = Buff_byte;
                    Receive_State++;
                }
            }
        }
    }
    ES = 1; // 允许串口中断
}
  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 2月16日
    • 创建了问题 2月8日

    悬赏问题

    • ¥15 联想笔记本开机出现系统更新界面
    • ¥15 各位帮帮我 我不想重做系统
    • ¥30 微信小程序蓝牙数据透传
    • ¥15 加氢站氢负荷数据集来源
    • ¥15 umi接入sentry遇到问题
    • ¥15 HBuilderX打包H5网页,扫码模块无法使用
    • ¥15 Javascript跳转页面后,无法执行后面代码,如何解决?
    • ¥15 echarts绘制图表
    • ¥15 请教两个关于高德地图定位不准的技术问题
    • ¥15 根据企业名称 对照两个文件 样本筛选/匹配