请问VC(MFC或API编程)下支不支持非标准通讯速率,如100000bps这样的速率?
如果支持,请问怎么设定通讯速率?

解决方案 »

  1.   

    支持
    直接将波特率设置为100000
    设置过程:
    设用MSComm控件:
    CIIBMSComm m_comm;
    if(m_comm.GetPortOpen())//关闭端口
    m_comm.SetPortOpen(FALSE);

    m_comm.SetCommPort(PortNo);//设置端口号
    if(parity)
    m_TempPortSetting=BaudRadio+",n,"+databit+",1";//设置端口传输方式
    else
    m_TempPortSetting=BaudRadio+",n,"+databit+",1";
    m_comm.SetSettings(m_TempPortSetting);
    m_comm.SetInputMode(comInputModeBinary);//以二进制形式接受数据
    m_comm.SetPortOpen(TRUE);//打开端口
    m_comm.SetRThreshold(1);//设置响应端口接收事件的条件
    m_comm.SetInputLen(0);//清楚输入缓冲区
    m_comm.GetInput();
      

  2.   

    用API函数SetCommState():
    HANDLE m_hCom=CreateFile( m_pPortParam->cCom ,GENERIC_READ|GENERIC_WRITE,0,NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    DCB dcb;
    dcb.DCBlength=sizeof(DCB);
    GetCommState(m_hCom,&dcb)dcb.BaudRate=100000 ; //现实中可没有设备支持这么高的速度噢^_^
    SetCommState(m_hCom,&dcb);关于这些函数的具体用法,需要去查一下MSDN啦。
      

  3.   

    BaudRadio为CString类型
    BaudRadio="1000000";
      

  4.   

    不好意思,刚才有两处错误:一个是CreateFile里面的第一个参数,不应该是m_pPortParam->cCom,应该是:"COM1"。另一个就是我加的那句注释,100000这个速度还是能支持的,我给多数了个0^_^,数学学得不好^_^。
      

  5.   

    我是用控件做的接收程序,用了mousefj(冯杰) 的方法,是可以编译通过的,也可以运行,但在运行前会跳出“Invalid property value”,请问这如何避免?
      

  6.   

    引入MSComm通过Project/add to project/companent and control设引入后的类名称为CMSComm,应用是定义的对象CMSComm m_ComCtl;
    初始化代码void CTestcomDlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here
    m_ComCtl.SetCommPort(1);
    if(!m_ComCtl.GetPortOpen())
    m_ComCtl.SetPortOpen(TRUE);
    m_ComCtl.SetSettings("9600,n,8,1");
    m_ComCtl.SetInputMode(0);
    m_ComCtl.SetInBufferCount(0);
    m_ComCtl.SetRThreshold(9);
    Sleep(1000);


    MessageBox("You initial COM port sucessfully","MessageBox",MB_OK);}
    请实施看能否通过。我这是运行正常的。
      

  7.   

    然后将m_ComCtl.SetSettings("9600,n,8,1");改为
    m_ComCtl.SetSettings("100000,n,8,1");再试试。
      

  8.   

    发送代码:
    void CTestcomDlg::OnButton2() 
    {
    // TODO: Add your control notification handler code here
    /*tempstr.Insert(0,164);
    m_ComCtl.SetOutput(COleVariant(tempstr));*/
    CByteArray m_TempArray;
    m_TempArray.SetSize(1);
    m_TempArray.SetAt(0,160);
    m_ComCtl.SetOutput(COleVariant(m_TempArray));
    MessageBox("You send 164 sucessfully","MessageBox",MB_OK);
    }
    //接受代码在通信事件接受
    void CTestcomDlg::OnOnCommMscomm1() 
    {
    // TODO: Add your control notification handler code here
    BYTE  *byteData;
    short m_DataNum;
    CString m_DataStr;
    int i;

    m_DataNum=m_ComCtl.GetInBufferCount();
    m_RecVar=m_ComCtl.GetInput();
    byteData=m_RecVar.pbVal;//VT_BYREF;

    }
      

  9.   

    谢谢mousefj(冯杰),其实我刚才已经说了,用你的方法可以行得通,发送和接收都没有问题,就是在程序运行之前还会跳出来一个对话框,说“Invalid property value”,提示我采用了非标准的通讯速率,然后点击这个对话框以后就可以正常运行程序了。
    我的问题是,如何避免这个对话框的跳出?
      

  10.   

    try{
             m_ComCtl.SetCommPort(1);
    if(!m_ComCtl.GetPortOpen())
    m_ComCtl.SetPortOpen(TRUE);
    m_ComCtl.SetSettings("9600,n,8,1");
    }
    catch(CException *e)
    {
    }
    m_ComCtl.SetInputMode(0);
    m_ComCtl.SetInBufferCount(0);
    m_ComCtl.SetRThreshold(9);
    Sleep(1000);


    MessageBox("You initial COM port sucessfully","MessageBox",MB_OK);
      

  11.   

    根本上解决问题我还未找到原因,只好用捕捉错误但不处理这种笨办法了。
    m_ComCtl.SetSettings("9600,n,8,1");
    改为
    m_ComCtl.SetSettings("1000000,n,8,1");