#include "common.h" /*******************************************************************************************  * 功能     : 打开串口 * port     : 串口号, 如("COM1") * baud_rate: 波特率 * date_bits: 数据位(有效范围4~8) * stop_bit : 停止位 * parity   : 奇偶校验。默认为无校验。NOPARITY 0; ODDPARITY 1;EVENPARITY 2 ********************************************************************************************/ HANDLE Init_COM(LPCTSTR Port, int baud_rate, BYTE date_bits, BYTE stop_bit, BYTE parity) { HANDLE Handle_Com = CreateFile(Port, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);//同步方式打开串口 if (INVALID_HANDLE_VALUE == Handle_Com) { return INVALID_HANDLE_VALUE; } SetupComm(Handle_Com, 4096, 4096);//设置缓存 DCB dcb; if (!GetCommState(Handle_Com, &dcb)) { cout << "获取串口配置失败" << endl; } dcb.BaudRate = baud_rate; //波特率 dcb.fBinary = TRUE; //二进制模式。必须为TRUE dcb.ByteSize = date_bits; //数据位。范围4-8 if (stop_bit == 0) dcb.StopBits = ONESTOPBIT; //停止位 if (stop_bit == 1) dcb.StopBits = ONE5STOPBITS; //停止位 if (stop_bit == 2) dcb.StopBits = TWOSTOPBITS; //停止位 if (parity == NOPARITY) { dcb.fParity = FALSE; //奇偶校验关闭 dcb.Parity = parity; //校验模式 } else { dcb.fParity = TRUE; //奇偶校验开启 dcb.Parity = parity; //校验模式 } cout << SetCommState(Handle_Com, &dcb) << endl; PurgeComm(Handle_Com, PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR | PURGE_TXABORT);//清除缓存 //设置串口读写时间 COMMTIMEOUTS CommTimeOuts; GetCommTimeouts(Handle_Com, &CommTimeOuts); CommTimeOuts.ReadIntervalTimeout = 5; CommTimeOuts.ReadTotalTimeoutMultiplier = 1; CommTimeOuts.ReadTotalTimeoutConstant = 0; CommTimeOuts.WriteTotalTimeoutMultiplier = 10; CommTimeOuts.WriteTotalTimeoutConstant = 1000; if (!SetCommTimeouts(Handle_Com, &CommTimeOuts)) { return INVALID_HANDLE_VALUE; } return Handle_Com; } /********************************************************************************************* * 功能     :  发送响应数据 * 描述    : 向串口写入数据 * 返回值 : true 发送成功 false 发送失败 * m_hComm : 串口句柄 * data : 要写入的数据 * len : 写入数据的长度 **********************************************************************************************/ bool SendData(HANDLE m_hComm, char* data, int len) { if (m_hComm == INVALID_HANDLE_VALUE) return FALSE; //清空串口 PurgeComm(m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR); //写串口 DWORD dwWrite = 0; DWORD dwRet = WriteFile(m_hComm, data, len, &dwWrite, NULL); //清空串口 PurgeComm(m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR); if (!dwRet) return FALSE; return TRUE; } /********************************************************************************************* * 功能     :  Ms延时器 * 描述    : ms级准确延时 * 输入 : lTime 延时的ms数 * 返回值 : 无 **********************************************************************************************/ void MSleep(long lTime) { LARGE_INTEGER litmp; LONGLONG QPart1, QPart2; double dfMinus, dfFreq, dfTim, dfSpec; QueryPerformanceFrequency(&litmp); dfFreq = (double)litmp.QuadPart; QueryPerformanceCounter(&litmp); QPart1 = litmp.QuadPart; dfSpec = 0.000001*lTime; do { QueryPerformanceCounter(&litmp); QPart2 = litmp.QuadPart; dfMinus = (double)(QPart2 - QPart1); dfTim = dfMinus / dfFreq; } while (dfTim