Связь через SerialPort, конец бит? - PullRequest
0 голосов
/ 09 ноября 2019

Здравствуйте. Я пытаюсь отправить команды на фискальный принтер через SerialPort.

Я отправляю определенную команду для печати определенной бумаги. Я создаю пакет в соответствии с задокументированным протоколом:

Имя SOH LEN SEQ CMD DATA Post-amble BCC ETX

Длина / байты 1 1 1 1 0-200 1 4 1

Значение (01h) (20h-FFh) (20h-FFh) (20h-FFh) (20h-FFh) (05h) (30h-3Fh) (03h)

Сокращения:

«SOH» - (начало заголовка) начало упакованного сообщения

«LEN» - общее количество байтов от позиции 2 до позиции 6 плюс фиксированное смещение 20 ч.

«SEQ» -серийный номер пакета. SLAVE добавляет тот же «SEQ» в ответное сообщение. В случае, когда SLAVE получает сообщение с теми же «SEQ» и «CMD», что и последнее правильно принятое сообщение, устройство игнорирует сообщение и повторяет последний пакет, отправленный в HOST.

«CMD» - кодкоманды

«ДАННЫЕ» - данные, согласно команде. Если данных нет, поле длины равно нулю.

«BCC» - контрольная сумма (0000h-FFFFh). Сумма байтов данных из позиции 2 в позицию 6. Контрольная сумма передается в формате ASCІІ (12АВ передается как 31h 32h 3Аh 3Вh).

«ETX» - (конец TeXt) конца упакованного сообщения.

У меня две проблемы.

Прежде всего, конец пакета не распознается. Когда я запускаю пример программы и генерирую пакет 0x01 0x24 0x25 0x45 0x05 0x30 0x30 0x39 0x33 0x03, он печатает желаемый результат. Но при повторном запуске он не реагирует. Я проверил поток последовательного порта с помощью программного обеспечения для мониторинга и заметил, что в моем примере кода следующий массив байтов добавляется к предыдущему и не отправляется отдельно.

Вторая проблема - вычисление BCC, поскольку я вычисляю его, как описано, но (передается 12АВкак 31h 32h 3Аh 3Вh) в документации меня смущает, я не понимаю, почему 3Ah и 3Bh. два последних байта всегда отличаются в моих вычислениях от ожидаемых.

static void Main(string[] args)
        {
            //byte[] data = new byte[1] { 0x0 };
            byte command = 0x45;
            byte[] packet = DaisyPacketBuilder.GetCommandPacket(command);
            //packet is 0x01 0x24 0x25 0x45 0x05 0x30 0x30 0x39 0x33 0x03 
            SerialPort port = new SerialPort("COM4");
            port.BaudRate = 9600;
            port.Parity = Parity.None;
            port.DataBits = 8;
            port.StopBits = StopBits.None;
            port.Handshake = Handshake.None;

            port.Open();
            port.Write(packet,0,packet.Length);

            port.Close();
            port.Dispose();
        }
...