一、开发前准备
开发前需要去海康官网下载相机读码器客户端
网址:下载连接
安装后插上设备网线口,然后打开软件进行设置。[
选择连接的读码器,双击连接上相机。开始进行算法设置。设置完成后记得保存。
如果需要更改相机IP地址,在工具–> IP配置工具进行设置。
二、开始开发
1.引入库
MvCodeReaderSDK.Net.dll
地址在软件安装目录下面:以我的安装目录为例:
D:\tools\scan\IDMVS\Development\Modules\MvCodeReaderSDK\Demo\C#\BasicDemo\bin\AnyCpu
2.遍历设备
代码如下:
//在遍历设备前先加入如下代码
MvCodeReader.MV_CODEREADER_DEVICE_INFO_LIST m_stDeviceList = new MvCodeReader.MV_CODEREADER_DEVICE_INFO_LIST();
private MvCodeReader m_cMyDevice = new MvCodeReader();
bool m_bGrabbing = false;
private void getAllDev_Click(object sender, EventArgs e)
{
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)
{
MessageBox.Show($"Enumerate devices fail!{nRet}");
return;
}
if (0 == m_stDeviceList.nDeviceNum)
{
MessageBox.Show($"None Device!{0}");
return;
}
for (int i = 0; i < m_stDeviceList.nDeviceNum; i++)
{
MvCodeReader.MV_CODEREADER_DEVICE_INFO stDevInfo = (MvCodeReader.MV_CODEREADER_DEVICE_INFO)Marshal.PtrToStructure(m_stDeviceList.pDeviceInfo[i], typeof(MvCodeReader.MV_CODEREADER_DEVICE_INFO));
if (stDevInfo.nTLayerType == MvCodeReader.MV_CODEREADER_GIGE_DEVICE)
{
IntPtr buffer = Marshal.UnsafeAddrOfPinnedArrayElement(stDevInfo.SpecialInfo.stGigEInfo, 0);
MvCodeReader.MV_CODEREADER_GIGE_DEVICE_INFO stGigEDeviceInfo = (MvCodeReader.MV_CODEREADER_GIGE_DEVICE_INFO)Marshal.PtrToStructure(buffer, typeof(MvCodeReader.MV_CODEREADER_GIGE_DEVICE_INFO));
}
}
}
3.连接设备
代码如下:
private void conDev_Click(object sender, EventArgs e)
{
if (m_stDeviceList.nDeviceNum == 0 )
{
MessageBox.Show($"No stDevInfo, please select!{0}");
return;
}
//我这边只连接一个设备,有需要的自己修改列表值即可
MvCodeReader.MV_CODEREADER_DEVICE_INFO stDevInfo =(MvCodeReader.MV_CODEREADER_DEVICE_INFO)Marshal.PtrToStructure(m_stDeviceList.pDeviceInfo[0],typeof(MvCodeReader.MV_CODEREADER_DEVICE_INFO));
if (null == m_cMyDevice)
{
m_cMyDevice = new MvCodeReader();
if (null == m_cMyDevice)
{
return;
}
}
int nRet = m_cMyDevice.MV_CODEREADER_CreateHandle_NET(ref stDevInfo);
if (MvCodeReader.MV_CODEREADER_OK != nRet)
{
MessageBox.Show($"MV_CODEREADER_CreateHandle_NET fail!!{nRet}");
return;
}
nRet = m_cMyDevice.MV_CODEREADER_OpenDevice_NET();
if (MvCodeReader.MV_CODEREADER_OK != nRet)
{
m_cMyDevice.MV_CODEREADER_DestroyHandle_NET();
MessageBox.Show($"Device open fail!{nRet}");
return;
}
m_cMyDevice.MV_CODEREADER_SetEnumValue_NET("TriggerMode", (uint)MvCodeReader.MV_CODEREADER_TRIGGER_MODE.MV_CODEREADER_TRIGGER_MODE_OFF);
}
4.开始采集
代码如下:
private void bgnCollect_Click(object sender, EventArgs e)
{
m_bGrabbing = true;
int nRet = m_cMyDevice.MV_CODEREADER_StartGrabbing_NET();
if (MvCodeReader.MV_CODEREADER_OK != nRet)
{
m_bGrabbing = false;
MessageBox.Show($"Start Grabbing Fail!{nRet}");
return;
}
}
//这个线程在窗体实例化的时候就开启,这样在开启线程按钮按下直接开始采集
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 (true)
{
if(m_bGrabbing)
{
z++;
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));
for (int i = 0; i < stBcrResultEx2.nCodeNum; ++i)
{
String strCode = System.Text.Encoding.Default.GetString(stBcrResultEx2.stBcrInfoEx2[i].chCode);
string realValue = String.IsNullOrEmpty(strCode) ? "NoRead" : strCode;
addlog(z + ":" +realValue);
}
}
}
Thread.Sleep(100);
}
}
5.关闭设备
代码如下:
private void button10_Click(object sender, EventArgs e)
{
if (m_bGrabbing == true)
{
m_bGrabbing = false;
m_cMyDevice.MV_CODEREADER_StopGrabbing_NET();
}
m_cMyDevice.MV_CODEREADER_CloseDevice_NET();
m_cMyDevice.MV_CODEREADER_DestroyHandle_NET();
}
6.停止收集设备
代码如下:
private void button9_Click(object sender, EventArgs e)
{
m_bGrabbing = false;
int nRet = m_cMyDevice.MV_CODEREADER_StopGrabbing_NET();
if (nRet != MvCodeReader.MV_CODEREADER_OK)
{
MessageBox.Show($"Stop Grabbing Fail!{nRet}");
}
}
总结
总体效果图如下,可以根据自己需要在进行开发。
操作步骤如下:先预览设备–>连接设备–>开始采集–>停止采集–>关闭设备
demo地址:demo下载地址
注意事项:在调试的时候会出现缺少dll的情况,请安装海康官方SDK runtime这个包就可以解决这个问题了。