贴一个使用串口的方法

来源:互联网 发布:淘宝怎么提前收款 编辑:程序博客网 时间:2024/05/29 18:21
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;
}


}