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;
}详细解释上面每一行代码的意思
最新发布