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

0x4C43 2015-01-25 07:07:28

数据量小的时候接收没问题,但是我在接收单片机传的一帧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);


}


...全文
314 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
LVsler 2015-05-06
  • 打赏
  • 举报
回复
楼主解决没,我也是,遇到这个问题
杨玉庆 2015-04-24
  • 打赏
  • 举报
回复
楼主解决了吗?我也遇到这个问题了,能指点一下吗非常感谢啊
Evankaka 2015-01-28
  • 打赏
  • 举报
回复
应该是占用界面线程了,开一条线程专门来通信
ztenv 版主 2015-01-27
  • 打赏
  • 举报
回复
估计是发送和接收不同步了,
野男孩 2015-01-27
  • 打赏
  • 举报
回复
别每个字节都去update
0x4C43 2015-01-26
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
Multiple Threads in the User Interface http://msdn.microsoft.com/zh-cn/library/ms810439.aspx
谢谢回复,我去看看
0x4C43 2015-01-26
  • 打赏
  • 举报
回复
引用 5 楼 Saleayas 的回复:
把接收数据的工作和 UI 线程分成两个线程。 接收数据以最快的速度完成,然后继续。
好的,我试试。
赵4老师 2015-01-26
  • 打赏
  • 举报
回复
Multiple Threads in the User Interface http://msdn.microsoft.com/zh-cn/library/ms810439.aspx
Saleayas 2015-01-26
  • 打赏
  • 举报
回复
把接收数据的工作和 UI 线程分成两个线程。 接收数据以最快的速度完成,然后继续。
0x4C43 2015-01-25
  • 打赏
  • 举报
回复
引用 3 楼 jerry_dqh 的回复:
能调试吗,加点打印,估计缓冲是不是有问题
能调试,发送几十字节数据时没问题。加点打印?如果是缓冲的问题该怎么改?
碼上道 2015-01-25
  • 打赏
  • 举报
回复
能调试吗,加点打印,估计缓冲是不是有问题
0x4C43 2015-01-25
  • 打赏
  • 举报
回复
引用 1 楼 jerry_dqh 的回复:
这个数据量不大吧,是崩溃了吗
对,接收了一段数据就没响应了
碼上道 2015-01-25
  • 打赏
  • 举报
回复
这个数据量不大吧,是崩溃了吗

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧