C# ID2013系列使用海康官方SDK读码



一、开发前准备

开发前需要去海康官网下载相机读码器客户端
网址:下载连接
安装后插上设备网线口,然后打开软件进行设置。[
在这里插入图片描述

选择连接的读码器,双击连接上相机。开始进行算法设置。设置完成后记得保存。
如果需要更改相机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这个包就可以解决这个问题了。

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mzzder

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值