条码扫描器接口编程

STM32单片机USB扫码枪开发笔记 在一次开发中偶然需要使用到扫描枪去读取条形码,在开发过程中遇到了扫码枪能枚举成功,但是获取不到数据,之后上网查询资料发现根本就没有这一类的资料,或许是我找的方式不对吧!所以在此写下我在开发过程中所遇到的问题。 一、硬件配置 1.芯片所使用的是STM32F407RE 2.管脚说明 PA12 DP(D+) PA11 DM(D-) PA10 ID(主机模式直接接地,从机模式需接3.3V电源,扫码枪需要为主机模式) PA9 VCC... 阅读详情
 

目前的条形码扫描器有点类似外接键盘(其实从消息传送上它就相当于一个键盘),把输入焦点定位到可输入的控件上,一扫描相应的条形码信息就输入到文本框中去了,但是如果没有输入焦点,或另一个不相干的程序获得输入焦点,那就有点乱套了。我想实现的是,不管什么情况,只要扫描器一工作,我的程序就能自动激活,并能获得当前输入的条形码信息。实现思路:我用的USB口的条形码扫描器,仔细分析了一下,扫描成功后,以键盘按键消息的形式把条形码输入信息通知给系统。这样通过键盘钩子就可以方便的获得该信息了。但是,怎样区分信息是键盘还是条形码输入的哪?很简单,条形码扫描器在很短的时间内输入了至少3个字符以上信息,并且以“回车”作为结束字符,在这种思想指引下,很完美的实现了预定功能。  

 

窗体相关代码:

view plaincopy to clipboardprint?
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
using System;  
usingSystem.Collections.Generic;  
usingSystem.ComponentModel;  
using System.Data;  
using System.Drawing;  
using System.Text;  
usingSystem.Windows.Forms;  
 
namespace ReadBadCode  
{  
    publicpartial class frmTest :Form  
   {  
       BarCodeHook BarCode = newBarCodeHook();  
       public frmTest()  
       {  
           InitializeComponent();  
           BarCode.BarCodeEvent += newBarCodeHook.BarCodeDelegate(BarCode_BarCodeEvent);  
       }  
 
       private delegate void ShowInfoDelegate(BarCodeHook.BarCodesbarCode);  
       private void ShowInfo(BarCodeHook.BarCodesbarCode)  
       {  
           if (this.InvokeRequired)  
           {  
               this.BeginInvoke(new ShowInfoDelegate(ShowInfo), new object[] {barCode });  
           }  
           else 
           {  
               textBox1.Text =barCode.KeyName;  
               textBox2.Text =barCode.VirtKey.ToString();  
               textBox3.Text =barCode.ScanCode.ToString();  
               textBox4.Text =barCode.AscII.ToString();  
               textBox5.Text =barCode.Chr.ToString();  
               textBox6.Text = barCode.IsValid ? barCode.BarCode :"";  
           }  
       }  
 
       void BarCode_BarCodeEvent(BarCodeHook.BarCodesbarCode)  
       {  
           ShowInfo(barCode);  
       }  
 
       private void frmTest_Load(object sender, EventArgse)  
       {  
           BarCode.Start();  
       }  
 
       private void frmTest_FormClosed(object sender, FormClosedEventArgse)  
       {  
           BarCode.Stop();  
       }  
 
       private void textBox6_TextChanged(object sender, EventArgse)  
       {  
           if (textBox6.Text.Length >0)  
           {  
               MessageBox.Show(textBox6.Text);  
           }  
       }  
   }  
}  
 
  
 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace ReadBadCode
{
    publicpartial class frmTest : Form
    {
       BarCodeHook BarCode = new BarCodeHook();
       public frmTest()
       {
           InitializeComponent();
           BarCode.BarCodeEvent += newBarCodeHook.BarCodeDelegate(BarCode_BarCodeEvent);
       }

       private delegate void ShowInfoDelegate(BarCodeHook.BarCodesbarCode);
       private void ShowInfo(BarCodeHook.BarCodes barCode)
       {
           if (this.InvokeRequired)
           {
               this.BeginInvoke(new ShowInfoDelegate(ShowInfo), new object[] {barCode });
           }
           else
           {
               textBox1.Text = barCode.KeyName;
               textBox2.Text = barCode.VirtKey.ToString();
               textBox3.Text = barCode.ScanCode.ToString();
               textBox4.Text = barCode.AscII.ToString();
               textBox5.Text = barCode.Chr.ToString();
               textBox6.Text = barCode.IsValid ? barCode.BarCode : "";
           }
       }

       void BarCode_BarCodeEvent(BarCodeHook.BarCodes barCode)
       {
           ShowInfo(barCode);
       }

       private void frmTest_Load(object sender, EventArgs e)
       {
           BarCode.Start();
       }

       private void frmTest_FormClosed(object sender, FormClosedEventArgse)
       {
           BarCode.Stop();
       }

       private void textBox6_TextChanged(object sender, EventArgs e)
       {
           if (textBox6.Text.Length > 0)
           {
               MessageBox.Show(textBox6.Text);
           }
       }
    }
}

 
 

BarCodeHook 类:

view plaincopy to clipboardprint?
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
using System;  
usingSystem.Collections.Generic;  
using System.Text;  
usingSystem.Runtime.InteropServices;  
using System.Reflection;  
 
namespace ReadBadCode  
{  
    public classBarCodeHook  
   {  
       public delegate void BarCodeDelegate(BarCodesbarCode);  
       public event BarCodeDelegateBarCodeEvent;  
 
       public struct BarCodes  
       {  
           public intVirtKey;     //虚拟码  
           public intScanCode;    //扫描码  
           public string KeyName;  //键名  
           public uintAscII;      //AscII  
           public charChr;        //字符  
 
           public string BarCode;  //条码信息  
           public boolIsValid;    //条码是否有效  
           public DateTimeTime;   //扫描时间  
       }  
 
       private struct EventMsg  
       {  
           public int message;  
           public int paramL;  
           public int paramH;  
           public int Time;  
           public int hwnd;  
       }  
         
       [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention=CallingConvention.StdCall)]  
       private static extern int SetWindowsHookEx(int idHook, HookProclpfn, IntPtr hInstance, intthreadId);  
 
       [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention=CallingConvention.StdCall)]  
       private static extern bool UnhookWindowsHookEx(intidHook);  
 
       [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention=CallingConvention.StdCall)]  
       private static extern int CallNextHookEx(int idHook, int nCode,Int32 wParam, IntPtrlParam);  
 
       [DllImport("user32", EntryPoint ="GetKeyNameText")]  
       private static extern int GetKeyNameText(int lParam, StringBuilderlpBuffer, int nSize);  
 
       [DllImport("user32", EntryPoint ="GetKeyboardState")]  
       private static extern int GetKeyboardState(byte[]pbKeyState);  
 
       [DllImport("user32", EntryPoint ="ToAscii")]  
       private static extern bool ToAscii(int VirtualKey, int ScanCode,byte[] lpKeyState, ref uint lpChar, intuFlags);  
 
       delegate int HookProc(int nCode, Int32 wParam, IntPtrlParam);  
       BarCodes barCode = newBarCodes();  
       int hKeyboardHook = 0;  
       string strBarCode = "";  
 
       private int KeyboardHookProc(int nCode, Int32 wParam, IntPtrlParam)  
       {  
           if (nCode == 0)  
           {  
               EventMsg msg = (EventMsg)Marshal.PtrToStructure(lParam,typeof(EventMsg));  
 
               if (wParam == 0x100)  //WM_KEYDOWN = 0x100  
               {  
                   barCode.VirtKey = msg.message &0xff; //虚拟码  
                   barCode.ScanCode = msg.paramL &0xff; //扫描码  
 
                   StringBuilder strKeyName = newStringBuilder(255);  
                   if (GetKeyNameText(barCode.ScanCode * 65536, strKeyName, 255)> 0)  
                   {  
                       barCode.KeyName = strKeyName.ToString().Trim(new char[] { ' ', '\0'});  
                   }  
                   else 
                   {  
                       barCode.KeyName = "";  
                   }  
 
                   byte[] kbArray = newbyte[256];  
                   uint uKey = 0;  
                   GetKeyboardState(kbArray);                                          
                   if (ToAscii(barCode.VirtKey, barCode.ScanCode, kbArray, ref uKey,0))  
                   {  
                       barCode.AscII = uKey;  
                       barCode.Chr =Convert.ToChar(uKey);  
                   }  
 
                   if (DateTime.Now.Subtract(barCode.Time).TotalMilliseconds>50)   
                   {  
                       strBarCode =barCode.Chr.ToString();  
                   }  
                   else 
                   {  
                       if ((msg.message & 0xff) == 13&& strBarCode.Length> 3)  //回车  
                       {  
                           barCode.BarCode =strBarCode;  
                           barCode.IsValid = true;  
                       }  
                       strBarCode +=barCode.Chr.ToString();  
                   }  
 
                   barCode.Time =DateTime.Now;  
                   if (BarCodeEvent != null)BarCodeEvent(barCode);   //触发事件  
                   barCode.IsValid = false;  
               }  
           }  
           return CallNextHookEx(hKeyboardHook, nCode, wParam,lParam);            
       }  
          
       // 安装钩子   
       public bool Start()  
       {  
           if (hKeyboardHook == 0)  
           {  
               //WH_KEYBOARD_LL = 13  
               hKeyboardHook = SetWindowsHookEx(13, newHookProc(KeyboardHookProc),Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),0);  
           }  
           return (hKeyboardHook !=0);  
       }  
 
       // 卸载钩子   
       public bool Stop()  
       {  
           if (hKeyboardHook != 0)  
           {  
               returnUnhookWindowsHookEx(hKeyboardHook);  
           }  
           return true;  
       }  
   }  
} 
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Reflection;

namespace ReadBadCode
{
    public classBarCodeHook
    {
       public delegate void BarCodeDelegate(BarCodes barCode);
       public event BarCodeDelegate BarCodeEvent;

       public struct BarCodes
       {
           public intVirtKey;     //虚拟码
           public intScanCode;    //扫描码
           public string KeyName;  //键名
           public uintAscII;      //AscII
           public charChr;        //字符

           public string BarCode;  //条码信息
           public boolIsValid;    //条码是否有效
           public DateTimeTime;   //扫描时间
       }

       private struct EventMsg
       {
           public int message;
           public int paramL;
           public int paramH;
           public int Time;
           public int hwnd;
       }
      
       [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention= CallingConvention.StdCall)]
       private static extern int SetWindowsHookEx(int idHook, HookProclpfn, IntPtr hInstance, int threadId);

       [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention= CallingConvention.StdCall)]
       private static extern bool UnhookWindowsHookEx(int idHook);

       [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention= CallingConvention.StdCall)]
       private static extern int CallNextHookEx(int idHook, int nCode,Int32 wParam, IntPtr lParam);

       [DllImport("user32", EntryPoint = "GetKeyNameText")]
       private static extern int GetKeyNameText(int lParam, StringBuilderlpBuffer, int nSize);

       [DllImport("user32", EntryPoint = "GetKeyboardState")]
       private static extern int GetKeyboardState(byte[] pbKeyState);

       [DllImport("user32", EntryPoint = "ToAscii")]
       private static extern bool ToAscii(int VirtualKey, int ScanCode,byte[] lpKeyState, ref uint lpChar, int uFlags);

       delegate int HookProc(int nCode, Int32 wParam, IntPtrlParam);
       BarCodes barCode = new BarCodes();
       int hKeyboardHook = 0;
       string strBarCode = "";

       private int KeyboardHookProc(int nCode, Int32 wParam, IntPtrlParam)
       {
           if (nCode == 0)
           {
               EventMsg msg = (EventMsg)Marshal.PtrToStructure(lParam,typeof(EventMsg));

               if (wParam == 0x100)  //WM_KEYDOWN = 0x100
               {
                   barCode.VirtKey = msg.message &0xff;  //虚拟码
                   barCode.ScanCode = msg.paramL &0xff;  //扫描码

                   StringBuilder strKeyName = new StringBuilder(255);
                   if (GetKeyNameText(barCode.ScanCode * 65536, strKeyName, 255)> 0)
                   {
                       barCode.KeyName = strKeyName.ToString().Trim(new char[] { ' ', '\0'});
                   }
                   else
                   {
                       barCode.KeyName = "";
                   }

                   byte[] kbArray = new byte[256];
                   uint uKey = 0;
                   GetKeyboardState(kbArray);                                       
                   if (ToAscii(barCode.VirtKey, barCode.ScanCode, kbArray, ref uKey,0))
                   {
                       barCode.AscII = uKey;
                       barCode.Chr = Convert.ToChar(uKey);
                   }

                   if (DateTime.Now.Subtract(barCode.Time).TotalMilliseconds> 50)
                   {
                       strBarCode = barCode.Chr.ToString();
                   }
                   else
                   {
                       if ((msg.message & 0xff) == 13&& strBarCode.Length> 3)   //回车
                       {
                           barCode.BarCode = strBarCode;
                           barCode.IsValid = true;
                       }
                       strBarCode += barCode.Chr.ToString();
                   }

                   barCode.Time = DateTime.Now;
                   if (BarCodeEvent != null)BarCodeEvent(barCode);   //触发事件
                   barCode.IsValid = false;
               }
           }
           return CallNextHookEx(hKeyboardHook, nCode, wParam,lParam);         
       }
       
       // 安装钩子
       public bool Start()
       {
           if (hKeyboardHook == 0)
           {
               //WH_KEYBOARD_LL = 13
               hKeyboardHook = SetWindowsHookEx(13, newHookProc(KeyboardHookProc),Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),0);
           }
           return (hKeyboardHook != 0);
       }

       // 卸载钩子
       public bool Stop()
       {
           if (hKeyboardHook != 0)
           {
               return UnhookWindowsHookEx(hKeyboardHook);
           }
           return true;
       }
    }
}
 


C#实现扫描枪扫描二维码并打印 阅读详情

相关推荐

DENSO GT-10Q-SU条码扫描器如何恢复出厂设置?

DENSO GT-10Q-SU二维条码扫描器如何恢复出厂设置? GT-10Q-SU二维条码扫描器,是一款采用USB连接数据线的扫描器,它自身有两种接口模式:USB-COM和USB keyboard,其中,采用USB-COM接口模式时扫描器相当于串口输入,无法在记事本等工具中显示扫描结果,可通过编程串口或者超级终端中显示扫描结果;采用USB keyboard接口模式时扫描相当于一个键盘,可在记事本等工具中显示扫描结果。 所以首先需要明确你所使用的...

y2020520的博客 3310

扫码枪WinForm程序的编写

扫码枪WinForm程序的编写 打开程序自动生成CSV表格 通过扫码枪扫描条形码在界面显示当前扫描条形码 同时写入表格文件中 在写入表格文件的同时,发送json到相应服务器 利用正则表达式判断数据是否符合规则, 符合返回数据并使得状态为1(表格中有状态这一列) 程序根据当前系统时间自动生成并命名相应的表格, 文件创建规则:8点-20点 文件名当前日期+白班 20点-次日8点 文件名当前日期+夜班(如果超过0点,日期-1) 扫码规则:判断扫入数据是否与之前扫入数据重复(try catch 重复抛出异常)

qq_42983480的博客 4252

LV30条码扫描器与PIC18F4685微控制器的嵌入式解码方案

条码扫描技术是现代自动识别系统的核心组件,其工作原理是通过光学传感器捕获条码图像并转换为数字信号。在嵌入式系统中,微控制器(如PIC18F4685)负责执行关键的解码算法,将原始图像数据转换为可读信息。这种技术组合在工业自动化、物流管理等领域具有重要价值,特别是在需要本地实时处理的场景中。LV30作为高性能线性影像式扫描引擎,支持多种1D/2D条码格式,结合PIC18F4685的硬件加速能力,可实现高效的嵌入式条码识别解决方案。通过优化UART通信协议和内存管理策略,系统能够在资源受限环境下稳定运行,满足工

weixin_34326558的博客 430

扫码枪扫码

所以发现了这么多问题我就想放弃这种办法了,转念一想,我们为什么要局限于记录下键盘弹起的e.key呢。之前的思路是监听键盘弹起事件,记录下快速弹起50ms键盘弹起(避免用户按键盘的数据被记录造成扫码错误)(50ms---扫码枪的本质就是相当于将二维码或条形码记录 数字和字母模拟按键盘输入的,扫码枪是快速扫码的,所以我们记录的50ms内)二、如果有字母的话,你会发现二维码的字母是大写的,但是记录下的字母是小写,这是因为代码里打印键盘弹起e.key是小写字母,我还没有发现是为什么,但是会有这个问题。

m0_65915285的博客 788

工业级LV30条码扫描器与PIC18F4680微控制器系统设计

条码扫描技术作为自动识别领域的核心技术,其硬件实现依赖于精密的光学系统和高效的信号处理。工业级扫描器通常采用CMOS传感器和特定波长光源组合,通过自动增益控制(AGC)和PWM调光技术应对复杂环境。在嵌入式系统中,8位微控制器如PIC18F4680凭借其丰富的外设接口和实时性能,成为条码解码系统的理想选择。该系统设计涉及硬件接口的信号调理、多介质适配算法优化以及动态功耗管理等关键技术,特别适用于工业自动化、物流分拣等场景。LV30扫描器与PIC18F4680的组合方案,通过硬件滤波电路和软件解码优化,可实现

weixin_42558093的博客 339

LV30条码扫描器与PIC18F87J50的嵌入式系统设计

条码识别技术作为自动识别领域的核心技术,通过光电转换将条空图案转化为数字信号。其工作原理依赖于激光扫描与反射光强分析,关键技术包括动态阈值处理、码制识别算法和校验计算。在工业4.0和物联网应用中,高性能条码系统能显著提升物流分拣、库存管理等场景的作业效率。LV30扫描器结合PIC18F87J50微控制器的解决方案,通过宽动态范围补偿和低功耗设计,实现了99.8%的读取成功率与1.6μA待机电流,特别适合反光金属表面和曲面介质的复杂场景。

weixin_33857230的博客 432

qt获取 扫码枪_QT编程下条码扫描器的实现

龙源期刊网http://www.qikan.com.cnQT编程下条码扫描器的实现作者:刘立才杜传红梁丽秀来源:《科技创新与应用》2014年第28期摘要:在凌动嵌入式系统UP-ATOM510平台上,结合LS1902系列手持激光条码扫描器,实现了QT集成开发环境下条码扫描器的应用。关键词:凌动嵌入式系统;QT编程;LS1902条码扫描器引言条形码技术具有输入速度快、采集信息量大、制作使用成本低廉等优...

weixin_39646628的博客 1349

LV30条码扫描器与PIC18F86J16嵌入式系统设计

条码识别技术作为自动识别领域的核心技术,其硬件选型与信号处理直接影响系统性能。通过光电转换原理将条码信息转换为电信号,配合微控制器实现高效解码。在嵌入式系统中,PIC18F86J16微控制器凭借其ECAN模块和硬件PWM,与LV30激光扫描模块构建高性价比解决方案。该组合在工业自动化和零售管理场景中表现优异,特别是通过动态阈值算法和两级运放调理电路,有效应对不同介质表面的识别挑战。系统集成时需注意电平转换和EMC设计,确保在物流分拣等复杂环境中稳定运行。

weixin_26742753的博客 317

赫优讯netTAP网关在SICK条码扫描器通讯上的应用

摘要:本文介绍了如何利用赫优讯协议转换网关实现PROFIBUS现场总线和SICK条码扫描器串行通信网络间的通讯。 关键词:现场总线 PROFIBUS-DP RS232 SICK扫描器 协议转换 网关 Abstract:This paper introduces how to use the Protocol conversion gateway to realize the communi...

工业网络通讯解决方案 1142

STM32F207ZG与LV30条码扫描器的嵌入式系统设计

嵌入式系统在工业自动化中扮演着关键角色,特别是在条码识别领域。通过微控制器(如STM32F207ZG)与图像式扫描器(如LV30)的协同工作,可以实现高鲁棒性的条码解码。其核心原理包括数字图像处理、硬件加速和多协议通信。这种技术组合不仅能应对破损、污损或曲面介质上的条码,还能在有限硬件资源下实现实时解码。应用场景广泛,包括物流管理、零售仓储和工业自动化。特别是在处理金属表面、反光材质等复杂环境时,动态曝光补偿和多光源切换功能显得尤为重要。通过优化内存分配和通信协议,系统可以稳定运行并高效处理QR、DataM

weixin_30378623的博客 507

构建可编程条码扫描器的应用接口

条码扫描器控件是一种计算机软件组件,它使得应用程序能够控制和接收来自条码扫描器的输入。这一控件可以集成在POS系统、库存管理软件以及各种需要条码读取功能的软件系统中。它不仅简化了数据采集流程,还提高了数据的准确性与效率。在条码扫描器控件开发中,API接口是核心,它允许开发者与扫描器硬件进行交互。功能分类是根据扫描器的不同用途和操作方式来进行的。主要包括以下几类:初始化与配置: 提供对扫描器进行初始化和配置的接口,以便其按预期工作。数据获取: 包括获取扫描结果、设备状态等数据的接口。

weixin_32535825的博客 633

STM32F217ZG与LV30条码扫描器的工业级应用设计

嵌入式系统中的数据采集技术是工业自动化的基础环节,其核心在于通过微控制器与传感器的协同工作实现可靠信息获取。以STM32系列MCU为代表的ARM Cortex-M架构处理器,凭借其实时处理能力和丰富外设接口,成为工业级应用的理想选择。条码识别作为典型的数据采集场景,需要解决反光介质、动态目标等工程挑战。通过硬件隔离设计、DMA双缓冲机制和NEON指令集优化,可显著提升系统抗干扰能力和解码效率。在物流分拣、智能仓储等应用场景中,STM32F217ZG与LV30扫描模块的组合方案展现出95%以上的解码成功率,特

weixin_30363285的博客 250

C# 扫码枪代码 包括USB和串口两种方式

C# 扫码枪代码 包括USB和串口两种连接方式的集成和测试窗口

LV30条码扫描器与PIC18F46K40微控制器的嵌入式解决方案

条码识别技术作为自动识别领域的核心技术,通过光电转换将条码信息转化为数字信号。其核心原理是利用不同波长光源照射条码,通过反射光强差异识别黑白条纹的宽度组合。现代工业级扫描器如LV30采用多光谱照明技术,结合PIC18F46K40等高性能微控制器的信号处理能力,显著提升了在复杂环境下的识别率。这种嵌入式解决方案在工业自动化和零售管理领域具有重要价值,能够稳定读取金属表面、曲面包装等特殊介质的条码。关键技术点包括动态基线校正算法、自适应照明控制以及环境光抗干扰设计,这些优化使得系统在保持低功耗的同时,对磨损标签

weixin_29189377的博客 270

手持扫描枪的接口程序

手持扫描枪的接口程;卡西欧的,这也是我在实际项目用到的东西,保证可以用

天线学习笔记——串馈网络设计

工程中通常更倾向于使用50Ω、70.7Ω、100Ω的固定阻抗的带宽,实际中可以分别使用固定阻抗的带宽和计算得到的带宽进行仿真,观察二者的性能,取性能更优者即可。本系列是一个记录天线设计的笔记,分享出来也希望能够帮助到大家,后续本系列文章还会不定期更新,如有需要可关注,任何问题均可在评论区或私信提出,看到必回。如果对大家有帮助可进行打赏哦~

Ethan的博客 7877

基于RP2040 PIO的嵌入式条码扫描器:低成本MCU实现机器视觉

在嵌入式系统和物联网设备中,机器视觉是实现物体识别、检测与交互的关键技术。其核心原理是通过图像传感器采集环境信息,再经由算法处理提取特征。对于资源受限的MCU而言,传统基于通用处理器和复杂库的方案往往面临功耗高、成本高的挑战。RP2040微控制器的PIO(可编程IO)状态机为此提供了创新解决方案,它能以极低的CPU开销高效驱动图像传感器,完成实时数据采集。结合高度优化的轻量级解码算法,这种软硬件协同设计使得在低成本平台上实现实时条码识别成为可能,其技术价值在于为智能仓储、便携盘点、工业自动化等场景提供了高性

weixin_33875839的博客 399

组态王|以一定的时间间隔查询某个时间段内的历史数据

使用该函数其他都可以满足,唯一问题是变量的选择,当切换站点后查询历史数据时,所选的变量依然是上次站点查询时所选择的变量,每当更换站点查询时都需要重新选择变量,这一点太繁琐,是用户和操作者无法忍受的。但是由于现场可能数据变化并非太过频繁,想要实现记录频率不变,还是以1分钟一次的频率进行存储,但是报表查询的时候想要只显示整点的数据。其中日历控件的设置与之前的历史数据查询是一样的,报表的抬头设置都是不用变的,此处不再赘述,有兴趣的可以。以上为组态王中以一定的时间间隔查询某个时间段内的历史数据的实现过程。

做有价值的事,积累有价值的笔记! 2542

STM32与LV30图像式条码扫描器的硬件设计与优化

图像式条码扫描技术通过CMOS传感器捕获完整条码图像,结合先进的解码算法,显著提升了在破损、污损或低对比度条件下的读取成功率。其核心原理在于将光学信号转换为数字图像后,利用边缘检测、二值化等图像处理技术提取条码信息。相比传统激光扫描,该技术具有更强的环境适应性和更高的解码效率,特别适用于工业自动化、物流追踪等场景。STM32微控制器凭借其高性能ARM Cortex-M内核和专用硬件加速器,为图像处理提供了理想的运算平台。以LV30扫描模组为例,其1280×800分辨率配合可编程多波长照明系统,可有效应对金属

weixin_34341117的博客 289

半导体测试(一)

探针台是一种用于在晶圆上进行配合探针卡进行电路量测的设备,在测试过程中,探针工作站会将探针与晶圆上的每个die进行接触,以进行电性测量。在这个过程中,每个die都被测试以确保它能基本满足器件的特征或设计规格书(Specification),通常包括电压、电流、时序和功能的验证。晶圆是一个圆形的硅片,在这个半导体的基础之上,建立了许多独立的单个的电路;在所有的die都被探测(Probed)之后,晶圆被切割成独立的dice,这就是常说的die saw,所有被标示为失效的die都被报废,。

m0_37606066的博客 8424

日常工作记录---在虚拟机中进行slam建图

   今天是10月24号,首先祝各位程序员们节日快乐!!!    最近一周由于实习的原因,对ROS的探索学习,停滞了一段时间,所以今天也就没什么大的进展,本篇文章仅仅记录一下,我在虚拟机中进行slam建图可行性验证的过程,本篇文章同样使用古月学院《如何在Gazebo中实现阿克曼转向车的仿真》的课程资料来进行验证    下面各条之间并没有严格的顺序关系,每一条都是独立的,都是我在验证过程中的经验或者记录:    1、在运行roslaunch bringup racecar_gazebo_rviz.lau

慕羽★的博客 4828
上一篇: 获取android中正在运行应用程序的列表
下一篇: 如何为Iphone应用创建启动界面
wanglang3081
博客等级 码龄19年 385粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值