最近在实现智能家居的时候遇到了一个问题。由于中控主机上只有串口可以发送控制信号所以导致点歌服务器不能实现远程启动和关闭。
我希望能够利用vc写一段代码读取串口信息,一旦读到串口信息就执行关机命令。在网上找了一些例子发现都是串口通信的代码的复杂。
不知道有没有一些轻量级的实现方法,希望各位帮帮忙。对了那个服务器是win2000的.比较新的编程工具不能用。以下是中控串口发出的信号:
协议: RS232
波特率:9600
数据位:8 
无校正:N
停止位:1
发送的是阿斯克码:break
要在break后面加回车符

解决方案 »

  1.   

    这个通信属于基本串口通信,没有什么特别的地方。如果怕麻烦可以参考这个类:http://www.vckbase.com/document/viewdoc/?id=1322需要注意的地方:为了防止数据丢失,需要进行验证。开发工具VC即可。关机按你的思路,即可实现。远程开机就麻烦了,不过可以采用加电即启动的方案。
      

  2.   

    www.gjwtech.com,串口编程网站关机,参考http://topic.csdn.net/t/20020415/12/647855.html
    开机,需要硬件支持,其实是远程唤醒,用带唤醒功能的网卡或者其他设备。参考http://dev.21tx.com/2005/05/30/12619.html
      

  3.   

    串口编程使用MSCOMM控件比较容易
    接收事件中使用一个队列接收和检测数据,检测到匹配的字符串即执行相应的操作
    为了可靠通讯,应该加入校验、应答和错误重发机制,
    关机可以使用ExitWindowsEx函数
      

  4.   

    要容易实现,就使用mscomm控件来接收串口字符;关机的代码应该好找到.
      

  5.   

    //////////////////////////////////////////////////////////////////////
    //OPen
    DCB  dcb;
    BOOL status;
    DWORD error_number;status = TRUE;HANDLE handle_com = CreateFile(PortName,
    GENERIC_READ | GENERIC_WRITE,
    0,
    NULL,
    OPEN_EXISTING,
    NULL,
    NULL);if(handle_com == INVALID_HANDLE_VALUE)
    return  0;SetupComm(handle_com,4096,4096); //1.设置输入输出缓冲if(!GetCommState(handle_com,&dcb))
    return  0;char *szBaud = new char[50];
    sprintf(szBaud, "baud=%d parity=%c data=%d stop=%d", nBaud, 'N', 8, 1);dcb.fRtsControl = RTS_CONTROL_ENABLE; // set RTS bit high!
    if (!BuildCommDCB(szBaud, &dcb))
    {
    delete [] szBaud;
    return 0;
    }
    if( !SetCommState(handle_com, &dcb) )
    {
    error_number = GetLastError();
    delete [] szBaud;
    CloseHandle(handle_com);
    return 0;
    }
    //////////////////////////////////////////////////////////////////////
    //Send
    DWORD dwBytesWrite;
    if( WriteFile(handle_com,pBuf,nBuffLen,&dwBytesWrite,NULL))
    {
      if(dwBytesWrite != nBuffLen)
      {
    delete pBuf;
    return false;
      }
    }
    else
    {
    delete pBuf;
    return false;
    }
    delete pBuf;//////////////////////////////////////////////////////////////////////
    //read ;
    char lpInBuffer[1024];    
    COMSTAT ComStat;
    DWORD dwBytesRead,dwErrorFlags;for ( int k=0;k<10;k++)
    {
    Sleep(50);      //等待串口返回数据
    //读取串行设备的当前状态 
    ClearCommError(handle_com,&dwErrorFlags,&ComStat); 
    //应该读取的数据长度 
    dwBytesRead=min(14,ComStat.cbInQue); 
    if(dwBytesRead>0) 
    //读取数据  //lpInBuffer 既是接收到的内容
    if(!ReadFile(handle_com,lpInBuffer,dwBytesRead,&dwBytesRead,NULL)) 
    dwBytesRead=0; 
    if ( dwBytesRead > 0)
    break;
    }
    //////////////////////////////////////////////////////////////////////
    //Close
    if ( handle_com != 0)
    {
      CloseHandle(handle_com);
      handle_com = NULL;
    }
      

  6.   


    能给点解释吗?需要添加什么函数类库吗?我那边不支持mfc