上位机和下位机通信,上位机先发0x3A,下位机收到0x3A后,回送0xA3,上位机收到0xA3后,接收下位机发送的256个字节的数据,之后下位机发送0x33,作为结束符,我用的mscomm控件,怎么编写这段代码呢?尤其是不知怎么握手?请高手指导呀

解决方案 »

  1.   

    握手??你用函数打开某一串口就已经作完所有工作了,就可以随意收发数据了,控件功能很强大的。你说的“上位机先发0x3A,下位机收到0x3A后,回送0xA3,上位机收到0xA3后”不是握手,是你自己定的通讯规则(协议),打开串口后收发就行了。看看这些,应该很快就会用了
    http://www.gjwtech.com/vcandc/scommassistantcode.htm
    http://www.gjwtech.com/scomm/scmfcactivex.htm
    http://www.gjwtech.com/scomm/scmfcprogramfujie.htm
      

  2.   

    你不要管握手这回事,你的情况是把这个问题按照你的预想复杂化了。控件不是有个打开串口的函数吗?比如你打开了串口2,所有的工作就完成了,你就可以用发送函数往串口2些数据了,也可以用接收函数读串口给你的数据了。具体到你的问题,你打开串口后,你对着串口2发送0x3A,机器受到后会发给你0xA3,你上位机对着串口2发送0x3A后,就读串口,看看是否0xA3到了,到了你再发送“256个字节的数据,之后下位机发送0x33,作为结束符”,就是这个过程。没你想得那么复杂,当然,有些东西需要你自己处理,比如你发送0x3A后,马上读串口,也许下危机有反映,但还没到,你可能什么都没读到,所以,你要定个时间,比如0.5秒内还没到的话,就认为下危机没反应
      

  3.   

    http://www.yesky.com/208/1813208.shtml
      

  4.   

    打开串口:
    CString csBaud;
    m_ComPort.SetCommPort(CommNO);//CommNO是几自己设定
    m_ComPort. SetInBufferSize(1024); //设置输入缓冲区的大小,Bytes
    m_ComPort. SetOutBufferSize(512); //设置输入缓冲区的大小,Bytes if( m_ComPort.GetPortOpen() )
    MessageBox("该串口已经打开", "系统提示");
    else
    {
    m_ComPort.SetPortOpen(TRUE);
    csBaud.Format("%d", Baud);       //波特率是几自己设
    csBaud += ",n,8,1";
    m_ComPort.SetSettings(csBaud);
    m_ComPort.SetInputMode(1);
    m_ComPort.SetRThreshold(1); 
    m_ComPort.SetInputLen(0);
    m_ComPort.GetInput();
    }
      

  5.   

    发送:
    CByteArray array;
    m_ComPort.SetOutput(COleVariant(array));//array内容自己添,用法文章上有接收:void CSCommTestDlg::OnComm() 
    {
    // TODO: Add your control notification handler code here
    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表示接收缓冲区内有字符
    {
    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; //加入接收编辑框对应字符串 
    }
    }
    UpdateData(FALSE); //更新编辑框内容
    }