C++ 串口发送数据,连续2次发送必须相隔10s以上。否则发送数据设备无反应?请问代码错在哪里?
bool MyProt::OpenProt(CString ProtSel, CString BaudRate, CString DataBit, CString CheckDigit, CString StopBit)
{
//打开端口
m_hProtHandle = CreateFile(ProtSel,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
FILE_FLAG_OVERLAPPED,
NULL
);
if (INVALID_HANDLE_VALUE == m_hProtHandle)
{
DWORD err = GetLastError();
AfxMessageBox(_T("CreateFile Fail "));
return false;
}
else
{
//串口配置
SetupComm(m_hProtHandle, 1024, 1024);//输入缓冲区和输出缓冲区的大小都是1024
COMMTIMEOUTS TimeOuts; //设定读超时
TimeOuts.ReadIntervalTimeout = MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier = 0;
TimeOuts.ReadTotalTimeoutConstant = 0; //设定写超时
TimeOuts.WriteTotalTimeoutMultiplier = 3;
TimeOuts.WriteTotalTimeoutConstant = 2;
SetCommTimeouts(m_hProtHandle, &TimeOuts); //设置超时
DCB dcb;
GetCommState(m_hProtHandle, &dcb);
//波特率选择
switch (_ttoi(BaudRate))
{
case 9600:
dcb.BaudRate = 9600; //波特率为9600
break;
case 19200:
dcb.BaudRate = 19200; //波特率为9600
break;
case 38400:
dcb.BaudRate = 38400; //波特率为9600
break;
case 57600:
dcb.BaudRate = 57600; //波特率为9600
break;
case 115200:
dcb.BaudRate = 115200; //波特率为9600
break;
}
//数据位选择
switch (_ttoi(DataBit))
{
case 5:
dcb.ByteSize = 5; //每个字节有8位
break;
case 6:
dcb.ByteSize = 6; //每个字节有8位
break;
case 7:
dcb.ByteSize = 7; //每个字节有8位
break;
case 8:
dcb.ByteSize = 8; //每个字节有8位
break;
}
//奇偶校验位
if (_T("无") == CheckDigit)
{
dcb.Parity = NOPARITY; //无奇偶校验位
}
else if (_T("奇") == CheckDigit)
{
dcb.Parity = ODDPARITY; //无奇偶校验位
}
else if (_T("偶") == CheckDigit)
{
dcb.Parity = EVENPARITY; //无奇偶校验位
}
//停止位
switch (_ttoi(StopBit))
{
case 0:
dcb.StopBits = ONESTOPBIT; //0个停止位
break;
case 1:
dcb.StopBits = ONE5STOPBITS; //1个停止位
break;
case 2:
dcb.StopBits = TWOSTOPBITS; //2个停止位
break;
}
if (!SetCommState(m_hProtHandle, &dcb))
{
AfxMessageBox(_T("串口配置失败"));
return false;
}
PurgeComm(m_hProtHandle, PURGE_TXCLEAR | PURGE_RXCLEAR);
}
return true;
}
//写串口
void MyProt::WriteProt(CString str)
{
char *pchar = new char[1024];
pchar = Cst2Cchar(str, pchar);
DWORD dwBytesWritten = 1024;
DWORD dwErrorFlags;
COMSTAT ComStat;
OVERLAPPED m_osWrite;
BOOL bWriteStat;
memset(&m_osWrite, 0, sizeof(OVERLAPPED));//初始化均为0
PurgeComm(m_hProtHandle, PURGE_TXCLEAR | PURGE_RXCLEAR);//函数清空缓冲区
bWriteStat = WriteFile(m_hProtHandle, pchar, dwBytesWritten, &dwBytesWritten, &m_osWrite);
if (!bWriteStat)
{
if (GetLastError() == ERROR_IO_PENDING)
{
WaitForSingleObject(m_osWrite.hEvent, 1000);
}
}
delete[]pchar;
pchar = NULL;
}
char* MyProt::Cst2Cchar(CString str, char* pchar)
{
//获取宽字节字符的大小,大小是按字节计算的
int len = WideCharToMultiByte(CP_ACP, 0, str, str.GetLength(), NULL, 0, NULL, NULL);
//以字节为单位
char * pFileName = new char[len + 1];
//宽字节编码转换成多字节编码
WideCharToMultiByte(CP_ACP, 0, str, str.GetLength() + 1, pFileName, len + 1, NULL, NULL);
//多字节字符以'\0'结束
pFileName[len] = '\0';
//内存复制
memcpy(pchar, pFileName, len + 1);
//删除内存
delete[]pFileName;
pFileName = NULL;
return pchar;
}