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()
- {
- }
|