Программируем лазерный считыватель на терминалах сбора данных Cipher (9300) C#
Пришло время написать вторую публикацию по программированию считывающих устройств терминалов сбора данных. В этой публикации я приведу пример программирования лазерного считывателя на терминалах Cipher 9300.
Здесь я приведу простой пример создания программы на Windows CE, которая будет работать со считывателем на терминалах Cipher 93XX. В целом, исходный код данной программы будет основан на примерах, которые приведены в руководстве по программированию, но с небольшим своим усовершенствованием. Вообще удивительно, почему те кто составлял руководство и SDK для разработчиков к этому устройству, не озаботились выложить хотя бы парочку рабочих примеров.
Итак, по порядку. Начнём с того что нам потребуется для разработки.
Как я уже говорил, нам потребуется SDK, по сути нам будут нужны 3 библиотеки, две под .NET, и одна для считывателя которая просто должна быть с проектом: Reader_Ce_Net.DLL, SystemApi_Ce_Net.DLL, ReaderDll_CE.dll.
Все три библиотеки можно накопать в интернете, если очень постараться (постараться придётся очень, очень, очень). Здесь проявляется ещё одна свинья странность от специалистов CipherLab. На сайте компании вы нигде не найдёте ни SDK ни документации по разработке, для его получения вам будет предлагаться написать им письмо и попросить в нём SDK. Само SDK и документация поставляется с терминалом сбора данных вот на таком вот диске:
хотя, как я уже говорил, если постараться можно накопать в интернете нужные библиотеки.
Предположим, что диск мы раздобыли (если есть терминал то есть и диск), приступим к разработке.
Первое что необходимо сделать, это создать проект для мобильного устройства в Visual Studio, после чего добавить в созданный проект, через Add Reference две библиотеки, о которых упоминалось ранее: Reader_Ce_Net.DLL, SystemApi_Ce_Net.DLL.
Библиотеку ReaderDll_CE.dll — необходимо в последствии просто добавить в каталог с готовой программой, эта библиотека будет необходима для работы первых двух.
После добавления библиотек, в коде прописываем:
using Cipherlab.SystemAPI;
using System.Runtime.InteropServices;
using Microsoft.WindowsCE.Forms;
Кидаем на форму TextBox и пару кнопок Button. — для отображения считанной информации.
Описываем два класса:
public class MsgWindow : MessageWindow
{
public UInt32 decodeMsg = 0;
int b1 = 0;
byte[] lpbuf = new byte[25];
string tmp;
public Form1 msgform;
public MsgWindow(Form1 msgform)
{
this.msgform = msgform;
decodeMsg = Win32API.RegisterWindowMessage("WM_DECODEDATA");
}
protected override void WndProc(ref Message msg)
{
if (msg.Msg == decodeMsg)
{
switch (msg.WParam.ToInt32())
{
case 7: //Это ШК...
b1 = Reader.ReaderEngineAPI.GetDecodeData(ref tmp);
//this.msgform.textBox1.Text = tmp; //Это то как по инструкции.
//Мы же расширим функционал и заставим работать считыватель в множестве форм.
CallBackMy.callbackEventHandler(tmp);
break;
default:
break;
}
}
base.WndProc(ref msg);
}
}
public class Win32API
{
[DllImport("coredll.dll", SetLastError = true)]
public static extern uint RegisterWindowMessage(string lpString);
}
Первый класс занимается непосредственно получением данных со считывателя, второй регистрирует функцию RegisterWindowMessage, необходимую первому.
Теперь, включаем всё это:
MsgWindow MsgWin;
public Form1()
{
//Слушает событие которое генерируется считыванием ШК.
CallBackMy.callbackEventHandler = new CallBackMy.callbackEvent(this.CipherBarcode);
InitializeComponent();
//Инициируем считыватель.
MsgWin = new MsgWindow(this);
int b1 = 0;
string ver = string.Empty;
b1 = Reader.ReaderEngineAPI.GetDllVer(ref ver);
textBox1.Text = ver;
b1 = Reader.ReaderEngineAPI.InitReader();
}
void CipherBarcode(string bar)
{
textBox1.Text = bar;
}
В классе MsgWindow есть некоторое изменение, и вместо того чтобы отдать считанные данные напрямую в TextBox1, событие передаётся обработчику события CallBackMy. Если надо, чтобы считывание работало, только в текущей форме то можно просто вернуть строчку с TextBox1, мы же хотим чтобы считывание работало во всех формах нашего приложения, поэтому делаем следующее:
В Program.cs описываем класс:
public static class CallBackMy
{
public delegate void callbackEvent(string what);
public static callbackEvent callbackEventHandler;
}
Добавляем в проект ещё одну форму Form2, бросаем на неё TextBox и Кнопку, код второй формы:
public Form2()
{
CallBackMy.callbackEventHandler = new CallBackMy.callbackEvent(this.CipherBarcode);
InitializeComponent();
}
void CipherBarcode(string bar)
{
textBox1.Text = bar;
}
private void button1_Click(object sender, EventArgs e)
{
Form1 frm = (Form1)this.Owner;
frm.return_scaner();
Close();
}
В первой форме, добавляем по кнопке открытие второй формы, и функцию обрабатывающую возврат в первую форму:
private void button2_Click(object sender, EventArgs e)
{
Form2 frm = new Form2();
frm.Owner = this;
frm.Show();
}
public void return_scaner()
{
CallBackMy.callbackEventHandler = new CallBackMy.callbackEvent(this.CipherBarcode);
}
Функция return_scaner() — необходима, чтобы вернуть обработку события чтения ШК от второй формы обратно в первую, обработку события первая форма заберёт автоматически при создании.
На этом пожалуй и всё, должно получится примерно вот так:
Скачать исходник примера:
Скачать файл: ciphertestreader.rar [191.97 Kb] (cкачиваний: 5)