modbus通讯内存上升问题,急急!! 点击:2985 | 回复:3



linwooo

    
  • 精华:1帖
  • 求助:0帖
  • 帖子:6帖 | 9回
  • 年度积分:0
  • 历史总积分:0
  • 注册:1900年1月01日
发表于:2004-03-02 14:29:00
楼主
我最近用VC的MSCOMM控件做了一个从站的modbus通讯项目,主站是HoneyWell公司的TDC-3000DCS,现在数据通讯完全正常,但是只要通讯一连上,发现计算机内存就4k/s的往上升。查了两天的程序也没有发现是什么问题,项目又要马上调试了,现在真是压力好大,如果那位大哥大姐比较熟悉的话,请帮帮我!!我提示一下:我已试过我编写的每一个函数,让它20ms执行一次,都没有问题,但是一把它发送到缓冲区就有问题了,即mscomm.SetOutput(COleVariant(Senddata)),其中Senddata为CByteArray型,为要发送出去的数据。



gongkongedit

  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2004-03-01 19:38:00
1楼
一般编写串口控件接收数据时,是这样写的: //初始化设置 m_msComm.SetCommPort(1)//打开COM1 m_msComm.SetPortOpen(true);//打开串口 m_msComm.SetSettings("115200,n,8,1");//串口参数设置 m_msComm.SetInputMode(1);//comInputModeBinary设置Binary缓冲区输入方式 m_msComm.SetRThreshold(5);//每接收5个字符则激发OnComm()事件 m_msComm.SetInputLen(5);//每次读取5个字符 //接收数据 void CCOMDlg::OnComm() { VARIANT variant_inp; COleSafeArray safearray_inp; LONG len,k; BYTE rxdata[5]; //设置BYTE数组 CString strtemp; switch(m_msComm.GetCommEvent()) { case 2://事件值为2表示接收缓冲区内有字符 variant_inp=m_msComm.GetInput(); //读缓冲区--------------------------------* safearray_inp = variant_inp; //VARIANT型变量转换为ColeSafeArray型变量 问题出在VARIANT型变量上,当执行到*号的这一行时,VARIANT型变量就会使内存增加,可以用下面的方法解决: void CCOMDlg::OnComm() { long len,k; COleVariant myVar; COleSafeArray safearray_inp; BYTE rxdata[5]; //设置BYTE数组 switch(m_msComm.GetCommEvent()) { case 2://事件值为2表示接收缓冲区内有字符 myVar.Attach (m_msComm.GetInput());--------------------------------------* safearray_inp = myVar; //COleVariant型变量转换为ColeSafeArray型变量 len=safearray_inp.GetOneDimSize(); //验证得到有效数据长度 assert(len == 5); for(k=0;k

linwooo

  • 精华:1帖
  • 求助:0帖
  • 帖子:6帖 | 9回
  • 年度积分:0
  • 历史总积分:0
  • 注册:1900年1月01日
发表于:2004-03-02 14:29:00
2楼
谢谢楼上的,我马上试试!不管成功与否,我都谢谢你!!

Mr.Gong

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 1回
  • 年度积分:0
  • 历史总积分:4
  • 注册:2002年4月14日
发表于:2004-04-06 19:31:00
3楼
用VC的人还使用 MSCOMM 控件,不使用API直接编程,速度快的多,控制灵活的多,自己写一个类,一直可以使用的。

热门招聘