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 команда, как я показал выше.

Другие вопросы по тегам