void CPlaylistDoc::SendToComm(std::vector<PREINFO>& preinfo)
{
BOOL ret = FALSE;
int presetint = 0, address = 0;
TCHAR szCom[MAX_PATH] = {0};
CString strPath;
if (preinfo.empty())
return;
strPath = ::GetAppFolder();
strPath += _T("\\PresetBit.ini");
GetPrivateProfileString(_T("PreSetInfo"), _T("comnum"), _T("COM1"), szCom, MAX_PATH, strPath);
CString strCom;
strCom = szCom;
strCom = strCom.Mid(3);
int inum = _ttoi(strCom);
if (inum >= 10)
wsprintf(szCom, _T("\\\\.\\com%d"), inum);
else
wsprintf(szCom, _T("com%d"), inum);
HANDLE hCom=CreateFile(szCom, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);//同步方式
if(INVALID_HANDLE_VALUE == hCom)
{
WRITE_LOG(LogerPlst, 0, FALSE, _T("SendToComm(CreateFile Error.)"));
goto END;
}
ret = SetupComm(hCom, 512, 512);
if (FALSE == ret)
{
WRITE_LOG(LogerPlst, 0, FALSE, _T("SendToComm(SetupComm Error.)"));
goto END;
}
COMMTIMEOUTS timeouts;
ret = GetCommTimeouts(hCom, &timeouts);
if (FALSE == ret)
{
WRITE_LOG(LogerPlst, 0, FALSE, _T("SendToComm(GetCommTimeouts Error.)"));
goto END;
}
timeouts.ReadIntervalTimeout = 0;
timeouts.ReadTotalTimeoutMultiplier = 500;
timeouts.ReadTotalTimeoutConstant = 5000;
timeouts.WriteTotalTimeoutMultiplier = 500;
timeouts.WriteTotalTimeoutConstant = 5000;
ret = SetCommTimeouts(hCom, &timeouts);
if (FALSE == ret)
{
WRITE_LOG(LogerPlst, 0, FALSE, _T("SendToComm(SetCommTimeouts Error.)"));
goto END;
}
DCB dcb;
ret = GetCommState(hCom, &dcb);
if (FALSE == ret)
{
WRITE_LOG(LogerPlst, 0, FALSE, _T("SendToComm(GetCommState Error.)"));
goto END;
}
dcb.DCBlength = sizeof(DCB);
dcb.BaudRate = CBR_9600;
dcb.Parity = NOPARITY;
dcb.ByteSize = 8;
dcb.StopBits = ONESTOPBIT;
ret = SetCommState(hCom, &dcb);
if (FALSE == ret)
{
WRITE_LOG(LogerPlst, 0, FALSE, _T("SendToComm(SetCommState Error.)"));
goto END;
}
char Hex[] =
{
'0', '1', '2', '3',
'4', '5', '6', '7',
'8', '9', 'A', 'B',
'C', 'D', 'E', 'F'
};
std::vector<PREINFO>::iterator _pre = preinfo.begin();
while(_pre != preinfo.end())
{
if (_pre->presetbit>100 ||
_pre->presetbit<=0 ||
_pre->address<=0)
{
WRITE_LOG(LogerPlst, 0, FALSE, _T("SendToComm(Presetbit Set Error presetbit=%d.)"), _pre->presetbit);
_pre++;
continue;
}
presetint = _pre->presetbit-1;
address = _pre->address;
COMPROTOCOL pro;
memset(&pro, 0, sizeof(COMPROTOCOL));
int ahig = Hex[address>>4 & 0xff];
int alow = Hex[address & 0xff];
int phig = Hex[presetint/10];
int plow = Hex[presetint%10];
pro.SetValue(ahig, alow, 'R', phig, plow);
ret = PurgeComm(hCom, PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR|PURGE_TXABORT);//清空缓存
if (FALSE == ret)
{
WRITE_LOG(LogerPlst, 0, FALSE, _T("SendToComm(PurgeComm Error.)"));
goto END;
}
DWORD wCount;
ret = WriteFile(hCom, (char *)&pro, sizeof(COMPROTOCOL), &wCount, NULL);
if (FALSE == ret)
{
WRITE_LOG(LogerPlst, 0, FALSE, _T("SendToComm(WriteFile Error.)"));
goto END;
}
WRITE_LOG(LogerPlst, 0, FALSE, _T("SendToComm(WriteFile Sucess [%c%c%c%c%c%c%x].)"), pro.head, pro.adrhig, pro.adrlow, pro.cmd, pro.param1, pro.param2, pro.tail);
_pre++;
}
if (hCom)
{
CloseHandle(hCom);
hCom = NULL;
}
END:
if (hCom)
{
CloseHandle(hCom);
hCom = NULL;
}
}
{
BOOL ret = FALSE;
int presetint = 0, address = 0;
TCHAR szCom[MAX_PATH] = {0};
CString strPath;
if (preinfo.empty())
return;
strPath = ::GetAppFolder();
strPath += _T("\\PresetBit.ini");
GetPrivateProfileString(_T("PreSetInfo"), _T("comnum"), _T("COM1"), szCom, MAX_PATH, strPath);
CString strCom;
strCom = szCom;
strCom = strCom.Mid(3);
int inum = _ttoi(strCom);
if (inum >= 10)
wsprintf(szCom, _T("\\\\.\\com%d"), inum);
else
wsprintf(szCom, _T("com%d"), inum);
HANDLE hCom=CreateFile(szCom, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);//同步方式
if(INVALID_HANDLE_VALUE == hCom)
{
WRITE_LOG(LogerPlst, 0, FALSE, _T("SendToComm(CreateFile Error.)"));
goto END;
}
ret = SetupComm(hCom, 512, 512);
if (FALSE == ret)
{
WRITE_LOG(LogerPlst, 0, FALSE, _T("SendToComm(SetupComm Error.)"));
goto END;
}
COMMTIMEOUTS timeouts;
ret = GetCommTimeouts(hCom, &timeouts);
if (FALSE == ret)
{
WRITE_LOG(LogerPlst, 0, FALSE, _T("SendToComm(GetCommTimeouts Error.)"));
goto END;
}
timeouts.ReadIntervalTimeout = 0;
timeouts.ReadTotalTimeoutMultiplier = 500;
timeouts.ReadTotalTimeoutConstant = 5000;
timeouts.WriteTotalTimeoutMultiplier = 500;
timeouts.WriteTotalTimeoutConstant = 5000;
ret = SetCommTimeouts(hCom, &timeouts);
if (FALSE == ret)
{
WRITE_LOG(LogerPlst, 0, FALSE, _T("SendToComm(SetCommTimeouts Error.)"));
goto END;
}
DCB dcb;
ret = GetCommState(hCom, &dcb);
if (FALSE == ret)
{
WRITE_LOG(LogerPlst, 0, FALSE, _T("SendToComm(GetCommState Error.)"));
goto END;
}
dcb.DCBlength = sizeof(DCB);
dcb.BaudRate = CBR_9600;
dcb.Parity = NOPARITY;
dcb.ByteSize = 8;
dcb.StopBits = ONESTOPBIT;
ret = SetCommState(hCom, &dcb);
if (FALSE == ret)
{
WRITE_LOG(LogerPlst, 0, FALSE, _T("SendToComm(SetCommState Error.)"));
goto END;
}
char Hex[] =
{
'0', '1', '2', '3',
'4', '5', '6', '7',
'8', '9', 'A', 'B',
'C', 'D', 'E', 'F'
};
std::vector<PREINFO>::iterator _pre = preinfo.begin();
while(_pre != preinfo.end())
{
if (_pre->presetbit>100 ||
_pre->presetbit<=0 ||
_pre->address<=0)
{
WRITE_LOG(LogerPlst, 0, FALSE, _T("SendToComm(Presetbit Set Error presetbit=%d.)"), _pre->presetbit);
_pre++;
continue;
}
presetint = _pre->presetbit-1;
address = _pre->address;
COMPROTOCOL pro;
memset(&pro, 0, sizeof(COMPROTOCOL));
int ahig = Hex[address>>4 & 0xff];
int alow = Hex[address & 0xff];
int phig = Hex[presetint/10];
int plow = Hex[presetint%10];
pro.SetValue(ahig, alow, 'R', phig, plow);
ret = PurgeComm(hCom, PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR|PURGE_TXABORT);//清空缓存
if (FALSE == ret)
{
WRITE_LOG(LogerPlst, 0, FALSE, _T("SendToComm(PurgeComm Error.)"));
goto END;
}
DWORD wCount;
ret = WriteFile(hCom, (char *)&pro, sizeof(COMPROTOCOL), &wCount, NULL);
if (FALSE == ret)
{
WRITE_LOG(LogerPlst, 0, FALSE, _T("SendToComm(WriteFile Error.)"));
goto END;
}
WRITE_LOG(LogerPlst, 0, FALSE, _T("SendToComm(WriteFile Sucess [%c%c%c%c%c%c%x].)"), pro.head, pro.adrhig, pro.adrlow, pro.cmd, pro.param1, pro.param2, pro.tail);
_pre++;
}
if (hCom)
{
CloseHandle(hCom);
hCom = NULL;
}
END:
if (hCom)
{
CloseHandle(hCom);
hCom = NULL;
}
}