| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376 | 
							- #include "CGH_Relays.h"
 
- /*******************************************************************
 
- * 名称: openSyn
 
- * 功能: 同步方式打开串口,并配置默认信息
 
- * 参数:
 
-     serial_name:串口名称
 
-     baud_rate  :波特率,取值如下
 
-         ......
 
-         CBR_9600    9600bps
 
-         CBR_14400   14400bps
 
-         ......
 
-     parity     :校验方式
 
-         EVENPARITY  偶校验
 
-         MARKPARITY  标号校验
 
-         NOPARITY    无校验
 
-         ODDPARITY   奇校验
 
-         SPACEPARITY 空格校验
 
-     byte_size  :数据位大小
 
-         4,5,6,7,8
 
-     stop_bits  :停止位
 
-         ONESTOPBIT      1个停止位
 
-         ONE5STOPBITS    1.5个停止位
 
-         TWOSTOPBITS     2个停止位
 
- * 返回: 正确返回为ture,错误返回为false
 
- *******************************************************************/
 
- bool CGH_Relays::openSyn(string serial_name, unsigned char baud_rate, unsigned char parity, unsigned char byte_size, unsigned char stop_bits)
 
- {
 
-     if (!openSyn(serial_name))
 
-         return false;
 
-     DCB dcb;
 
-     if (false == GetCommState(hCom, &dcb))//获得当前串口的配置信息
 
-     {
 
-         setSerialLastError("SerialInterface::open() : GetCommState Error");
 
-         return false;
 
-     }
 
-     dcb.DCBlength = sizeof(DCB);
 
-     dcb.BaudRate = baud_rate;
 
-     dcb.Parity = parity;
 
-     dcb.ByteSize = byte_size;
 
-     dcb.StopBits = stop_bits;
 
-     if (false == SetCommState(hCom, &dcb))//用DCB结构重新配置串行端口信息
 
-     {
 
-         setSerialLastError("SerialInterface::open() : SetCommState Error");
 
-         return false;
 
-     }
 
-     //超时处理
 
-     COMMTIMEOUTS timeouts;
 
-     timeouts.ReadIntervalTimeout = MAXDWORD; //读间隔超时
 
-     // 把间隔超时设为最大,把总超时设为0将导致ReadFile立即返回并完成操作 
 
-     timeouts.ReadTotalTimeoutMultiplier = 0; //读时间系数
 
-     timeouts.ReadTotalTimeoutConstant = 0; //读时间常量
 
-     timeouts.WriteTotalTimeoutMultiplier = 50; // 写时间系数
 
-     timeouts.WriteTotalTimeoutConstant = 2000; //写时间常量
 
-     //总的读/写超时时间 = Read(Write)TotalTimeoutMultiplier x 要读/写的字节数 + Read(Write)TotalTimeoutConstant. 
 
-     if (false==SetCommTimeouts(hCom, &timeouts))
 
-     {
 
-         setSerialLastError("SerialInterface::open() : SetCommTimeouts Error");
 
-         return false;
 
-     }
 
-     //清空缓冲区,为读写串口做准备
 
-     if (false == PurgeComm(hCom, PURGE_TXCLEAR | PURGE_RXCLEAR | PURGE_TXABORT | PURGE_RXABORT))
 
-     {
 
-         setSerialLastError("SerialInterface::open() : PurgeComm Error");
 
-         return false;
 
-     }
 
-     return true;
 
- }
 
- /*******************************************************************
 
- * 名称: openSyn
 
- * 功能: 同步方式打开串口(需自己配置串口参数)
 
- * 参数:
 
-     serial_name:串口名称
 
- * 返回: 正确返回为ture,错误返回为false
 
- *******************************************************************/
 
- bool CGH_Relays::openSyn(string serial_name)
 
- {
 
- 	hCom = CreateFileA(
 
- 		serial_name.data(),//普通文件名或者设备文件名,这里是串口名
 
- 		GENERIC_READ | GENERIC_WRITE,//访问模式,读和写
 
- 		0,//共享模式,独占模式
 
- 		NULL,//指向安全属性的指针,不使用,传NULL
 
- 		OPEN_EXISTING,//如何创建,在串口中必须设置为OPEN_EXISTING。表示不能创建新端口只能打开已有的端口。
 
- 		FILE_ATTRIBUTE_NORMAL,//文件属性,使用默认属性FILE_ATTRIBUTE_NORMAL。
 
- 		NULL//用于复制文件句柄,通常这个参数设置为NULL,为空表示不使用模板
 
- 	);
 
- 	if (INVALID_HANDLE_VALUE == hCom)//出错判断
 
- 	{
 
- 		hCom = NULL;
 
-         setSerialLastError("open():CreateFileA Error!");
 
- 		return false;
 
- 	}
 
- 	return true;
 
- }
 
- /*******************************************************************
 
- * 名称: closeComm
 
- * 功能: 关闭串口
 
- * 参数: 无
 
- * 返回: 正确返回为ture,错误返回为false
 
- *******************************************************************/
 
- void CGH_Relays::closeComm()
 
- {
 
-     if(NULL==hCom)
 
-         return;
 
-     CloseHandle(hCom);
 
-     hCom=NULL;
 
- }
 
- /*******************************************************************
 
- * 名称: closeComm
 
- * 功能: 判断串口是否打开
 
- * 参数: 无
 
- * 返回: 正确返回为ture,错误返回为false
 
- *******************************************************************/
 
- bool CGH_Relays::isOpened()
 
- {
 
-     return NULL == hCom ? false : true;
 
- }
 
- DWORD CGH_Relays::readData(char *buffer,int length)
 
- {
 
-     DWORD writeSize=0;
 
-     bool ret=false;
 
-     ret=ReadFile(hCom,buffer,length,&writeSize,NULL);
 
-     if(false==ret)
 
-         return 0;
 
-     return writeSize;
 
- }
 
- DWORD CGH_Relays::writeData(char *buffer,int length)
 
- {
 
-     DWORD writeSize=0;
 
-     bool ret=false;
 
-     ret=WriteFile(hCom,buffer,length,&writeSize,NULL);
 
-     if(false==ret)
 
-         return 0;
 
-     return writeSize;
 
- }
 
- DWORD CGH_Relays::writeStr(string str)
 
- {
 
- 	bool ret = false;
 
- 	DWORD writeSize = 0;
 
- 	ret = WriteFile(hCom, str.data(), str.length(), &writeSize, NULL);
 
-     if (0 == ret)
 
-     {
 
-         last_error = "Error By writeStr(string str)";
 
-         return 0;
 
-     }
 
- 		
 
-     last_error = "";
 
- 	return writeSize;
 
- }
 
- /*******************************************************************
 
- * 名称: setTimeouts
 
- * 功能: 设置超时
 
- * 参数:
 
-     timeouts:超时配置的COMMTIMEOUTS结构体
 
- * 返回: 正确返回为ture,错误返回为false
 
- *******************************************************************/
 
- bool CGH_Relays::setTimeouts(COMMTIMEOUTS &timeouts)
 
- {
 
-     if (false == SetCommTimeouts(hCom, &timeouts))
 
-     {
 
-         setSerialLastError("SerialInterface::setTimeouts() : SetCommTimeouts Error");
 
-         return false;
 
-     }
 
-     return true;
 
- }
 
- /*******************************************************************
 
- * 名称: setDCB
 
- * 功能: 设置串口信息
 
- * 参数:
 
-     dcb:串口信息配置的DCB结构体
 
- * 返回: 正确返回为ture,错误返回为false
 
- *******************************************************************/
 
- bool CGH_Relays::setDCB(DCB& dcb)
 
- {
 
-     if (false == SetCommState(hCom, &dcb))
 
-     {
 
-         setSerialLastError("SerialInterface::setDCB() : SetCommState Error");
 
-         return false;
 
-     }
 
-     return true;
 
- }
 
- /*******************************************************************
 
- * 名称: purgeBuff
 
- * 功能: 刷新缓冲区
 
- * 参数: 
 
-     flags:需要完成的操作,取值如下
 
-         PURGE_RXABORT 终止所有未完成的重叠读取操作并立即返回,即使读取操作尚未完成。
 
-         PURGE_RXCLEAR 清除输入缓冲区(如果设备驱动程序有一个)。
 
-         PURGE_TXABORT 终止所有未完成的重叠写操作并立即返回,即使写操作尚未完成。
 
-         PURGE_TXCLEAR 清除输出缓冲区(如果设备驱动程序有一个)。
 
- * 返回: 正确返回为ture,错误返回为false
 
- * 提示:PurgeComm()函数可以在读写操作的同时,清空缓冲区。当应用程序在读写操作时
 
- 调用PurgeComm()函数,不能保证缓冲区内的所有字符都被发送。
 
- *******************************************************************/
 
- bool CGH_Relays::purgeBuff(DWORD flags)
 
- {
 
-     if (false == PurgeComm(hCom, flags))
 
-     {
 
-         setSerialLastError("SerialInterface::purgeBuff() : PurgeComm Error");
 
-         return false;
 
-     }
 
-     return true;
 
- }
 
- /*******************************************************************
 
- * 名称:flushBuff
 
- * 功能:刷新缓冲区
 
- * 参数:无
 
- * 返回:正确返回为ture,错误返回为false
 
- * 提示:该函数只受流量控制的支配,不受超时控制的支配,它在所有的写操作完成后才返回。
 
- *******************************************************************/
 
- bool CGH_Relays::flushBuff()
 
- {
 
-     if(FlushFileBuffers(hCom))
 
-     {
 
-         setSerialLastError("SerialInterface::flushBuff() : FlushFileBuffers Error");
 
-         return false;
 
-     }
 
-     return true;
 
- }
 
- /*******************************************************************
 
- * 名称: setBufferSize
 
- * 功能: 设置推荐的缓冲大小
 
- * 参数:
 
-     inputBuff:输入缓冲大小
 
-     outBuffer:输出缓冲大小
 
- * 返回: 正确返回为ture,错误返回为false
 
- *******************************************************************/
 
- bool CGH_Relays::setBufferSize(DWORD inputBuff,DWORD outBuffer)
 
- {
 
-     if(inputBuff<=0||outBuffer<=0)
 
-         return false;
 
-     
 
-     return SetupComm(hCom,inputBuff,outBuffer);
 
- }
 
- /*******************************************************************
 
- * 名称: getSerialLastError
 
- * 功能: 得到最后一次失败的错误信息
 
- * 参数: 无
 
- * 返回: 数据类型:string,错误信息
 
- *******************************************************************/
 
- string CGH_Relays::getSerialLastError()
 
- {
 
-     return last_error;
 
- }
 
- bool CGH_Relays::OpenUSB1()
 
- {
 
-     char OpenUSB1DataBuf[4];
 
-     OpenUSB1DataBuf[0] = 0xA0;
 
-     OpenUSB1DataBuf[1] = 0x01;
 
-     OpenUSB1DataBuf[2] = 0x01;
 
-     OpenUSB1DataBuf[3] = 0xA2;
 
-     if (writeData(OpenUSB1DataBuf, 4))
 
-     {
 
-         return true;
 
-     }
 
-     else
 
-     {
 
-         return false;
 
-     }
 
- }
 
- bool CGH_Relays::CloseUSB1()
 
- {
 
- 	char CloseUSB1DataBuf[4];
 
-     CloseUSB1DataBuf[0] = 0xA0;
 
-     CloseUSB1DataBuf[1] = 0x01;
 
-     CloseUSB1DataBuf[2] = 0x00;
 
-     CloseUSB1DataBuf[3] = 0xA1;
 
- 	if (writeData(CloseUSB1DataBuf, 4))
 
- 	{
 
- 		return true;
 
- 	}
 
- 	else
 
- 	{
 
- 		return false;
 
- 	}
 
- }
 
- bool CGH_Relays::OpenUSB2()
 
- {
 
- 	char OpenUSB2DataBuf[4];
 
- 	OpenUSB2DataBuf[0] = 0xA0;
 
- 	OpenUSB2DataBuf[1] = 0x02;
 
- 	OpenUSB2DataBuf[2] = 0x01;
 
- 	OpenUSB2DataBuf[3] = 0xA3;
 
- 	if (writeData(OpenUSB2DataBuf, 4))
 
- 	{
 
- 		return true;
 
- 	}
 
- 	else
 
- 	{
 
- 		return false;
 
- 	}
 
- }
 
- bool CGH_Relays::CloseUSB2()
 
- {
 
- 	char CloseUSB2DataBuf[4];
 
- 	CloseUSB2DataBuf[0] = 0xA0;
 
- 	CloseUSB2DataBuf[1] = 0x02;
 
- 	CloseUSB2DataBuf[2] = 0x00;
 
- 	CloseUSB2DataBuf[3] = 0xA2;
 
- 	if (writeData(CloseUSB2DataBuf, 4))
 
- 	{
 
- 		return true;
 
- 	}
 
- 	else
 
- 	{
 
- 		return false;
 
- 	}
 
- }
 
- void CGH_Relays::setSerialLastError(string error_msg)
 
- {
 
-     last_error = error_msg;
 
- }
 
- void CGH_Relays::clearSerialLastError()
 
- {
 
-     last_error = "";
 
- }
 
- CGH_Relays::CGH_Relays()
 
- {
 
-     hCom=NULL;
 
- }
 
- CGH_Relays::~CGH_Relays()
 
- {
 
- }
 
 
  |