某台电脑接入多跟扫描枪,怎样区别它们?
某台电脑接了多跟扫描枪,希望在程序接收数据时判断它们分别来自于那支扫描枪,有办法处理么?因为扫描枪是某个工序的不同环节,所以要区分开来记录,不过扫描枪貌似只是类似sendkeys的效果,难道一定要从条形码入手吗?不知道扫描枪有没有什么设置自动加个“尾巴”表示属性。 --------------------编程问答-------------------- 其实扫描枪 只有一个设置 就是 是否send 回车 但是 只有这一个设置 因此 最多支持2个 --------------------编程问答-------------------- 这个没什么用,工序不定可能几个也可能十几个。 --------------------编程问答-------------------- 你的扫描枪 是不是pda 如果不是 只是台式机 这个比较难办 --------------------编程问答-------------------- 如果用pda的话 你这个问题就不是问题做个登陆网页就解决了 --------------------编程问答-------------------- 你可以看看这个 增加设备成本和少量开发可以实现
http://baike.baidu.com/view/2844558.htm --------------------编程问答-------------------- 你给扫描的物件上增加工序标志嘛 --------------------编程问答-------------------- 找了下 有些厂家的扫描枪可以自定义前后缀的。
http://www.scanshop.cn/_d274622782.htm --------------------编程问答-------------------- 有没有一些关于扫描枪的资料?给来看看? --------------------编程问答-------------------- 事实上,还是应该在条形码上做文章,使用不同的代码代表工序,因为,不然,哪天换扫描枪,你就麻烦了
条形码包含工序信息,是最根本的解决之道 --------------------编程问答--------------------
+1 --------------------编程问答-------------------- 明确了下需求是多个工序一条流水线,一条流水线只有一个条形码标示,并不是每个工序一个码,现在只能通过这个方式了,好在扫描枪有这功能添加后缀A1 A2。。。这样的即可 --------------------编程问答-------------------- 虽然加后缀是一种方法,但是也不能这样省钱吧!
一道工序一台电脑,可是边扫描边确认,否则哪天不小心拿错扫描枪,你就去手工改数据吧! --------------------编程问答-------------------- 没办法,是一个订单一个条形码对应多个工序,并不是每个工序都有个条形码的,想在条形码上做文章都不行。 --------------------编程问答--------------------
最简单的选择,就是采用串口的扫描枪。
--------------------编程问答-------------------- 多跟扫描枪同时扫描时会不会混起来?传数据时是独占的还是并行的?
难以想象十几个工序同时扫描的情形! --------------------编程问答-------------------- 还有,可以采用支持多枪通讯的无线条码枪,可以设置每支枪的 ID。
--------------------编程问答-------------------- 什么扫描枪?我这里扫描枪是可以交互的,处于不同流程位置可以进入不同界面 --------------------编程问答-------------------- 老虎说的这个确实是个问题,这样的设计方法肯定会有同时扫描冲突的情况发生。在同一个地点还好人为协调,如果相隔较远就不好办了。 貌似一台电脑对应一个扫描枪才是最终解决办法啊。 --------------------编程问答-------------------- 要做好一对多应该满足一定的前提
1)扫描枪必须自带缓存,可以存储一定数量的条码。
2.a)通讯应该由主机发起,按照工序的次序反复循环,一次只和一个扫描枪通讯,读取缓存的条码。
2.b)或者是离线式的扫描枪,需要人工插到通讯插座上,也是一次只读取一个扫描枪。 --------------------编程问答-------------------- 无线条码扫描器的接收端能够自动处理这些问题。它会将各枪的 ID 及获取的条码通过串口发送到 PC。 --------------------编程问答-------------------- 可以从设备入手,系统里每个设备都有其设备对象,可以通过访问设备驱动的方式读取设备信息。
对于设备,有两种方式与其连接,一个是设备路径,用CreateFile取得设备句柄,二是枚举设备,通过
PID和VID判断设备确定设备句柄,然后用 DeviceIoControl 便可设置相关参数或取得参数,对于特定
设备的数据,还可以设置好参数后用 ReadFile 或 WriteFile 读写设备数据。你可以参考虚拟键盘驱动
或USB键盘驱动的代码来控制或取得设备信息,再参考WDM驱动模型了解一下驱动(PDO)和设备(FDO)的概念,
应该就可以实现你的目的了。 --------------------编程问答-------------------- 谢谢各位大牛的鼎力相助。
综合看了下还是觉得无线条码扫描器自动处理的比较好,我得了解下看看它怎么个自动处理的。
老虎说的扫描枪得自带缓存,好像目前普通的扫描枪没有这样的功能的吧。循环每次和一个通讯的话还是没法解决工人们同时进行扫描的动作,离线式的话得用pda的了,太贵了,而且还得每天定时导入到电脑,比较麻烦。
SupermanKing的方法大致明白了,是根据设备来取数据,但是这个数据是被动接收的,就像一台电脑接了几个键盘,虽然程序可以识别到这几个设备,但是这几个键盘同时啪啪啪按键打了一堆afwecdsuy65u4lghh字符,你是不知道哪个字符来自于哪个键盘的。 --------------------编程问答--------------------
VC的话可以用多线程技术实现这种过程,VB的多线程比较比较难实现稳定,所以不好说。
但是,从理论上说,这种方法是可行的。只要搞清楚DeviceIoControl传递过去的IRP参数和返回数据,那就是等待的过程问题了,但因为是多线程技术,所以才不会映像主线程的运行。 --------------------编程问答-------------------- 键盘处理上可以看看以下参数
IOCTL_KEY_DOWN
IOCTL_KEY_UP
IOCTL_KEY_E0
IOCTL_KEY_E1
这几个参数在C语言的相关定义和参数运算过程如下:
--------------------编程问答-------------------- 我认真的想了想这个问题,好像要自己加个过滤驱动来配合才可以实现。
// 运算过程函数
#define CTL_CODE( DeviceType, Function, Method, Access ) ( \
((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \
)
// 相关常数定义
#define FILE_DEVICE_KEYMOUSE 0x8000
#define KEYMOUSE_IOCTL_BASE 0x800
#define METHOD_BUFFERED 0
#define FILE_ANY_ACCESS 0
#define CTL_CODE_KEYMOUSE(i) CTL_CODE(FILE_DEVICE_KEYMOUSE, KEYMOUSE_IOCTL_BASE + i, METHOD_BUFFERED, FILE_ANY_ACCESS)
// 最终的结果
#define IOCTL_KEY_DOWN CTL_CODE_KEYMOUSE(2)
#define IOCTL_KEY_UP CTL_CODE_KEYMOUSE(3)
#define IOCTL_KEY_E0 CTL_CODE_KEYMOUSE(4)
#define IOCTL_KEY_E1 CTL_CODE_KEYMOUSE(5)
因为驱动程序分为总线驱动、设备驱动、过滤驱动。
对于目标对象“设备”来说,是在总线驱动的基础上运行的。也就是设备驱动开发中得到的 PDO,
而设备驱动也是基于这个 PDO 产生的设备( FDO ),但是,对于键盘鼠标来说,这种设备驱动程序也就
是完成 IPR 数据的读取操作,具体的消息分发是 Windows 系统与 Windows 键盘设备驱动处理的事情。
所以,对于大多数键盘驱动而言,只是通过总线驱动取得自己设备的硬件状态,并把这种状态通过驱动间
调用驱动的方式转发给系统键盘驱动来处理,所以,即使是两个键盘,也像一个键盘这么的用。
如果要分开两个键盘,需要在每个键盘设备驱动的基础上再挂一个过滤驱动,这个过程可以是用 WDM 方式的,
然后先挂一个虚拟的控制用设备,通过 IRP_MJ_DEVICE_CONTROL 处理你应用程序的参数。
在应用程序看来,可以通过 DeviceIoControl 函数告诉虚拟控制用驱动,什么时候挂载过滤驱动到哪一个设备驱动,同时可以自己再建立一个新的虚拟设备,比如:
RtlInitUnicodeString(&devName,L"\\Device\\vfKey1"); // 初始化设备名
RtlInitUnicodeString(&symLinkName,L"\\DosDevices\\vfKey1"); // 初始化设备连接名
status = IoCreateDevice(DriverObject,
sizeof(DEVICE_EXTENSION),
&(UNICODE_STRING)devName,
FILE_DEVICE_UNKNOWN,
0,
FALSE,
&FDO);
这样应用程序便可通过 CreateFile 指定设备连接名取得这个虚拟设备的设备句柄了,如:
hDevice = CreateFile("\\.\vfKey1",
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
&SA,
OPEN_EXISTING,
FILE_FLAG_NO_BUFFERING,
NULL);
并可已通过 ReadFile、WriteFile、DeviceIoControl 函数与自己的驱动交换数据。当然,用多线程比较好,不然会有卡死等输入的现象。
在设备驱动里,因为可以读到上层驱动传来的 IRP,所以取设备状态(键盘输入状态)是不成问题的,只要在收到状态后,输出数据,连接虚拟设备的应用程序便可收到数据了。
过程可能是复杂点,但这是我能想到的区分多个键盘设备独立采集的唯一方法了,不知道对你有没有用。 --------------------编程问答-------------------- 谢谢SupermanKing老兄了,这样也太复杂了,以我的功力根本搞不定,呵呵。
我想还是尽量交给硬件处理了,其实像这样的多终端的,我想是否可以参考一卡通那样的模式,照射下就将数据回传到服务器,这样就不仅限于usb传输数据了。 --------------------编程问答-------------------- 公交上刷卡终端是有处理器的,它生成的记录也许不包括终端号,但至少包括卡号和车费。相当与扫描枪+电脑的组合。
关键是一对多的扫描枪不能是直接转化为按键消息的驱动方式;
应该提供编程接口,要么指定设备读取、要么读取的信息中包括设备号。
否则就象 SupermanKing 一样要自己处理驱动了。
选硬件时先 Google: 一拖多扫描枪 --------------------编程问答-------------------- 其实扫描抢无非就是通过CCD+FISO+DSP+主控芯片完成条形码的采集,如果是射频技术(RFID/RFIC),也就是射频信号的发送与采集并运算的问题,但无论那种技术,最终都应该有接口的,而这种接口通常都有多样的,如仿键盘的PS/2、USB接口,也有串口、并口、USB HID或USB转串口或并口的接口。其实在设备选型时,如果选择那种串口设备或USB转串口的设备就可以很容易解决这种问题。这种接口的设备淘宝上很多
比如
http://item.taobao.com/item.htm?id=14450069447
http://item.taobao.com/item.htm?id=5383364700
... --------------------编程问答-------------------- 扫描枪驱动没有设备号? --------------------编程问答--------------------
来晚了,一般说明书中有设置的,记得以前设置过。 --------------------编程问答-------------------- 某些扫描枪还可以编程呢!
将工序号作为选项输入,这样扫描枪上可以显示当前工序,并且在扫描时自动将工序作为 前缀/后缀 拼上条码。
一切皆有可能。 --------------------编程问答-------------------- 用无线的吧,基座和枪都可以设置,一个车间里就一台电脑+一个基座+10多个枪,接收端考虑的多一些就哦了
补充:VB , 基础类