Соединение TCP / IP Socket отправляет шестнадцатеричные данные, используя C # и JAVA - PullRequest
0 голосов
/ 02 октября 2019

Привет! Мне нужно использовать TCP / IP или RS232 для связи со считывателем UHF RFID. Я решил использовать TCP / IP через RS232.

Мне нужно выполнить шестнадцатеричную команду для устройства, как показано ниже для отправки и получения данных.

Определение пакета данных команды хоста enter image description here

Определение пакета ответа

enter image description here

Некоторые определения команды enter image description here

Пример использования команды

enter image description here

Этот протокол представляет собой спецификацию связи для управления считывателем UHF RFID с его главного компьютера через последовательный интерфейс. Команды и ответы состоят из потоков байтов. Длина потоков является переменной, и пакеты проверяются контрольной суммой.

Физический интерфейс совместим со спецификациями RS - 232. 1-й разряд, 8 бит данных, 1 стоповый бит, нет четной нечетной проверки. Скорость передачи данных может быть установлена ​​на 38400 бит / с или 115200 бит / с. Скорость передачи по умолчанию составляет 115200 бит / с.

Как мне заполнить шестнадцатеричные данные, чтобы отправить команду и получить обратно данные. У меня возникла проблема с пониманием определения пакета данных, по крайней мере, если бы я знал, как структурировать значение байта, мне будет легче. Я открыт для любого другого подхода. Большое вам спасибо.

1 Ответ

0 голосов
/ 02 октября 2019

Может быть, вы хотите создать свой собственный класс, представляющий сообщение (здесь, в C #):

public class CommandDataPacket
 {
 public byte Head
 {
  get
   {
   return 0xA0;
   }
  }

  public byte Length
  {
   get
    {
    return Data.Length + 3;
    }
   }

  public byte Address {get;set;}

  public byte Command {get;set;}

  public byte[] Data {get;set;} = new byte[0];

  public cyte Check
  {
   get
    {
     // did not find anything how to calculate the check Byte. You'll have to implement it
    }
   }

  public byte[] ToBytes()
   {
   List<byte> result = new List<byte>();
   result.Add(Head);
   result.Add(Length);
   result.Add(Address);
   result.Add(Command);
   result.AddRange(Data);
   result.Add(Check);
   return result.ToArray();
   }
 }

Пожалуйста, убедитесь, что он действительно соответствует спецификации в вашем вопросе. Я не проверил это тщательно, но я надеюсь, что вы поймете, как реализовать нечто подобное. Для определения пакета ответа может быть создан другой класс.

Вы можете использовать этот класс, как показано в следующем примере:

CommandDataPacket msg = new CommandDataPacket
 {
 Address = 0x12,
 Command = 0x45,
 Data = new byte[] { 0x03, 0x05, 0x07 }
 };
byte[] rawMessage = msg.ToBytes();

Вы можете использовать класс TcpClient для отправки этого байтового массива на другой хост.

...