我在设计一款通过串口来进行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);//更新编辑框内容
这个主要要看你上位机下位机协议的约定。
分为几次可能的原因:
单片机本身内存有限,所以不适合大量发送
便于纠错、容错
便于发送不定长度的数据
提高实时性
串口通信中,串口设备以及串口驱动程序都会有缓冲区来保存串口中发送过来的数据。
串口设备可以设置缓冲区中有多少个数据后,触发串口中断以通知串口驱动有数据进入。
当你从缓冲区读出数据时串口上不一定把所有的数据都接收完了。这个时候读回来的就是部分数据。
你需要通过多次读取以确保数据已经读完。
串口通信的接收程序的逻辑必须兼容对一帧数据的多次接收。
延时接收吧, 可能是串口的问题, 我在Qt中也会有这情况