菜鸟,编了一个接收数据的程序,“9600 n 8 1”,一次接收每帧9个字符,奇怪的是不管波特率是多少每秒接收最多只有64帧,不知道为什么,跪求高手解决!!

解决方案 »

  1.   

    ,“9600 n 8 1”,一个字符约1ms 一次接收每帧9个字符 9ms,
    64*9 = 636ms
      

  2.   

    就是用的串口精灵发的9个字符,用Mscomm控件编的接收程序,但最多只接收了64帧。。
      

  3.   

    用:
    void SetInBufferSize(short nNewValue);
    short GetInBufferSize();
    默认是512个
    《 64*9
      

  4.   

    串口设置代码如下:
    if(m_ctrlComm.GetPortOpen())
         m_ctrlComm.SetPortOpen(FALSE);
    m_ctrlComm.SetCommPort(1);   //选择com1
    m_ctrlComm.SetInputMode(1);//设置数据接收方式:1以二进制形式读取数据
    m_ctrlComm.GetInputLen();
    m_ctrlComm.SetSettings("38400,n,8,1"); //波特率9600,无校验,8个数据位,1个停止位
    m_ctrlComm.SetInBufferSize(1024); //设置输入缓冲区大小
    m_ctrlComm.SetOutBufferSize(512); //设置输出缓冲区大小
    if( !m_ctrlComm.GetPortOpen())
    m_ctrlComm.SetPortOpen(TRUE);//打开串口
    else
    AfxMessageBox("cannot open serial port"); m_ctrlComm.SetRThreshold(9);//参数9表示每当串口接收缓冲区中有多于或等于9个字符时将引发一个接收数据的OnComm事件
    m_ctrlComm.SetInputLen(9);//当前接收区数据长度
    m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据
      

  5.   

    串口设置代码如下:
    m_ctrlComm.SetInputMode(1);//设置数据接收方式:1以二进制形式读取数据
    m_ctrlComm.GetInputLen();
    m_ctrlComm.SetSettings("38400,n,8,1"); //波特率9600,无校验,8个数据位,1个停止位
    m_ctrlComm.SetInBufferSize(1024); //设置输入缓冲区大小
    m_ctrlComm.SetOutBufferSize(512); //设置输出缓冲区大小
    if( !m_ctrlComm.GetPortOpen())
    m_ctrlComm.SetPortOpen(TRUE);//打开串口
    else
    AfxMessageBox("cannot open serial port"); m_ctrlComm.SetRThreshold(9);//参数9表示每当串口接收缓冲区中有多于或等于9个字符时将引发一个接收数据的OnComm事件
    m_ctrlComm.SetInputLen(9);//当前接收区数据长度
    m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据
      

  6.   

    上面有个错了更正下:
    m_ctrlComm.SetSettings("9600,n,8,1"); //波特率9600,无校验,8个数据位,1个停止位
    m_ctrlComm.SetInBufferSize(1024); //设置输入缓冲区大小
      

  7.   

    每次(m_MSComm.GetCommEvent() == 2)时你读入多少个?
      

  8.   

    按照这个设置
    m_ctrlComm.SetInputLen(9);
    每次读入9个字符 一帧的个数
      

  9.   

    接收程序是这样的:
    if(m_ctrlComm.GetCommEvent()==2)     //事件值为2表示接收缓冲区内有字符
    {
    long len,k;
    COleVariant myVar;
    COleSafeArray safearray_inp;
    BYTE rxdata[9]; //设置BYTE数组
    union data
    {
    char redata[4];
    float f_data;
    };
    union data y;
    float fdata;
    CString strtemp;
    myVar.Attach(m_ctrlComm.GetInput());
    safearray_inp = myVar; //COleVariant型变量转换为ColeSafeArray型变量
    len=safearray_inp.GetOneDimSize(); //验证得到有效数据长度
    for(k=0;k<len;k++) 
    safearray_inp.GetElement(&k,rxdata+k); //转换为BYTE型数组 y.redata[0]=rxdata[4];
    y.redata[1]=rxdata[5];
    y.redata[2]=rxdata[6];
    y.redata[3]=rxdata[7];
    fdata=y.f_data;
      

  10.   

    for(k=0;k<len;k++)  查查这个 len 是不是 9。
    GetInputLen()看看是不是还有
      

  11.   

    9600/10 = 960(Bytes) (1起始位 8数据位 1停止位)估计LZ用的是串口精灵的定时发送功能吧,每秒64帧  1000/64=15ms 这和Windows定时精度比较符合,改为每一次发送N个帧试试看,不一定是接收的问题,而是数据源没有数据进来。
      

  12.   

    m_ctrlComm.SetInputLen(9);//当前接收区数据长度
    设置的为9所以len是9,但因为一直在发数据,缓冲区里也一直有数据的
      

  13.   

    建议不要使用mscomm控件,我曾经测试过,大数据量的情况下这个控件接收非常差
      

  14.   

    这个控件确实不是很好用,后面处理大量数据的话,内存直接增加了几十倍,直接死机了!很无语,由于是菜鸟API编程还用不好,跪求高手指点!~
      

  15.   

    仔细研读下MSDN的帮助文档
    Serial Communications