| 发表于:2007-12-19 15:55:49 楼主 |
我是个菜鸟,最近要做个接收串口数据的程序,用的是vc6.0的oncomm控件来做的。照着龚建伟写的串口调试助手的那篇文章编写了代码,可以将单片机与pc机相连后一运行程序系统就重起,我觉得是接收的数据量太大将内存中系统数据区覆盖造成系统崩溃,可是我定义了缓冲区的大小,为什么会出现这种情况呢,该如何解决呢? 串口部分代码: if(m_ctrlcomm.getportopen()) m_ctrlcomm.setportopen(false); m_ctrlcomm.setcommport(1); //选择com1 m_ctrlcomm.setinbuffersize(30720); if(!m_ctrlcomm.getportopen()) m_ctrlcomm.setportopen(true);//打开串口 else afxmessagebox("cannot open serial port"); m_ctrlcomm.setsettings("9600,n,8,1"); //波特率9600,无校验,8个数据位,1个停止位 m_ctrlcomm.setinputmode(1); //1:表示以二进制方式检取数据 m_ctrlcomm.setrthreshold(1); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的oncomm事件 m_ctrlcomm.setinputlen(0); //设置当前接收区数据长度为0 m_ctrlcomm.getinput();//先预读缓冲区以清除残留数据 updatedata (true); return true; // return true unless you set the focus to a control } oncomm部分代码 variant variant_inp; colesafearray safearray_inp; long len,k; byte rxdata[2048]; //设置byte数组 an 8-bit integerthat is not signed. cstring strtemp; if(m_ctrlcomm.getcommevent()==2) //事件值为2表示接收缓冲区内有字符 { ////////以下可以根据通信协议加入处理代码 sleep(20); variant_inp=m_ctrlcomm.getinput(); //读缓冲区 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); //字符型 if(m_ctrlhexdisplay.getcheck()) strtemp.format("%02x ",bt); //将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔 else strtemp.format("%c",bt); //将字符送入临时变量strtemp存放 m_strrxdata+=strtemp; //加入接收编辑框对应字符串 m_edit.setsel(-1, -1); updatedata(true); //将字符存入文件 cfile file; file.open("d:/d.txt",cfile::modewrite ¦cfile::modecreate ¦cfile::typebinary); file.seek(0,cfile::begin); file.write(&m_strrxdata,2048); file.close(); } } updatedata(false); //更新编辑框内容 有能帮帮我的么,小妹在此先谢谢了 |
|
|
|
|