using MvCodeReaderSDKNet; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Threading.Tasks; namespace LeatherApp.Device { /// /// 扫描器操作类 /// public class ScannerCodeDev { public Action WarningEvent; public Action ScanerEvent; // MvCodeReader.MV_CODEREADER_DEVICE_INFO_LIST m_stDeviceList; private MvCodeReader m_cMyDevice; bool m_bGrabbing = false; Thread m_hReceiveThread = null; public bool start(int devIndex=0) { try { m_stDeviceList = new MvCodeReader.MV_CODEREADER_DEVICE_INFO_LIST(); m_cMyDevice = new MvCodeReader(); //====枚举设备 if (!DeviceListAcq()) return false; //====打开设置 if (m_stDeviceList.nDeviceNum == 0 ) { ShowErrorMsg("No stDevInfo, please select", 0); return false; } // ch:获取选择的设备信息 | en:Get selected stDevInfo information MvCodeReader.MV_CODEREADER_DEVICE_INFO stDevInfo = (MvCodeReader.MV_CODEREADER_DEVICE_INFO)Marshal.PtrToStructure(m_stDeviceList.pDeviceInfo[devIndex], typeof(MvCodeReader.MV_CODEREADER_DEVICE_INFO)); // ch:打开设备 | en:Open stDevInfo if (null == m_cMyDevice) { m_cMyDevice = new MvCodeReader(); if (null == m_cMyDevice) { return false; } } int nRet = m_cMyDevice.MV_CODEREADER_CreateHandle_NET(ref stDevInfo); if (MvCodeReader.MV_CODEREADER_OK != nRet) { ShowErrorMsg("MV_CODEREADER_CreateHandle_NET fail!", nRet); return false; } nRet = m_cMyDevice.MV_CODEREADER_OpenDevice_NET(); if (MvCodeReader.MV_CODEREADER_OK != nRet) { m_cMyDevice.MV_CODEREADER_DestroyHandle_NET(); ShowErrorMsg("Device open fail!", nRet); return false; } // ch:设置采集连续模式 | en:Set Continues Aquisition Mode nRet = m_cMyDevice.MV_CODEREADER_SetEnumValue_NET("TriggerMode", (uint)MvCodeReader.MV_CODEREADER_TRIGGER_MODE.MV_CODEREADER_TRIGGER_MODE_OFF); if (MvCodeReader.MV_CODEREADER_OK != nRet) { ShowErrorMsg("Set TriggerMode Off Fail!", nRet); return false; } //bnGetParam_Click(null, null);// ch:获取参数 | en:Get parameters //====开始采集 // ch:标志位置位true | en:Set position bit true m_hReceiveThread = new Thread(ReceiveThreadProcess); m_hReceiveThread.Start(); m_bGrabbing = true; // ch:开始采集 | en:Start Grabbing nRet = m_cMyDevice.MV_CODEREADER_StartGrabbing_NET(); if (MvCodeReader.MV_CODEREADER_OK != nRet) { stop(); //m_bGrabbing = false; //m_hReceiveThread.Join(); ShowErrorMsg("Start Grabbing Fail!", nRet); return false; } return true; } catch (Exception ex) { WarningEvent?.Invoke(DateTime.Now,WarningEnum.Normal, ex.Message); return false; } } public bool stop() { if (!m_bGrabbing) return true; try { // ch:标志位设为false | en:Set flag bit false m_bGrabbing = false; // ch:停止采集 | en:Stop Grabbing int nRet = m_cMyDevice.MV_CODEREADER_StopGrabbing_NET(); if (nRet != MvCodeReader.MV_CODEREADER_OK) { ShowErrorMsg("Stop Grabbing Fail!", nRet); } if (null != m_hReceiveThread) { m_hReceiveThread.Join(); } //==关闭设备 // ch:取流标志位清零 | en:Reset flow flag bit if (m_bGrabbing == true) { m_bGrabbing = false; // ch:停止采集 | en:Stop Grabbing m_cMyDevice.MV_CODEREADER_StopGrabbing_NET(); m_hReceiveThread.Join(); } // ch:关闭设备 | en:Close Device m_cMyDevice.MV_CODEREADER_CloseDevice_NET(); m_cMyDevice.MV_CODEREADER_DestroyHandle_NET(); return true; } catch { return false; } } //枚举设备 private bool DeviceListAcq() { // ch:创建设备列表 | en:Create Device List System.GC.Collect(); m_stDeviceList.nDeviceNum = 0; int nRet = MvCodeReader.MV_CODEREADER_EnumDevices_NET(ref m_stDeviceList, MvCodeReader.MV_CODEREADER_GIGE_DEVICE); if (0 != nRet) { ShowErrorMsg("Enumerate devices fail!", nRet); return false; } if (0 == m_stDeviceList.nDeviceNum) { ShowErrorMsg("None Device!", 0); return false; } return true; } //设置连续模式 private bool setMode() { int nRet = m_cMyDevice.MV_CODEREADER_SetEnumValue_NET("TriggerMode", (uint)MvCodeReader.MV_CODEREADER_TRIGGER_MODE.MV_CODEREADER_TRIGGER_MODE_OFF); if (MvCodeReader.MV_CODEREADER_OK != nRet) { ShowErrorMsg("Set TriggerMode Off Fail!", nRet); return false; } return true; } public void ReceiveThreadProcess() { int nRet = MvCodeReader.MV_CODEREADER_OK; IntPtr pData = IntPtr.Zero; MvCodeReader.MV_CODEREADER_IMAGE_OUT_INFO_EX2 stFrameInfoEx2 = new MvCodeReader.MV_CODEREADER_IMAGE_OUT_INFO_EX2(); IntPtr pstFrameInfoEx2 = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(MvCodeReader.MV_CODEREADER_IMAGE_OUT_INFO_EX2))); Marshal.StructureToPtr(stFrameInfoEx2, pstFrameInfoEx2, false); while (m_bGrabbing) { nRet = m_cMyDevice.MV_CODEREADER_GetOneFrameTimeoutEx2_NET(ref pData, pstFrameInfoEx2, 1000); if (nRet == MvCodeReader.MV_CODEREADER_OK) { stFrameInfoEx2 = (MvCodeReader.MV_CODEREADER_IMAGE_OUT_INFO_EX2)Marshal.PtrToStructure(pstFrameInfoEx2, typeof(MvCodeReader.MV_CODEREADER_IMAGE_OUT_INFO_EX2)); } if (nRet == MvCodeReader.MV_CODEREADER_OK) { if (0 >= stFrameInfoEx2.nFrameLen) { continue; } MvCodeReader.MV_CODEREADER_RESULT_BCR_EX2 stBcrResultEx2 = (MvCodeReader.MV_CODEREADER_RESULT_BCR_EX2)Marshal.PtrToStructure(stFrameInfoEx2.UnparsedBcrList.pstCodeListEx2, typeof(MvCodeReader.MV_CODEREADER_RESULT_BCR_EX2)); List barCodes = new List(); for (int i = 0; i < stBcrResultEx2.nCodeNum; ++i) { //DataGridViewRow cDataRow = new DataGridViewRow(); //cDataRow.CreateCells(dataGridView1); //cDataRow.Cells[0].Value = this.dataGridView1.Rows.Count; //DateTime cDateTime = DateTime.Now; //cDataRow.Cells[1].Value = cDateTime.ToString(); //cDataRow.Cells[2].Value = stBcrResultEx2.stBcrInfoEx2[i].nTotalProcCost.ToString(); //cDataRow.Cells[3].Value = stBcrResultEx2.stBcrInfoEx2[i].sAlgoCost.ToString(); //cDataRow.Cells[4].Value = stBcrResultEx2.stBcrInfoEx2[i].sPPM.ToString(); //cDataRow.Cells[5].Value = GetBarType((MvCodeReader.MV_CODEREADER_CODE_TYPE)stBcrResultEx2.stBcrInfoEx2[i].nBarType); String strCode = System.Text.Encoding.Default.GetString(stBcrResultEx2.stBcrInfoEx2[i].chCode); //cDataRow.Cells[6].Value = String.IsNullOrEmpty(strCode) ? "NoRead" : strCode;//barcode //cDataRow.Cells[7].Value = stBcrResultEx2.stBcrInfoEx2[i].stCodeQuality.nOverQuality.ToString(); //cDataRow.Cells[8].Value = stBcrResultEx2.stBcrInfoEx2[i].nIDRScore.ToString(); if (!String.IsNullOrEmpty(strCode)) barCodes.Add(strCode.Replace("\0", "").Trim()); } ScanerEvent?.BeginInvoke(barCodes[0], null, null); } } } private static String GetBarType(MvCodeReader.MV_CODEREADER_CODE_TYPE nBarType) { switch (nBarType) { case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_TDCR_DM: return "DM码"; case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_TDCR_QR: return "QR码"; case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_EAN8: return "EAN8码"; case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_UPCE: return "UPCE码"; case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_UPCA: return "UPCA码"; case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_EAN13: return "EAN13码"; case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_ISBN13: return "ISBN13码"; case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_CODABAR: return "库德巴码"; case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_ITF25: return "交叉25码"; case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_CODE39: return " Code 39码"; case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_CODE93: return "Code 93码"; case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_CODE128: return "Code 128码"; case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_TDCR_PDF417: return "PDF417码"; case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_MATRIX25: return "MATRIX25码"; case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_MSI: return "MSI码"; case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_CODE11: return "Code 11码"; case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_INDUSTRIAL25: return "industria125码"; case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_CHINAPOST: return "中国邮政码"; case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_BCR_ITF14: return "交叉14码"; case MvCodeReader.MV_CODEREADER_CODE_TYPE.MV_CODEREADER_TDCR_ECC140: return "ECC140码"; default: return "/"; } } // ch:显示错误信息 | en:Show error message private void ShowErrorMsg(string csMessage, int nErrorNum) { string errorMsg; if (nErrorNum == 0) { errorMsg = csMessage; } else { errorMsg = csMessage + ": Error =" + String.Format("{0:X}", nErrorNum); } switch (nErrorNum) { case MvCodeReader.MV_CODEREADER_E_HANDLE: errorMsg += " Error or invalid handle "; break; case MvCodeReader.MV_CODEREADER_E_SUPPORT: errorMsg += " Not supported function "; break; case MvCodeReader.MV_CODEREADER_E_BUFOVER: errorMsg += " Cache is full "; break; case MvCodeReader.MV_CODEREADER_E_CALLORDER: errorMsg += " Function calling order error "; break; case MvCodeReader.MV_CODEREADER_E_PARAMETER: errorMsg += " Incorrect parameter "; break; case MvCodeReader.MV_CODEREADER_E_RESOURCE: errorMsg += " Applying resource failed "; break; case MvCodeReader.MV_CODEREADER_E_NODATA: errorMsg += " No data "; break; case MvCodeReader.MV_CODEREADER_E_PRECONDITION: errorMsg += " Precondition error, or running environment changed "; break; case MvCodeReader.MV_CODEREADER_E_VERSION: errorMsg += " Version mismatches "; break; case MvCodeReader.MV_CODEREADER_E_NOENOUGH_BUF: errorMsg += " Insufficient memory "; break; case MvCodeReader.MV_CODEREADER_E_UNKNOW: errorMsg += " Unknown error "; break; case MvCodeReader.MV_CODEREADER_E_GC_GENERIC: errorMsg += " General error "; break; case MvCodeReader.MV_CODEREADER_E_GC_ACCESS: errorMsg += " Node accessing condition error "; break; case MvCodeReader.MV_CODEREADER_E_ACCESS_DENIED: errorMsg += " No permission "; break; case MvCodeReader.MV_CODEREADER_E_BUSY: errorMsg += " Device is busy, or network disconnected "; break; case MvCodeReader.MV_CODEREADER_E_NETER: errorMsg += " Network error "; break; } WarningEvent?.Invoke(DateTime.Now,WarningEnum.Low, errorMsg); } } }