Com0Com 中DCB 结构默认值问题

本文详细对比了打开超级终端前后DCB(Data Communication Control Block)结构的默认设置,发现打开后BaudRate变为115200,fTXContinueOnXoff和fAbortOnError置为1,其他参数保持不变,这可能影响串口通信的行为。

打开超级终端前

-  &dcb 0x0012f1c0 {DCBlength=28 BaudRate=115200 fBinary=1 ...} _DCB *
  DCBlength 28 unsigned long
  BaudRate 115200 unsigned long
  fBinary 1 unsigned long
  fParity 0 unsigned long
  fOutxCtsFlow 0 unsigned long
  fOutxDsrFlow 0 unsigned long
  fDtrControl 1 unsigned long
  fDsrSensitivity 0 unsigned long
  fTXContinueOnXoff 0 unsigned long
  fOutX 0 unsigned long
  fInX 0 unsigned long
  fErrorChar 0 unsigned long
  fNull 0 unsigned long
  fRtsControl 1 unsigned long
  fAbortOnError 0 unsigned long
  fDummy2 0 unsigned long
  wReserved 0 unsigned short
  XonLim 2048 unsigned short
  XoffLim 512 unsigned short
  ByteSize 8 '␈' unsigned char
  Parity 0 unsigned char
  StopBits 0 unsigned char
  XonChar 17 '␑' char
  XoffChar 19 '␓' char
  ErrorChar 0 char
  EofChar 0 char
  EvtChar 0 char
  wReserved1 0 unsigned short

 

打开超级终端后

-  &dcb 0x0012f1c0 {DCBlength=28 BaudRate=115200 fBinary=1 ...} _DCB *
  DCBlength 28 unsigned long
  BaudRate 115200 unsigned long
  fBinary 1 unsigned long
  fParity 0 unsigned long
  fOutxCtsFlow 0 unsigned long
  fOutxDsrFlow 0 unsigned long
  fDtrControl 1 unsigned long
  fDsrSensitivity 0 unsigned long
  fTXContinueOnXoff 1 unsigned long
  fOutX 0 unsigned long
  fInX 0 unsigned long
  fErrorChar 0 unsigned long
  fNull 0 unsigned long
  fRtsControl 1 unsigned long
  fAbortOnError 1 unsigned long
  fDummy2 0 unsigned long
  wReserved 0 unsigned short
  XonLim 2048 unsigned short
  XoffLim 512 unsigned short
  ByteSize 8 '␈' unsigned char
  Parity 0 unsigned char
  StopBits 0 unsigned char
  XonChar 17 '␑' char
  XoffChar 19 '␓' char
  ErrorChar 0 char
  EofChar 0 char
  EvtChar 0 char
  wReserved1 0 unsigned short

打开超级终端前

-  &dcb 0x0012f1e8 {DCBlength=28 BaudRate=2400 fBinary=1 ...} _DCB *
  DCBlength 28 unsigned long
  BaudRate 2400 unsigned long
  fBinary 1 unsigned long
  fParity 0 unsigned long
  fOutxCtsFlow 0 unsigned long
  fOutxDsrFlow 0 unsigned long
  fDtrControl 1 unsigned long
  fDsrSensitivity 0 unsigned long
  fTXContinueOnXoff 1 unsigned long
  fOutX 0 unsigned long
  fInX 0 unsigned long
  fErrorChar 0 unsigned long
  fNull 0 unsigned long
  fRtsControl 1 unsigned long
  fAbortOnError 1 unsigned long
  fDummy2 0 unsigned long
  wReserved 0 unsigned short
  XonLim 2048 unsigned short
  XoffLim 512 unsigned short
  ByteSize 8 '␈' unsigned char
  Parity 0 unsigned char
  StopBits 0 unsigned char
  XonChar 17 '␑' char
  XoffChar 19 '␓' char
  ErrorChar 0 char
  EofChar 0 char
  EvtChar 0 char
  wReserved1 0 unsigned short

 

打开超级终端后

-  &dcb 0x0012f1e8 {DCBlength=28 BaudRate=115200 fBinary=1 ...} _DCB *
  DCBlength 28 unsigned long
  BaudRate 115200 unsigned long
  fBinary 1 unsigned long
  fParity 0 unsigned long
  fOutxCtsFlow 0 unsigned long
  fOutxDsrFlow 0 unsigned long
  fDtrControl 1 unsigned long
  fDsrSensitivity 0 unsigned long
  fTXContinueOnXoff 1 unsigned long
  fOutX 0 unsigned long
  fInX 0 unsigned long
  fErrorChar 0 unsigned long
  fNull 0 unsigned long
  fRtsControl 1 unsigned long
  fAbortOnError 1 unsigned long
  fDummy2 0 unsigned long
  wReserved 0 unsigned short
  XonLim 2048 unsigned short
  XoffLim 512 unsigned short
  ByteSize 8 '␈' unsigned char
  Parity 0 unsigned char
  StopBits 0 unsigned char
  XonChar 17 '␑' char
  XoffChar 19 '␓' char
  ErrorChar 0 char
  EofChar 0 char
  EvtChar 0 char
  wReserved1 0 unsigned short

 

bool CMETADlg::checksw() { CString strPort; strPort.Format(_T(“\\.\COM%s”), m_ATport); // 以独占模式打开 hDutHandle = CreateFile(strPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); COMMTIMEOUTS timeouts = { 0 }; timeouts.ReadIntervalTimeout = 50; // 字符间超时 timeouts.ReadTotalTimeoutMultiplier = 10;// 每字节读取时间 timeouts.ReadTotalTimeoutConstant = 1000;// 固定等待时间 SetCommTimeouts(hDutHandle, &timeouts); if (hDutHandle == INVALID_HANDLE_VALUE) { DWORD err = GetLastError(); CString msg; msg.Format(_T("CreateFile 失败,错误码: %d"), err); AfxMessageBox(msg); return false; } // 获取当前 DCB 配置(必须调用) DCB dcb = { 0 }; dcb.DCBlength = sizeof(DCB); if (!GetCommState(hDutHandle, &dcb)) { DWORD err = GetLastError(); CString msg; msg.Format(_T("GetCommState 失败,错误码: %d"), err); AfxMessageBox(msg); CloseHandle(hDutHandle); return false; } // 强制覆盖为 SSCOM 的配置(逐项赋值) dcb.BaudRate = CBR_115200; // 必须使用预定义常量 dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; dcb.fBinary = TRUE; dcb.fParity = FALSE; dcb.fOutxCtsFlow = FALSE; dcb.fOutxDsrFlow = FALSE; dcb.fDtrControl = DTR_CONTROL_DISABLE; dcb.fRtsControl = RTS_CONTROL_DISABLE; dcb.fInX = FALSE; dcb.fOutX = FALSE; dcb.XonChar = 0x11; // 默认值 dcb.XoffChar = 0x13; // 默认值 dcb.XonLim = 2048; dcb.XoffLim = 512; // 设置 DCB if (!SetCommState(hDutHandle, &dcb)) { DWORD err = GetLastError(); CString msg; msg.Format(_T("SetCommState 失败,错误码: %d"), err); AfxMessageBox(msg); CloseHandle(hDutHandle); return false; } DWORD bytesRead; while (1) { viOpenDefaultRM(&m_viDefaultRM2); if (atoi(elepower) == 0) { if (VI_SUCCESS == viOpen(m_viDefaultRM2, "GPIB0::12::INSTR", VI_NULL, VI_NULL, &m_viInstr2)) { int ncount = 0; dInitialVol = 0; viPrintf(m_viInstr2,"OUT 0\n"); Sleep(5000); viPrintf(m_viInstr2, "OUT 1\n"); viPrintf(m_viInstr2, "%s%s%s\n", "VSET 3.6\n", "ISET 2.0\n", "OUT 1\n"); viClose(m_viInstr2); viClose(m_viDefaultRM2); } else { viClose(m_viDefaultRM2); return false; } } else { if (VI_SUCCESS == viOpen(m_viDefaultRM2, "GPIB0::5::INSTR", VI_NULL, VI_NULL, &m_viInstr2)) { int ncount = 0; dInitialVol = 0; viPrintf(m_viInstr2, "OUTPUT OFF\n"); Sleep(5000); viPrintf(m_viInstr2, "OUTPUT ON\n"); viPrintf(m_viInstr2, "VOLT 3.6\n"); viClose(m_viInstr2); viClose(m_viDefaultRM2); } else { viClose(m_viDefaultRM2); return false; } } m_info = ""; ReadFile(hDutHandle, readbuff, sizeof(readbuff) - 1, &bytesRead, NULL); m_info += readbuff; if (m_info.Find("PreBirth") == -1) { } else { break; } } //m_info = m_info.Mid(m_info.Find("started") + 7, m_info.Find("GitSHA1") - m_info.Find("started") - 7); TestItem = "读取用户固件版本"; TestResult = "PASS"; ItemDisplay(TestItem, TestResult, m_info, "", "", ""); strcat(cTestLog, "用户软件版本:"); strcat(cTestLog, m_info); strcat(cTestLog, "\r\n"); if (m_info.Find(usersw) == -1) { TestItem = "用户固件版本比对失败"; TestResult = "FAIL"; ItemDisplay(TestItem, TestResult, "", "", "", ""); CloseHandle(hDutHandle); return false; } else { TestItem = "用户固件版本比对成功"; TestResult = "PASS"; ItemDisplay(TestItem, TestResult, "", "", "", ""); CloseHandle(hDutHandle); return true; } } void CMETADlg::WriteLogToFile() { FILE *fplog, *fp21log; char cFileName[256] = { 0 }, c21LogName[256] = { 0 }; char cLog[9000] = “”; char cDate[20], cTime[20]; char tmpbuf[80]; CString sdate, Currentlogpath; time_t tt; tt = time(NULL); strftime(tmpbuf, 80, “%Y-%m-%d_%H:%M:%S\n”, localtime(&tt)); strncpy(cDate, tmpbuf, 10); cDate[10] = ‘\0’; sdate = cDate; memcpy(cTime, tmpbuf + 11, 8); cTime[8] = ‘\0’; strcpy(cFileName, “.\log\”); strcat(cFileName, dmc); strcat(cFileName, “.log”); strcpy(c21LogName, "\\\\192.168.0.21\\Asslog\\CT01\\checksw\\"); strcat(c21LogName, cDate); strcat(c21LogName, ".log"); strcpy(cLog, cDate); strcat(cLog, " "); strcat(cLog, cTime); strcat(cLog, "\r\n"); strcat(cLog, cTestLog); strcat(cLog, "\r\n"); fp21log = fopen(c21LogName, "a+"); if (fp21log) { fprintf(fp21log, "%s", cLog); } else { MessageBox(_T("未能打开目标文件"), TEXT("警告"), MB_OK); } fclose(fp21log); } void CMETADlg::WritePcbSql() { char cmd[300] = { 0 }; int iRecordCount = 1; _variant_t varTemp; _ConnectionPtr m_pConnection; // 数据库 _RecordsetPtr m_pRecordset; // 命令 _CommandPtr m_pCommand; // 记录 ::CoInitialize(NULL); //初始化OLE/COM库环境 HRESULT hr = NULL; try { hr = m_pConnection.CreateInstance(_uuidof(Connection));//创建连接对象实例 if (SUCCEEDED(hr)) { m_pConnection->ConnectionString = (“Provider = SQLOLEDB.1; Persist Security Info = True;User ID = jvmmesdev; Password = MB%dev@mes; Initial Catalog = suivi; Data Source = 192.168.0.5”); hr = m_pConnection->Open("", "", "", adConnectUnspecified);//打开数据库 if (FAILED(hr)) { AfxMessageBox(_T("Open Failed!")); } } else { AfxMessageBox(_T("Create instance of connection failed!")); } } catch (_com_error e) { CString temp; temp.Format(_T("数据库连接错误\r\n错误信息为:%s"), e.ErrorMessage()); AfxMessageBox(temp); } try { memset(cmd, '0', 300); sprintf_s(cmd, 300, "%s%s'", "select * from sn_record where workstation = 'ASSY_CHECKSW' and ni_num = '", dmc); cmd[strlen(cmd)] = '\0'; //MessageBox(NULL,cmd,TEXT("CMD0"),MB_OK); m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open(_bstr_t(cmd), _variant_t((IDispatch*)m_pConnection, true), adOpenStatic, adLockOptimistic, adCmdText); if (m_pRecordset->adoEOF) { iRecordCount = 0; //表示没有记录 } else { iRecordCount = 1; //表示有记录 } } catch (_com_error& e) { MessageBox(e.Description(), TEXT("select sn_record"), MB_OK); } if (bTestResult) { if (iRecordCount > 0)//更新 { try { //strcpy(cmd,""); memset(cmd, '0', 300); sprintf_s(cmd, 300, "%s%s%s%s%s\n", "update sn_record set workstation = 'ASSY_CHECKSW' ,countoftest = '0',ni_status = 'VALID',defectname = '',createddate = getdate(),Tableid = '", m_table, "' where ni_num = '", dmc, "' and workstation = 'ASSY_CHECKSW'"); cmd[strlen(cmd)] = '\0'; m_pRecordset.CreateInstance("ADODB.Recordset"); //MultiByteToWideChar(CP_ACP, 0, cmd, -1, aaa, strlen(cmd)); //MessageBox(NULL,aaa,TEXT("PASS更新SQL"),MB_OK); m_pRecordset->Open(_bstr_t(cmd), _variant_t((IDispatch*)m_pConnection, true), adOpenStatic, adLockOptimistic, adCmdText); } catch (_com_error& e) { //MessageBox(NULL,_T("8"),TEXT("Warning"),MB_OK); //MessageBox(NULL,e.Description(),TEXT("Warning"),MB_OK); MessageBox(e.Description(), TEXT("update sn_record"), MB_OK); } } else { //SMT_DL try { //strcpy(cmd,""); memset(cmd, '0', 300); if (atoi(m_line) < 10) { sprintf_s(cmd, 300, "%s%s%s%s%s%s%s%s%s\n", "insert into sn_record values( '", dmc, "','ASSY_CHECKSW' ,'VALID','0','',getdate(),'S0", m_line, "','", m_table, "','", ProdCode, "')"); } else { sprintf_s(cmd, 300, "%s%s%s%s%s%s%s%s%s\n", "insert into sn_record values( '", dmc, "','ASSY_CHECKSW' ,'VALID','0','',getdate(),'S", m_line, "','", m_table, "','", ProdCode, "')"); } cmd[strlen(cmd)] = '\0'; m_pRecordset.CreateInstance("ADODB.Recordset"); //MultiByteToWideChar(CP_ACP, 0, cmd, -1, aaa, strlen(cmd)); //MessageBox(NULL,aaa,TEXT("PASS插入SQL"),MB_OK); m_pRecordset->Open(_bstr_t(cmd), _variant_t((IDispatch*)m_pConnection, true), adOpenStatic, adLockOptimistic, adCmdText); } catch (_com_error& e) { MessageBox(e.Description(), TEXT("insert sn_record"), MB_OK); } } } else//失败 { } try { m_pConnection->Close();//关闭数据库 m_pConnection.Release();//释放连接对象指针 } catch (_com_error &e) { AfxMessageBox(e.Description()); AfxMessageBox(e.HelpFile()); } CoUninitialize(); //释放COM环境 return; } //底座初始化 bool CMETADlg::InitDutComPort_Ex()//,char StrCom[5]) { DCB dcb = { 0 }; DWORD cnt, cnt_ex; char ReadBuf[30] = { 0 }, StrCom[10] = { 0 }; CString m_dutport = “1”; char datareadbuff[1] = { 0 }; char outputchar[2048] = { 0 }; int i = 0; //AfxMessageBox(“串口监控开始”); sprintf(StrCom, “\\.\COM%d”, atoi(controldutport)); //整型 hDutHandle = CreateFile(StrCom, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);//FILE_FLAG_OVERLAPPED, //同步方式 或 重叠方式0 if (hDutHandle == INVALID_HANDLE_VALUE) { AfxMessageBox(“00”); return false; } dcb.DCBlength = sizeof(dcb); GetCommState(hDutHandle, &dcb); dcb.BaudRate = 9600; //波特率 dcb.fBinary = TRUE; dcb.fParity = TRUE; dcb.ByteSize = 8; //位数 dcb.Parity = NOPARITY; //奇偶检验 dcb.StopBits = ONESTOPBIT; //停止位数 if (!SetCommState(hDutHandle, &dcb)) { AfxMessageBox(“11”); return false; } if (!PurgeComm(hDutHandle, PURGE_RXCLEAR)) { AfxMessageBox(“22”); return false; } SetupComm(hDutHandle, 512, 512); TestItem = "底座初始化"; TestResult = "PASS"; ItemDisplay(TestItem, TestResult, "", "", "", ""); UpdateStatus(); CloseHandle(hDutHandle); //AfxMessageBox("下压了"); return true; } //检查单片机 下压信号 bool CMETADlg::InitDutComPort()//,char StrCom[5]) { DCB dcb = { 0 }; DWORD cnt, cnt_ex; char ReadBuf[30] = { 0 }, StrCom[10] = { 0 }; char datareadbuff[1] = { 0 }; char outputchar[2048] = { 0 }; int i = 0; //AfxMessageBox("串口监控开始"); sprintf(StrCom, "\\\\.\\COM%d", atoi(controldutport)); //整型 hDutHandle = CreateFile(StrCom, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);//FILE_FLAG_OVERLAPPED, //同步方式 或 重叠方式0 if (hDutHandle == INVALID_HANDLE_VALUE) { AfxMessageBox("00"); return false; } dcb.DCBlength = sizeof(dcb); GetCommState(hDutHandle, &dcb); dcb.BaudRate = 19200; //波特率 dcb.fBinary = TRUE; dcb.fParity = TRUE; dcb.ByteSize = 8; //位数 dcb.Parity = NOPARITY; //奇偶检验 dcb.StopBits = ONESTOPBIT; //停止位数 if (!SetCommState(hDutHandle, &dcb)) { AfxMessageBox("11"); return false; } if (!PurgeComm(hDutHandle, PURGE_RXCLEAR)) { AfxMessageBox("22"); return false; } SetupComm(hDutHandle, 512, 512); //m_text += "等待手机连接!\r\n"; //m_text += \r\n; //UpdateText(); GetDlgItem(IDOK)->EnableWindow(FALSE); COMMTIMEOUTS timeouts = { 0 }; timeouts.ReadIntervalTimeout = 50; // 字符间超时 timeouts.ReadTotalTimeoutMultiplier = 10;// 每字节读取时间 timeouts.ReadTotalTimeoutConstant = 1000;// 固定等待时间 SetCommTimeouts(hDutHandle, &timeouts); while (true) //判断是否需要开始 { //MessageBox(NULL,_T("22"), _T("提示"), MB_OK); memset(ReadBuf, 0, sizeof(ReadBuf)); Sleep(50); ReadFile(hDutHandle, &ReadBuf, 4, &cnt, 0); ReadBuf[4] = '\0'; //AfxMessageBox(ReadBuf); if ((ReadBuf[0] == 'S') && (ReadBuf[1] == 'T') && (ReadBuf[2] == 'A')) //STAT 上料 //if(strstr(ReadBuf,"READY")!=NULL) { //MessageBox(NULL,_T("下压了"), _T("提示"), MB_OK); break; } } CloseHandle(hDutHandle); //AfxMessageBox("下压了"); return true; } bool CMETADlg::AutoScanCie(CString& strScanInfo) { HANDLE hScanCom; DCB dcb = { 0 }; DWORD cnt; char ReadBuf[65] = { 0 }; unsigned char ScanCmd[2] = { 0X1b,0X31 }; bool bResult = true; COMMTIMEOUTS TimeOuts;//设定读超时 char strScanCom[30] = { 0 }; char szTemp_Barcode[65] = { 0 }; //AfxMessageBox(scandutport); sprintf_s(strScanCom, "\\\\.\\COM%d", atoi(scandutport)); //整型 hScanCom = CreateFileA(strScanCom, GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); //参考这个语法 if (hScanCom == INVALID_HANDLE_VALUE) { return false; } //设定读超时 TimeOuts.ReadIntervalTimeout = 0; //ms为单位,0表示不设置两个字符之间的间隔 TimeOuts.ReadTotalTimeoutMultiplier = 30; //每个字节 TimeOuts.ReadTotalTimeoutConstant = 100; //300*11+2000总时间 //设定写超时 TimeOuts.WriteTotalTimeoutMultiplier = 0; TimeOuts.WriteTotalTimeoutConstant = 0; SetCommTimeouts(hScanCom, &TimeOuts);//设置超时 dcb.DCBlength = sizeof(dcb); GetCommState(hScanCom, &dcb); dcb.BaudRate = 115200; //波特率 dcb.fBinary = TRUE; dcb.fParity = TRUE; dcb.ByteSize = 8; //位数 dcb.Parity = NOPARITY; //奇偶检验 dcb.StopBits = ONESTOPBIT; //停止位数 if (!SetCommState(hScanCom, &dcb)) { //MessageBox(NULL, _T("掩码设置失败!"), _T("扫描枪警告"), MB_ICONWARNING); AfxMessageBox("扫描枪掩码设置失败!"); return false; } if (!PurgeComm(hScanCom, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT))//PURGE_TXCLEAR 清除输出缓冲区//PURGE_RXCLEAR 清除输入缓冲区 { //清空串口所有操作 //MessageBox(NULL, _T("串口清空失败!"), _T("扫描枪警告"), MB_ICONWARNING); AfxMessageBox("扫描枪串口清空失败!"); return false; } SetupComm(hScanCom, 512, 512); /******add by andy_h for clear buff***************/ char datareadbuff[2] = { 0 }; char outputchar[2048] = { 0 }; int i = 0; DWORD cnt_Ex = 1; bool bResult_Ex = true; while (cnt_Ex) { memset(datareadbuff, 0, 2); bResult_Ex = ReadFile(hScanCom, &datareadbuff, 1, &cnt_Ex, NULL); if (!bResult_Ex) { break; } strcat(outputchar, datareadbuff); i++; } /******add by andy_h for clear buff***************/ Sleep(100); //MessageBox(NULL, _T("发送1b31指令!"), _T("提示"), MB_ICONWARNING); WriteFile(hScanCom, ScanCmd, 2, &cnt, NULL); //1b\\31 memset(ReadBuf, 0, sizeof(ReadBuf)); Sleep(2000); //MessageBox(NULL, _T("读数据了!"), _T("提示"), MB_ICONWARNING); bResult = ReadFile(hScanCom, &ReadBuf, SN_LENGTH + 1, &cnt, 0); // //MultiByteToWideChar(CP_ACP, 0, ReadBuf, -1, TReadBuf, strlen(ReadBuf)); //MessageBox(NULL, TReadBuf, _T("读出的数据"), MB_ICONWARNING); CloseHandle(hScanCom); if (!bResult) { return false; } //AfxMessageBox(ReadBuf); memcpy(szTemp_Barcode, ReadBuf + 1, SN_LENGTH);/// //大写转换一次 CString m_snup = ""; USES_CONVERSION; m_snup = A2T(szTemp_Barcode); //m_snup.MakeUpper(); strScanInfo = m_snup; //AfxMessageBox(strScanInfo); return true; }详细解释上面每一行代码的意思
最新发布
08-22
#include "WZSerialPort.h" #include <stdio.h> #include <string.h> #include <WinSock2.h> #include <windows.h> #include<iostream> using namespace std; WZSerialPort::WZSerialPort() { } WZSerialPort::~WZSerialPort() { } bool WZSerialPort::open(const char* portname, int baudrate, char parity, char databit, char stopbit, char synchronizeflag) { this->synchronizeflag = synchronizeflag; HANDLE hCom = NULL; if (this->synchronizeflag) { //同步方式 hCom = CreateFileA(portname, //串口名 GENERIC_READ | GENERIC_WRITE, //支持读写 0, //独占方式,串口不支持共享 NULL,//安全属性指针,默认值为NULL OPEN_EXISTING, //打开现有的串口文件 0, //0:同步方式,FILE_FLAG_OVERLAPPED:异步方式 NULL);//用于复制文件句柄,默认值为NULL,对串口而言该参数必须置为NULL } else { //异步方式 hCom = CreateFileA(portname, //串口名 GENERIC_READ | GENERIC_WRITE, //支持读写 0, //独占方式,串口不支持共享 NULL,//安全属性指针,默认值为NULL OPEN_EXISTING, //打开现有的串口文件 FILE_FLAG_OVERLAPPED, //0:同步方式,FILE_FLAG_OVERLAPPED:异步方式 NULL);//用于复制文件句柄,默认值为NULL,对串口而言该参数必须置为NULL } if(hCom == (HANDLE)-1) { return false; } //配置缓冲区大小 if(! SetupComm(hCom,1024, 1024)) { return false; } // 配置参数 DCB p; memset(&p, 0, sizeof(p)); p.DCBlength = sizeof(p); p.BaudRate = baudrate; // 波特率 p.ByteSize = databit; // 数据位 switch (parity) //校验位 { case 0: p.Parity = NOPARITY; //无校验 break; case 1: p.Parity = ODDPARITY; //奇校验 break; case 2: p.Parity = EVENPARITY; //偶校验 break; case 3: p.Parity = MARKPARITY; //标记校验 break; } switch(stopbit) //停止位 { case 1: p.StopBits = ONESTOPBIT; //1位停止位 break; case 2: p.StopBits = TWOSTOPBITS; //2位停止位 break; case 3: p.StopBits = ONE5STOPBITS; //1.5位停止位 break; } if(! SetCommState(hCom, &p)) { // 设置参数失败 return false; } //超时处理,单位:毫秒 //总超时=时间系数×读或写的字符数+时间常量 COMMTIMEOUTS TimeOuts; TimeOuts.ReadIntervalTimeout = 1000; //读间隔超时 TimeOuts.ReadTotalTimeoutMultiplier = 500; //读时间系数 TimeOuts.ReadTotalTimeoutConstant = 5000; //读时间常量 TimeOuts.WriteTotalTimeoutMultiplier = 500; // 写时间系数 TimeOuts.WriteTotalTimeoutConstant = 2000; //写时间常量 SetCommTimeouts(hCom,&TimeOuts); PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);//清空串口缓冲区 memcpy(pHandle, &hCom, sizeof(hCom));// 保存句柄 return true; } void WZSerialPort::close() { HANDLE hCom = *(HANDLE*)pHandle; CloseHandle(hCom); } int WZSerialPort::send(string dat) { HANDLE hCom = *(HANDLE*)pHandle; if (this->synchronizeflag) { // 同步方式 DWORD dwBytesWrite = dat.length(); //成功写入的数据字节数 BOOL bWriteStat = WriteFile(hCom, //串口句柄 (char*)dat.c_str(), //数据首地址 dwBytesWrite, //要发送的数据字节数 &dwBytesWrite, //DWORD*,用来接收返回成功发送的数据字节数 NULL); //NULL为同步发送,OVERLAPPED*为异步发送 if (!bWriteStat) { return 0; } return dwBytesWrite; } else { //异步方式 DWORD dwBytesWrite = dat.length(); //成功写入的数据字节数 DWORD dwErrorFlags; //错误标志 COMSTAT comStat; //通讯状态 OVERLAPPED m_osWrite; //异步输入输出结构体 //创建一个用于OVERLAPPED的事件处理,不会真正用到,但系统要求这么做 memset(&m_osWrite, 0, sizeof(m_osWrite)); m_osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, L"WriteEvent"); ClearCommError(hCom, &dwErrorFlags, &comStat); //清除通讯错误,获得设备当前状态 BOOL bWriteStat = WriteFile(hCom, //串口句柄 (char*)dat.c_str(), //数据首地址 dwBytesWrite, //要发送的数据字节数 &dwBytesWrite, //DWORD*,用来接收返回成功发送的数据字节数 &m_osWrite); //NULL为同步发送,OVERLAPPED*为异步发送 if (!bWriteStat) { if (GetLastError() == ERROR_IO_PENDING) //如果串口正在写入 { WaitForSingleObject(m_osWrite.hEvent, 1000); //等待写入事件1秒钟 } else { ClearCommError(hCom, &dwErrorFlags, &comStat); //清除通讯错误 CloseHandle(m_osWrite.hEvent); //关闭并释放hEvent内存 return 0; } } return dwBytesWrite; } } string WZSerialPort::receive() { HANDLE hCom = *(HANDLE*)pHandle; string rec_str=""; char buf[1024]; if (this->synchronizeflag) { //同步方式 DWORD wCount = 1024; //成功读取的数据字节数 BOOL bReadStat = ReadFile(hCom, //串口句柄 buf, //数据首地址 wCount, //要读取的数据最大字节数 &wCount, //DWORD*,用来接收返回成功读取的数据字节数 NULL); //NULL为同步发送,OVERLAPPED*为异步发送 for (int i = 0; i < 1024; i++) { if (buf[i] != -52) rec_str += buf[i]; else break; } return rec_str; } else { //异步方式 DWORD wCount = 1024; //成功读取的数据字节数 DWORD dwErrorFlags; //错误标志 COMSTAT comStat; //通讯状态 OVERLAPPED m_osRead; //异步输入输出结构体 //创建一个用于OVERLAPPED的事件处理,不会真正用到,但系统要求这么做 memset(&m_osRead, 0, sizeof(m_osRead)); m_osRead.hEvent = CreateEvent(NULL, TRUE, FALSE, L"ReadEvent"); ClearCommError(hCom, &dwErrorFlags, &comStat); //清除通讯错误,获得设备当前状态 if (!comStat.cbInQue)return 0; //如果输入缓冲区字节数为0,则返回false //std::cout << comStat.cbInQue << std::endl; BOOL bReadStat = ReadFile(hCom, //串口句柄 buf, //数据首地址 wCount, //要读取的数据最大字节数 &wCount, //DWORD*,用来接收返回成功读取的数据字节数 &m_osRead); //NULL为同步发送,OVERLAPPED*为异步发送 if (!bReadStat) { if (GetLastError() == ERROR_IO_PENDING) //如果串口正在读取中 { //GetOverlappedResult函数的最后一个参数设为TRUE //函数会一直等待,直到读操作完成或由于错误而返回 GetOverlappedResult(hCom, &m_osRead, &wCount, TRUE); } else { ClearCommError(hCom, &dwErrorFlags, &comStat); //清除通讯错误 CloseHandle(m_osRead.hEvent); //关闭并释放hEvent的内存 return 0; } } for (int i = 0;i<1024; i++) { if (buf[i]!=-52) rec_str += buf[i]; else break; } return rec_str; } } 逐行 解读
06-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值