POS для.NET - Моя программа на C# показывает текст в "Microsoft LineDisplay Simulator" вместо реального отображения
Здравствуйте, прекрасное сообщество!
Я использую встроенный дисплей HP 2x20 с розничной системой HP RP 7800 и решил поиграть с ним и написать несколько небольших программ для обучения кодированию.
Образец инструмента, поставляемый с SDK, работает отлично.
Сначала я написал простую программу с использованием Microsoft.IO.Ports и таких простых функций:
SerialPort COM3 = new SerialPort("COM3", 9600, Parity.None, 8);
COM3.Open();
COM3.Write(Clear); // string Clear = "\x1B\x40" - hex value of a control character for the display
COM3.Write("Hello community");
На самом деле все работало нормально, но мне не удалось применить некоторые управляющие символы из руководства HP, и поэтому я решил перейти к POS для.NET.
Так что теперь прямо к делу. Я написал программу на C# с основными функциями и кнопками.
using Microsoft.PointOfService;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
LineDisplay lineDisplay;
PosExplorer explorer;
public Form1()
{
InitializeComponent();
try
{
explorer = new PosExplorer(this);
DeviceCollection devColl = explorer.GetDevices(DeviceType.LineDisplay); // is this line the problem?
//DeviceCollection devColl = explorer.GetDevice("LineDisplay", "HPLCM220Display"); // this one shows errors so I couldnt use it instead of the line above
if (devColl == null || devColl.Count <= 0)
{
MessageBox.Show("Device not found");
return;
}
lineDisplay = (LineDisplay)explorer.CreateInstance(devColl[0]);
lineDisplay.Open();
lineDisplay.Claim(10000);
lineDisplay.DeviceEnabled = true;
lineDisplay.DisplayText("Hello World.!");
lineDisplay.DisplayTextAt(1, 0, "Hey MSDN");
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}
private void btn_Clear_Click(object sender, EventArgs e)
{
lineDisplay.ClearText();
}
private void btn_SendText_Click(object sender, EventArgs e)
{
lineDisplay.DisplayText(textBox1.Text);
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
//this.textBox1.TextChanged -= textBox1_TextChanged;
}
}
}
И когда я запускаю его, он показывает мне симулятор LineDisplay, который можно очистить, а текст можно изменить, но реальный дисплей даже не показывает ничего или очищается.
Итак, вопрос в том, как сделать так, чтобы мое приложение отображало текст на дисплее вместо симулятора. Отладка не очень помогает мне. Я заметил, что в AUTOS он показывает Microsoft.PointOfService.DeviceSimulators.LineDisplaySimulator в значении LineDisplay, поэтому он как-то использует DeviceSimulators, но я не знаю, как и почему..
Я использовал POS для документации.net, но, к сожалению, не удалось https://msdn.microsoft.com/en-us/library/microsoft.pointofservice.linedisplay(v=winembedded.11).aspx
Я предполагаю, что это как-то вокруг - линия сбора устройств
DeviceCollection devColl = explorer.GetDevices(DeviceType.LineDisplay);
//DeviceCollection devColl = explorer.GetDevice("LineDisplay", "HPLCM220Display");
но если я использую закомментированную строку вместо первого, она показывает ошибку:
Error CS0029 Cannot implicitly convert type 'Microsoft.PointOfService.DeviceInfo' to 'Microsoft.PointOfService.DeviceCollection' WindowsFormsApplication14 C:\Users\admin\Documents\Visual Studio 2015\Projects\WindowsFormsApplication14\WindowsFormsApplication14\Form1.cs 27 Active
Я пытался найти решение для CS0029, но, к сожалению, мне не удалось найти какое-либо соединение с моей проблемой.
Я никогда ничего не программировал, поэтому я новичок с дерьмовым кодом, но я стараюсь учиться, поэтому, если кто-то так любезен, чтобы пролить свет на эту проблему, я был бы очень благодарен:)
1 ответ
К вашему устройству может быть подключено несколько торговых точек (линейные дисплеи, POS-принтеры, сканеры штрих-кода и т. Д.). Все эти устройства сгруппированы в так называемые классы (а именно LineDisplay, PosPrinter, Scanner и т. Д.). К системе может быть подключено несколько устройств одного класса. Например, на обычной POS-станции достаточно часто иметь два сканера штрих-кодов - планшетный для сканирования обычных предметов и карманный для обнаружения негабаритных предметов.
PosExplorer
Класс позволяет перечислять все установленные POS-устройства и создавать экземпляры выбранных.
explorer.GetDevices(DeviceType.LineDisplay)
возвращает дескрипторы всех линейных дисплеев, установленных в вашей системе. Дескрипторы возвращаются в коллекции типа DeviceCollection
, Каждый предмет в этой коллекции имеет DeviceInfo
тип. Вы можете перебирать эту коллекцию, проверять свойства предметов и подбирать их для дальнейшей манипуляции.
explorer.GetDevice("LineDisplay", "HPLCM220Display")
возвращает дескриптор точного устройства по классу и имени ("HPLCM220Display"
отображение строки в вашем случае). Возвращаемый дескриптор имеет тип DeviceInfo
, Вот почему у вас была ошибка компиляции - у вас ее не было бы, если бы вы использовали правильный класс
DeviceInfo devInfo = explorer.GetDevice("LineDisplay", "HPLCM220Display");
Обратите внимание, что второй параметр GetDevice()
должно быть логическим именем или псевдонимом устройства. Вы можете перечислить эти имена с помощью следующей команды:
"%ProgramFiles%\Microsoft Point Of Service\posdm.exe" ListNames /type:LineDisplay
или (в системах x64):
"%ProgramFiles(x86)%\Microsoft Point Of Service\posdm.exe" ListNames /type:LineDisplay
После того, как вы нашли дескриптор (DeviceInfo
) желаемого устройства, вы можете использовать его для создания экземпляра объекта устройства, который предоставляет вам реальный интерфейс для управления устройством:
lineDisplay = (LineDisplay)explorer.CreateInstance(devInfo);
Так что ваш код может выглядеть так:
// ...
explorer = new PosExplorer(this);
DeviceInfo devInfo = explorer.GetDevice(DeviceType.LineDisplay, "HPLCM220Display");
if (devInfo == null)
{
MessageBox.Show("Device not found");
return;
}
lineDisplay = (LineDisplay)explorer.CreateInstance(devInfo);
lineDisplay.Open();
// ...
Отвечая на вопрос devColl[0]
а также devColl[2]
в ваших комментариях:
В вашей системе установлено по крайней мере три линейных дисплея. Первый - это виртуальное устройство отображения, установленное с POS для.NET SDK. Вы получили к нему доступ через devColl[0]
, Не могу ничего сказать о втором. И третий - ваш настоящий встроенный дисплей HP 2x20, к которому вы обращались с помощью devColl[2]
дескриптор. Вы можете перечислить все устройства с posdm
команда, как я показал выше.