用MSCOMM控件进行串口的通讯.遇到下面的问题:发出命令后,硬件根据不同命令向串口回复一串数据,长度不定,而且也没有数据头和结尾标识.现在怎样进行缓冲,在硬件发完一个回复命令的所有数据后才进行接收处理,而不是接收到其中一部分就进行处理?该怎样设置串口的属性?该怎么处理接收事件?请指教!!

解决方案 »

  1.   

    楼主你好,我是在C#用的MSCOMM,以下是在C#的主要的代码,在VC中我一直用API函数,不想用MSCOMM,原因是在别的电脑使用时需要注册。在你向串口发数据之前,先设置如下
    this.port.RThreshold=0; //port 是Mscomm的一个对象
    this.port.InputMode=MSCommLib.InputModeConstants.comInputModeText;//上述这样设置就是为了把接受到的数据存在串口的缓冲区里
    在Mscomm接受事件处理函数里,你这样处理
    private void port_OnComm()
    {
    string rec="";
    byte[] byin=(byte[])this.port.Input;
    if(byin.Length>0)  //转化为char型
    {
      for(int i=0;i<byin.Length;i++)
     {
        char c=(char)byin[i];
                  rec+=c.ToString();             
                                 }
    }

    你试试在VC中实现上述代码。我的博客上有个C#开发终端式短信的例子,有源码,用的就是MSCOMM控件。你可以看看
      

  2.   

    问1:以前遇到过软件是通过单字节读取+Read超时做的。也就是说,时间控制!Read超时和ReadInterval超时。
    问2:在网上搜一下MSCOMM可以找到很多文章。常用的例如Comm.SetSettings("9600,n,8,1");
    问3:判断Comm.GetCommEvent()的返回值。常用:
    SERIAL_EV_RXCHAR -- 应该Read;
    SERIAL_EV_CTS
    SERIAL_EV_DSR
    SERIAL_EV_RLSD -- 应该更新状态线;
    SERIAL_EV_RX80FULL -- 缓冲区将满;
    当然还有其他事件例如报错,楼主看看SERIAL_EV_RX80FULL的定义就可以看全了。
      

  3.   

    回lfchen(一条晚起的虫):
    没有数据定义,不同的命令返回的数据是不一样的!
      

  4.   

    不定长的操作,不知道你是想干什么的。如果是字符串,那么就将接收到的数据都+=到一个CString里面,每收到一次就UpdateData()一次。直接显示到文本框里面
      

  5.   

    不同命令,返回的数据是有明确的定义的,是一些参数,比如线路信噪比,传输速率等等, 但是每次后面的值是不一定一样的
    比如:
    Rx Line Rate(kbps):2048    
    Local SNR Margin(dB):31.0
    等等
      

  6.   

    格式基本固定,但长度不固定!对于MSCOMM控件不知道有没有这样的函数,在收到数据后多长时间如果没有再收到数据,则执行某个事件?!这样就可以在发完命令后不再收到数据时认为接受结束,不知道这样可不可行?
      

  7.   

    呵呵,没有的,从串口读数据时,你是不知道会收到什么数据的,不然也就没有意义了。定义串口时,他有一个默认的等待时间(一般都设为300ms),在接受数据时,在大于300ms间隔内仍然没有数据上来时就判断此次数据传输结束。
      

  8.   

    你可以这样,在向串口发送数据后,间隔一段时间(Sleep主线程等待一段时间,例如500ms),然后你再读取硬件设备回传过来的数据,判断他是否完整,如果没有接受完,等待时间你可以设的长一些,例如800ms或者1s.你自己把握下吧。
      

  9.   

    可以在发送命令后在OnCommMscomm事件里采用定时延迟接收,一般你回命令的数据在很短时间内就会收到,给个时间延迟就可以实现进行你所需要的缓冲了