使用 VARIANT 类型,在MSDN里查

解决方案 »

  1.   

    用outp()
    例如:
    handle=0x3e8;
    outp(handle,0x77);
    outp(handle,'3');
    ......
      

  2.   

    用createfile()初始化端口,writefile()写端口,这是windows ApI 函数,在vc 中可用,具体看程序资料
      

  3.   

    HANDLE m_hCom; //通讯口句柄
    DCB dcb; //设备控制模块
    COMSTAT comStat; //串口状态 BOOL DevState[64];   //保存设备状态

    BYTE Command[20]; //一体化摄像头控制数据 int i;
    DWORD lpNumber;
    int oper;
    BOOL Error;
    if(kongzhilx == 0)
    {
    switch(Make)
    {
    case AL578CR:
    switch(Direction)
    {
    case COM_YUNTAI_LEFT:
    Command[0]=0x02; //STX
    Command[1]=Address; //Adr
    Command[2]=0x01; //Cmd
    Command[3]=0x02; //Data1 Pan Left
    Command[4]=0x00; //Data2
    Command[5]=0;     //CheckSum
    for(i=0;i<5;i++)
    Command[5]+=Command[i];
    Command[5]=Command[5]%256; Speed[0]=0x02; //STX
    Speed[1]=Address; //Adr
    Speed[2]=0x0E; //Cmd
    Speed[3]=MoveSpeed; //速度64
    Speed[4]=0x00; //Data2
    Speed[5]=0;     //CheckSum
    for(i=0;i<5;i++)
    Speed[5]+=Speed[i];
    Speed[5]=Speed[5]%256;
    break;
    case COM_YUNTAI_RIGHT:
    Command[0]=0x02; //STX
    Command[1]=Address; //Adr
    Command[2]=0x01; //Cmd
    Command[3]=0x01; //Data1 Pan Left
    Command[4]=0x00; //Data2
    Command[5]=0;     //CheckSum
    for(i=0;i<5;i++)
    Command[5]+=Command[i];
    Command[5]=Command[5]%256; Speed[0]=0x02; //STX
    Speed[1]=Address; //Adr
    Speed[2]=0x0E; //Cmd
    Speed[3]=MoveSpeed; //速度64
    Speed[4]=0x00; //Data2
    Speed[5]=0;     //CheckSum
    for(i=0;i<5;i++)
    Speed[5]+=Speed[i];
    Speed[5]=Speed[5]%256;
    break;
    case COM_YUNTAI_UP:
    Command[0]=0x02; //STX
    Command[1]=Address; //Adr
    Command[2]=0x01; //Cmd
    Command[3]=0x04; //Data1 Pan Left
    Command[4]=0x00; //Data2
    Command[5]=0;     //CheckSum
    for(i=0;i<5;i++)
    Command[5]+=Command[i];
    Command[5]=Command[5]%256; Speed[0]=0x02; //STX
    Speed[1]=Address; //Adr
    Speed[2]=0x0E; //Cmd
    Speed[3]=0x00; //速度64
    Speed[4]=MoveSpeed; //Data2
    Speed[5]=0;     //CheckSum
    for(i=0;i<5;i++)
    Speed[5]+=Speed[i];
    Speed[5]=Speed[5]%256;
    break;
    case COM_YUNTAI_DOWN:
    Command[0]=0x02; //STX
    Command[1]=Address; //Adr
    Command[2]=0x01; //Cmd
    Command[3]=0x08; //Data1 Pan Left
    Command[4]=0x00; //Data2
    Command[5]=0;     //CheckSum
    for(i=0;i<5;i++)
    Command[5]+=Command[i];
    Command[5]=Command[5]%256; Speed[0]=0x02; //STX
    Speed[1]=Address; //Adr
    Speed[2]=0x0E; //Cmd
    Speed[3]=0x00; //速度64
    Speed[4]=MoveSpeed; //Data2
    Speed[5]=0;     //CheckSum
    for(i=0;i<5;i++)
    Speed[5]+=Speed[i];
    Speed[5]=Speed[5]%256;
    break;
    case COM_YUNTAI_STOP:
    Command[0]=0x02; //STX
    Command[1]=Address; //Adr
    Command[2]=0x01; //Cmd
    Command[3]=0x00; //Data1 Pan Left
    Command[4]=0x00; //Data2
    Command[5]=0;     //CheckSum
    for(i=0;i<5;i++)
    Command[5]+=Command[i];
    Command[5]=Command[5]%256;

    Speed[0]=0x02; //STX
    Speed[1]=Address; //Adr
    Speed[2]=0x0E; //Cmd
    Speed[3]=0x00; //速度64
    Speed[4]=0x00; //Data2
    Speed[5]=0;     //CheckSum
    for(i=0;i<5;i++)
    Speed[5]+=Speed[i];
    Speed[5]=Speed[5]%256;
    break;
    case ZOOMWIDE:
    Command[0]=0x02; //STX
    Command[1]=Address; //Adr
    Command[2]=0x01; //Cmd
    Command[3]=0x10; //Data1 Pan Left
    Command[4]=0x00; //Data2
    Command[5]=0;     //CheckSum
    for(i=0;i<5;i++)
    Command[5]+=Command[i];
    Command[5]=Command[5]%256;

    Speed[0]=0x02; //STX
    Speed[1]=Address; //Adr
    Speed[2]=0x0E; //Cmd
    Speed[3]=0x00; //速度64
    Speed[4]=0x00; //Data2
    Speed[5]=0;     //CheckSum
    for(i=0;i<5;i++)
    Speed[5]+=Speed[i];
    Speed[5]=Speed[5]%256;
    break;
    case ZOOMTELE:
    Command[0]=0x02; //STX
    Command[1]=Address; //Adr
    Command[2]=0x01; //Cmd
    Command[3]=0x20; //Data1 Pan Left
    Command[4]=0x00; //Data2
    Command[5]=0;     //CheckSum
    for(i=0;i<5;i++)
    Command[5]+=Command[i];
    Command[5]=Command[5]%256; Speed[0]=0x02; //STX
    Speed[1]=Address; //Adr
    Speed[2]=0x0E; //Cmd
    Speed[3]=0x00; //速度64
    Speed[4]=0x00; //Data2
    Speed[5]=0;     //CheckSum
    for(i=0;i<5;i++)
    Speed[5]+=Speed[i];
    Speed[5]=Speed[5]%256;
    break;
    case FOCUSNEAR:
    Command[0]=0x02; //STX
    Command[1]=Address; //Adr
    Command[2]=0x01; //Cmd
    Command[3]=0x40; //Data1 Pan Left
    Command[4]=0x00; //Data2
    Command[5]=0;     //CheckSum
    for(i=0;i<5;i++)
    Command[5]+=Command[i];
    Command[5]=Command[5]%256; Speed[0]=0x02; //STX
    Speed[1]=Address; //Adr
    Speed[2]=0x0E; //Cmd
    Speed[3]=0x00; //速度64
    Speed[4]=0x00; //Data2
    Speed[5]=0;     //CheckSum
    for(i=0;i<5;i++)
    Speed[5]+=Speed[i];
    Speed[5]=Speed[5]%256;
    break;
    case FOCUSFAR:
    Command[0]=0x02; //STX
    Command[1]=Address; //Adr
    Command[2]=0x01; //Cmd
    Command[3]=0x80; //Data1 Pan Left
    Command[4]=0x00; //Data2
    Command[5]=0;     //CheckSum
    for(i=0;i<5;i++)
    Command[5]+=Command[i];
    Command[5]=Command[5]%256; Speed[0]=0x02; //STX
    Speed[1]=Address; //Adr
    Speed[2]=0x0E; //Cmd
    Speed[3]=0x00; //速度64
    Speed[4]=0x00; //Data2
    Speed[5]=0;     //CheckSum
    for(i=0;i<5;i++)
    Speed[5]+=Speed[i];
    Speed[5]=Speed[5]%256;
    break;
    default:
    break;
    } m_hCom=InitYiti(Make,Kongzhi); //串口初始化
    if(m_hCom==NULL)
    {
    // AfxMessageBox("串口初始化失败!");
    return FALSE;
    }

    Error = WriteFile(m_hCom,Speed,6,&lpNumber,NULL);  //send the data of bytes
    if(!Error)
    {
    // AfxMessageBox("发送命令失败 !");
    CloseHandle(m_hCom);
    return FALSE;
    } Error = WriteFile(m_hCom,Command,6,&lpNumber,NULL);  //send the data of bytes
    if(!Error)
    {
    // AfxMessageBox("发送命令失败 !");
    CloseHandle(m_hCom);
    return FALSE;
    }HANDLE CControlIO::InitYuntai(int Make)
    {
    HANDLE hCom = CreateFile("COM2",GENERIC_READ|GENERIC_WRITE, 
    0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED ,NULL);
    if(hCom == INVALID_HANDLE_VALUE)
    {
    AfxMessageBox("CreateFile()失败 InitYuntai!");
    return NULL;
    }

    BOOL Error = SetupComm(hCom,128,128); //创建输入输出队列缓存
    if(!Error)
    CloseHandle(hCom);
    Error = GetCommState(hCom,&dcb); //得到串口状态
    if(!Error)
    CloseHandle(hCom); //设置COM2通信参数
    switch(Make){
    case ADT:
    dcb.BaudRate    = 9600;
    dcb.ByteSize    = 8;
    dcb.Parity      = MARKPARITY;
    dcb.StopBits    = ONESTOPBIT;
    break;
    case M832:
    dcb.BaudRate    = m_intCom2Speed;
    dcb.ByteSize    = 8;
    dcb.Parity      = MARKPARITY;
    dcb.StopBits    = ONESTOPBIT;
    break;
    } Error = SetCommState(hCom,&dcb);
    if(!Error)
    {
    CloseHandle(hCom);
    } EscapeCommFunction(hCom,SETRTS);//设置为发送状态 return hCom;
    }
      

  4.   

    void CComIO::OutPut(const CByteArray &Data)
    {
    m_pMSComCtrl->SetOutput(COleVariant(Data));
    }void CComIO::OutPut(BYTE *pData, int Length)
    {
    int i;
    CByteArray Data;
    Data.SetSize(Length);
    for(i=0;i<Length;i++,pData++)
    Data[i]=*pData;
    OutPut(Data);
    }void CComIO::OutPut(CString Str)
    {
    int i,Length;
    CByteArray Data;
    Length=Str.GetLength();
    Data.SetSize(Length);
    for(i=0;i<Length;i++)
    Data[i]=Str[i];
    OutPut(Data);
    }
      

  5.   

    vastsky(戴二郎) ,能再说的具体些吗?  handle的值是什么?
      

  6.   

    DCB       dcb;char  data[1024],recv_data[1024];
    DWORD   len,send_len,error_code;  hCom = CreateFile("com2",
                  GENERIC_READ | GENERIC_WRITE,
      0,
      NULL,
                          OPEN_EXISTING,
      0,
                          //FILE_FLAG_OVERLAPPED,
      NULL);
         printf("comm2 handl is %d \n",hCom);
       GetCommState(hCom, &dcb ) ; 
       dcb.BaudRate =4800; 
       dcb.ByteSize =8;
     // dcb.Parity = SPACEPARITY;
       dcb.Parity = MARKPARITY;//   送地址
       dcb.fBinary = TRUE ;
       dcb.fParity = TRUE;
       SetCommState(hCom, &dcb ) ; //串口参数配置
       strcpy(data,"send address");
       WriteFile(hCom,data,strlen(data),&len,0);

        dcb.Parity = SPACEPARITY;//  关数据
        SetCommState(hCom, &dcb ) ; //串口参数配置   strcpy(data,"send normal data");
       WriteFile(hCom,data,strlen(data),&len,0);
      

  7.   

    chenhq(chenhq) 再请问一下 ,我那个地址,如果按协议里,是第9位还要为1,那我那个云台不就变成0x101了?放不进byte里了?
      

  8.   

    不是,第9位是放在SFR中,放在另外的寄存器里,不是放在数据PBUF里
      

  9.   

    不是,第9位是放在SFR中,放在另外的寄存器里,**是放在数据PBUF里
      

  10.   

    feng_sky(海峰) 你的意思是不是,如果发地址,奇偶校验为
       dcb.Parity = MARKPARITY;//   送地址
    送数据为 // dcb.Parity =    SPACEPARITY;
    那我得分两次发送了?
      

  11.   

    feng_sky奇偶校验就是选上面这两种吧?还有一个小问题,我的串口还用来接收数据,比如会从串口传来S11E的字符串,原来我的奇偶校验是N,现在改成这样以后,如果再有字符串传来,在MARKPARITY、SPACEPARITY下会受到影响吗?
      

  12.   

    数据可以收到。

    ClearCommError(hComm1,&error_code,NULL);
    可能得到校验的错误。
      

  13.   

    // dcb.Parity =    SPACEPARITY;
    //dcb.Parity = MARKPARITY;//   送地址
    上面分别为0校验和1校验。
    与数据的1奇偶无关系。