Здравствуйте. Я пытаюсь отправить команды на фискальный принтер через 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();
}