VS2010用MSComm控件进行通信,数据量大时程序死机

0x4C43 0x4C43 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

数据量小的时候接收没问题,但是我在接收单片机传的一帧320*240 RGB565图像的数据时就不行了。
请问我该怎么改?或者有什么好的方案来接收数据?
这是我的代码


void CCommTestDlg::OnBnClickedOpenUsart()
{
// TODO: 在此添加控件通知处理程序代码

if(m_mscomm.get_PortOpen()) //若串口打开,则关闭串口
{
m_mscomm.put_PortOpen(FALSE);
}
m_mscomm.put_CommPort(5);
m_mscomm.put_Settings(_T("115200,n,8,1"));
m_mscomm.put_InBufferSize(1024);//接收缓冲区
m_mscomm.put_OutBufferSize(1024);//发送缓冲区
m_mscomm.put_InputLen(0);//设置当前接收区数据长度为0,表示全部读取
m_mscomm.put_InputMode(1);// 以二进制方式读写数据
m_mscomm.put_RThreshold(1);//接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm事件
m_mscomm.put_SThreshold(0);//每发送1个字符时,不触发OnComm事件
if(!m_mscomm.get_PortOpen())//如果串口没有打开则打开
{
try
{
m_mscomm.put_PortOpen(TRUE);
AfxMessageBox(_T("串口打开成功"));
}
catch (...)
{
AfxMessageBox(L"串口打开失败");
return;
}
m_mscomm.get_Input(); //先预读缓冲区以清除残留数据
}
}



void CCommTestDlg::OnCommMscomm1()
{
static unsigned int cnt=0;
VARIANT variant_inp;
COleSafeArray safearray_inp;
long len,k;

unsigned intdata[1024]={0};
byte rxdata[1024]; //设置BYTE数组
CString strtemp,string;

if (m_mscomm.get_CommEvent()==2) //值为2表示接收缓冲区内有字符
{
cnt++;
variant_inp= m_mscomm.get_Input(); //读取缓冲区
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++)
{
if(m_ctrlHexDiaplay.GetCheck())
strtemp.Format(_T("%02X "),*(rxdata+k)); //16进制显示
else
strtemp.Format(_T("%c "),*(rxdata+k)); //字符显示
m_EditReceive+=strtemp;
UpdateData(FALSE);

if (m_EditReceive.GetLength()>4000) //清空接收框
{
m_EditReceive=" ";
UpdateData(FALSE);
}
}

FILE *p= fopen( "pic1.dat","ab");
fwrite(rxdata,len,1,p);
fclose (p);


}


...全文

相关推荐

评论 13
收藏 已收藏
分享
返回顶部
0x4C43
C++ 语言 65,214 成员 250,514 内容