白菜的记录工具 2020-08-28 18:05 采纳率: 100%
浏览 793
已采纳

为什么在进行串口通信时,有时候外部信息发送过来时会分成两次进行发送?

我在设计一款通过串口来进行AT指令交互时,遇到了一个指令响应回复被分为两次发送回来。

图片说明

很明显,在+CREG后方会跟着两个数字以及”OK“,但是它回复过来的信息却缺少了一部分,等到第二次才回复过来,

图片说明

我想知道这是什么原因,另附我串口接收部分的代码

// TODO: 在此处添加消息处理程序代码
    VARIANT variant_inp;//VARIANT是一种特殊的数据类型,除了定长String数据及用户定义类型以外,可以包括任何种类的数据。
    COleSafeArray safearray_inp;
    LONG len,k;
    BYTE rxdata[20480];//设置BYTE数组
    CString strtemp;
    CString strLog = _T("");
    if(m_MscommCtrl.get_CommEvent() == 2)//事件值为二表示接收缓冲区内有字符
    {   ////////以下你可以根据自己的通信协议加入处理代码
        variant_inp = m_MscommCtrl.get_Input();  //读缓冲区
        safearray_inp = variant_inp;//VARIANT型变量转换为ColeSafeArray型变量
        len = safearray_inp.GetOneDimSize();//得到有效数据长度
        for(k = 0;k < len;k++)
        {
            safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
        }
        for(k = 0;k < len;k++)//将数组转换为CString型变量
        {
            BYTE bt = *(char*)(rxdata+k);//字符型
            strtemp.Format(_T("%c"),bt);//将字符送入临时变量strtemp存放
            m_EditRxData += strtemp;//加入接受编辑框对应字符串
            strLog += strtemp;
        }
        Savelog(strLog);
    }
    UpdateData(false);//更新编辑框内容
  • 写回答

3条回答 默认 最新

  • threenewbee 2020-08-28 18:15
    关注

    这个主要要看你上位机下位机协议的约定。
    分为几次可能的原因:
    单片机本身内存有限,所以不适合大量发送
    便于纠错、容错
    便于发送不定长度的数据
    提高实时性

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵