我门单位开发的外设,要开发程序,现在外设的程序写在机器里面了,我要开发上位机程序,用VC+MSCOMM,请问如何:
1。发送控制代码例如"1D+C2+04+F0+24字节ASCII码+C0"到外设。
2。接收外设发回的确认代码"D1"。
以上的代码为十六进制我想要上面的VC代码,比较清楚的,里面最好不要有假代码.
懂了就给分!

解决方案 »

  1.   

    给钱,我帮你做
    [email protected]
      

  2.   

    这是串口调试助手的大部分的源代码,我前不久做的,不知道对你有没有帮助。看的时候可以对照着串口调试助手的界面来看。
    void CSCommTestDlg::OnComm() 
    {
    VARIANT variant_inp;
    COleSafeArray safearray_inp;
    LONG len,k;
    BYTE rxdata[2048];//设置BYTE数组
    CString strtemp;
    switch (m_ctrlComm.GetCommEvent())
    {
     case 1: //comEvSend事件 
        //如有数据要发送,可采用以下代码: 
     {
     VARIANT varOut; 
     VariantInit(&varOut); 
     varOut.vt=VT_BSTR; 
    // USES_CONVERSION; 
     //varOut.bstrVal=(SysAllocString(T2OLE)("My data")); 
     if(varOut.bstrVal)
     { 
     m_ctrlComm.SetOutput(varOut); 
     SysFreeString(varOut.bstrVal);
     }
     break; 
     } case 2: //comEvReceiv事件,有数据到达
    {
    variant_inp = m_ctrlComm.GetInput();//读缓冲区
    safearray_inp = variant_inp;
    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);//将字符以十六进制方式送入临时变量
    else
    strtemp.Format("%c", bt);//将字符送入临时变量strtemp存放
    m_strRXData += strtemp;//加入接受编辑框对应字符串
    }

       UpdateData(FALSE);//更新编辑框的内容
       break; 
    }
     default: 
      break; 
    }
     } 

    void CSCommTestDlg::OnButtonManualsend() //手动发送
    {
    if(!m_ctrlComm.GetPortOpen())
    AfxMessageBox("串口未打开\n请先打开串口");
    else
    {
    UpdateData(TRUE);//读取编辑框的内容
    if (m_ctrlHexSend.GetCheck())
    {
    CByteArray hexdata;
    int len = String2Hex(m_strTXData, hexdata);//此处返回的len可以用于计算发送了多少个十六进制数
    m_ctrlComm.SetOutput(COleVariant(hexdata));//发送十六进制数据
    }
    else 
    m_ctrlComm.SetOutput(COleVariant(m_strTXData));//发送ASCII字符数据
    //m_ctrlComm.SetOutput(COleVariant(m_strTXData));//发送数据
    // TODO: Add your control notification handler code here
    }

    }void CSCommTestDlg::OnButtonOpen() //打开串口
    {
    UpdateData(TRUE);
    if(m_ctrlComm.GetPortOpen())
    m_ctrlComm.SetPortOpen(FALSE);
        //char buf[10];
    //m_ctrlComm.SetCommPort(1);
    int i = atoi(m_portId_Str);
    m_ctrlComm.SetCommPort(i);
            //m_ctrlComm.SetCommPort(m_Serial.GetCurSel());//选择comm1
    if(!m_ctrlComm.GetPortOpen ())
    {
    m_ctrlComm.SetPortOpen(TRUE);
    m_Open.ShowWindow(SW_HIDE);
    m_Close.ShowWindow(SW_SHOW);
    } else
    AfxMessageBox("cannot open serial port");
        char *buf1,*buf2,*buf3;
    buf1=(LPSTR)(LPCTSTR)m_rate_Str;
    buf2=(LPSTR)(LPCTSTR)m_data_Str;
    buf3=(LPSTR)(LPCTSTR)m_stop_Str;
        //int nLen = m_rate_Str.GetLength();
        //LPCTSTR lpzsbuf =m_rate_Str.GetBuffer(nLen);
    sprintf(buf1,"%s,n,%s,%s",buf1,buf2,buf3);//
    m_ctrlComm.SetPortOpen(FALSE);
        m_ctrlComm.SetSettings(buf1);
    m_ctrlComm.SetPortOpen(TRUE);
    //m_ctrlComm.SetSettings("m_rate_Com.GetCurSel(),m_bit_Com.GetCurSel(),m_data_Com.GetCurSel(),m_stop_Com.GetCurSel()");
    //m_ctrlComm.SetInBufferSize(2048);
    m_ctrlComm.SetInputMode(1);//表示以二进制方式剪取数据
    m_ctrlComm.SetRThreshold(1);//表示每当串口接受区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
    m_ctrlComm.SetSThreshold(0);
    m_ctrlComm.SetInputLen(0);//设置当前接受区数据长度为0
                               //使用 Input 将使 MSComm 控件读取接收缓冲区中全部的内容。
    m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据
    //m_ctrlComm.SetPortOpen(1);
    //return m_Opened;
    // TODO: Add your control notification handler code here

    }int CSCommTestDlg::String2Hex(CString str,CByteArray &senddata)//十六进制
    {
    int hexdata, lowhexdata;
    int hexdatalen=0;
    int len = str.GetLength();
    senddata.SetSize(len/2);
    for (int i=0; i<len;)
    {
    char lstr,hstr=str[i];
    if(hstr == ' ')
    {
    i++;
    continue;
    }
    i++;
    if(i>=len)
    break;
    lstr = str[i];
    hexdata = ConvertHexChar(hstr);
    lowhexdata = ConvertHexChar(lstr);
    if((hexdata == 16)||(lowhexdata == 16))
    break;
    else
    hexdata = hexdata*16+lowhexdata;
    i++;
    senddata[hexdatalen] = (char)hexdata;
    hexdatalen++;
    }
    senddata.SetSize(hexdatalen);
    return hexdatalen;
    }
    int CSCommTestDlg::ConvertHexChar(char ch)
    {

    if ((ch>='0')&&(ch<='9'))
    return ch-0x30;
    else if ((ch>='A')&&(ch<='F'))
    return ch-'A'+10;
    else if ((ch>='a')&&(ch<='f'))
    return ch - 'a' +10;
    else return(-1);
    }void CSCommTestDlg::OnTimer(UINT nIDEvent) 
    {
    OnButtonManualsend();
    // TODO: Add your message handler code here and/or call default

    CDialog::OnTimer(nIDEvent);
    }void CSCommTestDlg::OnCheckAutosend() 
    {
    if(!m_ctrlComm.GetPortOpen())
    {
    AfxMessageBox("串口未打开,请先打开串口");
        m_bAutoSend = !m_bAutoSend;
    }
    else
    {
    m_bAutoSend =!m_bAutoSend;
    if(m_bAutoSend)
    {
    SetTimer(1, 1000, NULL);//时间为1000毫秒
    m_AutoCL.SetSel(0,-1);
        m_AutoCL.ReplaceSel("1000");
    }
    else
    {
    m_AutoCL.SetSel(0,-1);
    m_AutoCL.ReplaceSel("");
    KillTimer(1);
    }
    }
    // TODO: Add your control notification handler code here

    }void CSCommTestDlg::OnButtonClose() //关闭串口
    {
    if(m_bAutoSend )
    AfxMessageBox("请先关闭自动发送");
    else
    {
    m_Open.ShowWindow(SW_HIDE);
    m_Close.ShowWindow(SW_SHOW);
    m_ctrlComm.SetPortOpen(FALSE);
    m_Open.ShowWindow(SW_SHOW);
    m_Close.ShowWindow(SW_HIDE);
    }

    // TODO: Add your control notification handler code here

    }void CSCommTestDlg::OnButtonCleart() //清空
    {
    m_strTXData.Empty();//清除接受对话框中的数据
    UpdateData(FALSE);//DAO数据访问对象
    // TODO: Add your control notification handler code here

    }void CSCommTestDlg::OnButtonClearr() 
    {
    m_strRXData.Empty();//清除发送对话框中的数据
    UpdateData(FALSE);
    // TODO: Add your control notification handler code here

    }void CSCommTestDlg::OnButtonExit() 
    {
    m_Edit13.ShowWindow(SW_SHOW);
    m_Exit.ShowWindow(SW_HIDE);
    OnCancel();
    // TODO: Add your control notification handler code here

    }
    //修改按钮void CSCommTestDlg::OnAmendButton() 
    {
    if(m_ctrlComm.GetPortOpen())
    {
    m_ctrlComm.SetPortOpen(FALSE);
    m_Open.ShowWindow(SW_SHOW);
    m_Close.ShowWindow(SW_HIDE);
    }
    else
    {
    m_Serial.EnableWindow(TRUE);
    m_data_Com.EnableWindow(TRUE);
    m_rate_Com.EnableWindow(TRUE);
    m_bit_Com.EnableWindow(TRUE);
    m_stop_Com.EnableWindow(TRUE);

    }
    // TODO: Add your control notification handler code here
    }
    //使用按钮void CSCommTestDlg::OnAppButton() 
    {
    UpdateData(TRUE);
    m_Serial.EnableWindow(FALSE);
    m_data_Com.EnableWindow(FALSE);
    m_rate_Com.EnableWindow(FALSE);
    m_bit_Com.EnableWindow(FALSE);
    m_stop_Com.EnableWindow(FALSE);
    //m_ctrlComm.SetPortOpen(TRUE);
    // TODO: Add your control notification handler code here
    }
      

  3.   

    唉。太简单了吧随便找找以前的问题和FAQ什么的就可以了。
      

  4.   

    我比较想知道怎样同时发送十六进制数和ASCII码
      

  5.   

    int CSCommTestDlg::String2Hex(CString str,CByteArray &senddata)这个就是发送十六进制,
      

  6.   

    同时发送十六进制数和ASCII码呢?
      

  7.   

    ASCII这个不会没有做过,会了不要忘了给我说 阿!谢谢
      

  8.   

    就是你发了十六进制数和ASCII码下位机也都是按照16进制处理啊。你就用char * 把要发的数据一个一个的拼起来发送就是了
      

  9.   

    同时发送十六进制数和ASCII码,那需要你自己判断吧
      

  10.   

    就是你发了十六进制数和ASCII码下位机也都是按照二进制处理
    不管是什么,包括发一个结构体,处理方法都是一样的这位老兄,你们单位做硬件的,你对硬件不熟悉,看来不好混呀,早点出来吧
      

  11.   

    类似代码
    int i=0;
    CString str="";
    m_comm.SetOutput(COleVariant("#0x001oo\r"));
    while(str.Find('\r')==-1&&i<10000)
    {str=str+m_comm.GetInput().bstrVal;
     i++;
    }