最近在实现智能家居的时候遇到了一个问题。由于中控主机上只有串口可以发送控制信号所以导致点歌服务器不能实现远程启动和关闭。
我希望能够利用vc写一段代码读取串口信息,一旦读到串口信息就执行关机命令。在网上找了一些例子发现都是串口通信的代码的复杂。
不知道有没有一些轻量级的实现方法,希望各位帮帮忙。对了那个服务器是win2000的.比较新的编程工具不能用。以下是中控串口发出的信号:
协议: RS232
波特率:9600
数据位:8
无校正:N
停止位:1
发送的是阿斯克码:break
要在break后面加回车符
我希望能够利用vc写一段代码读取串口信息,一旦读到串口信息就执行关机命令。在网上找了一些例子发现都是串口通信的代码的复杂。
不知道有没有一些轻量级的实现方法,希望各位帮帮忙。对了那个服务器是win2000的.比较新的编程工具不能用。以下是中控串口发出的信号:
协议: RS232
波特率:9600
数据位:8
无校正:N
停止位:1
发送的是阿斯克码:break
要在break后面加回车符
开机,需要硬件支持,其实是远程唤醒,用带唤醒功能的网卡或者其他设备。参考http://dev.21tx.com/2005/05/30/12619.html
接收事件中使用一个队列接收和检测数据,检测到匹配的字符串即执行相应的操作
为了可靠通讯,应该加入校验、应答和错误重发机制,
关机可以使用ExitWindowsEx函数
//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;
}
能给点解释吗?需要添加什么函数类库吗?我那边不支持mfc