4056|9

76

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

PC与单片机串口通讯,系统重起 [复制链接]

我是个菜鸟,最近要做个接收串口数据的程序,用的是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             safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
        for(k=0;k         {
            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); //更新编辑框内容
               


有能帮帮我的么,小妹在此先谢谢了

最新回复

问题终于解决了,原来都不是那些问题,是主板接出来的串口线接触不好有些短路,谢谢各位了  详情 回复 发表于 2007-12-21 17:49
点赞 关注

回复
举报

92

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
你什么操作系统亚?先确定是不是你vc程序写的有问题,不接你的板子运行也会重起吗?不过windows2000后的系统都挺稳定的。难道是你的板子画错了?
 
 

回复

49

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
我操作系统是XP,不接板子不会重起,程序可以运行的,我用usb转串口了,因为机器上没有COM口,但是用串口调试助手V2.1接板子就可以正常接收,还是我的这个程序中哪里处理的不当吧,这里是不是涉及缓冲区大小的问题,数据量太大造成内存中缓冲区溢出?还是oncomm事件频繁触发造成的呢?请高手指点迷津哦。。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

4
 
另外,MSCOMM控件具体处理过程是怎样的呢,当他取缓冲区数据的时候涉及到指针复位吗,那他取一次如果持续有数据进来,那新来的数据是该覆盖还是溢出呢?怎么保证数据的连续呢,好头疼阿
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

5
 
建议你先用串口调试工具调试看看

然后再确定程序哪里出问题。
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

6
 
如果不接你的设备也会重起,可以说是你的vc程序有问题。否则,就要查你的电路板了。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

7
 
电路板应该是没有问题的,用串口调试助手可以成功接收。不接设备也不会重起。我用两台计算机进行通信我的程序也可以成功,就是一接板子就重起,板子是不断的发数据的,一秒50个数据包,每个数据包12个字节。
我很困惑的是为什么会导致重起呢,程序在取数据时候的毛病吧,症结在哪里呢,是因为缓冲区设置不对大量数据取来将内存中系统文件冲掉导致系统崩溃吗?这种发数据取数据的方法是及时的不丢桢的么````
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

8
 
问题终于解决了,原来都不是那些问题,是主板接出来的串口线接触不好有些短路,谢谢各位了
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

9
 
问题终于解决了,原来都不是那些问题,是主板接出来的串口线接触不好有些短路,谢谢各位了
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

10
 
问题终于解决了,原来都不是那些问题,是主板接出来的串口线接触不好有些短路,谢谢各位了
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表