用mfc里MSComm控件写简单收发串口工具,但发送数据长于10时,第十一位接收端显示会丢失,请教大神帮忙!
如图,通过串口向设备下命令,只有命令长度大于11位,第11/12(11居多)位在接收端总是显示没有收到,看起来好像是被覆盖的感觉。程序如下initial函数里里面:if(...
如图,通过串口向设备下命令,只有命令长度大于11位,第11/12(11居多)位在接收端总是显示没有收到,看起来好像是被覆盖的感觉。
程序如下
initial函数里里面:
if(m_cComm.GetPortOpen())//如果发现串口本来是打开的,则关闭串口
m_cComm.SetPortOpen(FALSE);
m_cComm.SetCommPort(m_COMNum);//选择COM-n端口
m_cComm.SetInputMode(1);//输入方式为二进制方式
m_cComm.SetInBufferSize(1024);//设置输入缓冲区
m_cComm.SetOutBufferSize(1024);//设置输出缓冲区
m_cComm.SetSettings("115200,n,8,1");//波特率115200,无校验,8个数据位,1个停止位
if(!m_cComm.GetPortOpen())
{
m_cComm.SetPortOpen(TRUE);//打开串口
m_cComm.SetRThreshold(1);//每当接收缓冲区有1个字符则接收串口数据
m_cComm.SetInputLen(0);//设置当前缓冲区长度为0
m_cComm.GetInput();//预读缓冲区以清除残留数据
}
else
AfxMessageBox("打开端口失败!",MB_ICONSTOP,0);
发送数据函数里:
UpdateData(true);//读取编辑框内容
CString str="\r";
m_cComm.SetOutput(COleVariant(m_strSendData+str));//发送数据
m_strSendData.Empty();//发送后清空输入框
UpdateData(false);//更新编辑框内容
OnComm函数里:
//从串口接收数据并显示在编辑框中
VARIANT variant_inp;
COleSafeArray safearray_inp;
long len,k;
byte rxdata[2048];//设置BYTE数组
CString strtemp;
if(m_cComm.GetCommEvent()==2)//值为2表示接收缓冲区内有字符
{
variant_inp=m_cComm.GetInput();//读缓冲区消息
safearray_inp=variant_inp;///变量转换
len=safearray_inp.GetOneDimSize();//得到有效的数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);
for(k=0;k<len;k++)//将数组转换为CString型变量
{
char bt=*(char*)(rxdata+k);//字符型
strtemp.Format("%c",bt);//将字符送入临时变量strtemp存放
m_strRecvData+=strtemp;//加入接收编辑框对应字符串
}
}
CString temp=("\r\n");//显示完成后要自动换行
m_strRecvData+=temp;
UpdateData(FALSE);//更新编辑框内容 展开
程序如下
initial函数里里面:
if(m_cComm.GetPortOpen())//如果发现串口本来是打开的,则关闭串口
m_cComm.SetPortOpen(FALSE);
m_cComm.SetCommPort(m_COMNum);//选择COM-n端口
m_cComm.SetInputMode(1);//输入方式为二进制方式
m_cComm.SetInBufferSize(1024);//设置输入缓冲区
m_cComm.SetOutBufferSize(1024);//设置输出缓冲区
m_cComm.SetSettings("115200,n,8,1");//波特率115200,无校验,8个数据位,1个停止位
if(!m_cComm.GetPortOpen())
{
m_cComm.SetPortOpen(TRUE);//打开串口
m_cComm.SetRThreshold(1);//每当接收缓冲区有1个字符则接收串口数据
m_cComm.SetInputLen(0);//设置当前缓冲区长度为0
m_cComm.GetInput();//预读缓冲区以清除残留数据
}
else
AfxMessageBox("打开端口失败!",MB_ICONSTOP,0);
发送数据函数里:
UpdateData(true);//读取编辑框内容
CString str="\r";
m_cComm.SetOutput(COleVariant(m_strSendData+str));//发送数据
m_strSendData.Empty();//发送后清空输入框
UpdateData(false);//更新编辑框内容
OnComm函数里:
//从串口接收数据并显示在编辑框中
VARIANT variant_inp;
COleSafeArray safearray_inp;
long len,k;
byte rxdata[2048];//设置BYTE数组
CString strtemp;
if(m_cComm.GetCommEvent()==2)//值为2表示接收缓冲区内有字符
{
variant_inp=m_cComm.GetInput();//读缓冲区消息
safearray_inp=variant_inp;///变量转换
len=safearray_inp.GetOneDimSize();//得到有效的数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);
for(k=0;k<len;k++)//将数组转换为CString型变量
{
char bt=*(char*)(rxdata+k);//字符型
strtemp.Format("%c",bt);//将字符送入临时变量strtemp存放
m_strRecvData+=strtemp;//加入接收编辑框对应字符串
}
}
CString temp=("\r\n");//显示完成后要自动换行
m_strRecvData+=temp;
UpdateData(FALSE);//更新编辑框内容 展开
展开全部
char bt=*(char*)(rxdata+k);//字符型
你在这里加个断点,调试看看,接收到的rxdata数据对不对。
你在这里加个断点,调试看看,接收到的rxdata数据对不对。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2014-05-08
展开全部
感觉明显是你 程序处理过程中 丢失
追问
请您给出程序修改建议或是大概问题所在,感谢!!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
请问最后问题如何解决的?我也遇到一样的问题
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询