C #: связь через SerialPort

2

Я хочу записать в serialport com1

01 00 00 02 37 30 04

Эта команда для инициализации..

Когда я пишу массив char или массив байтов

 c[0] = (char)01;//
 c[1] = (char)00;
 c[2] = (char)00;
 c[3] = (char)02;
 c[4] = (char)37;
 c[5] = (char)30;
 c[6] = (char)04;
 serialPort 1.Write(c, 0, c.Length);

byte[] bb1 = System.Text.Encoding.Default.GetBytes(c);

Я вижу в мониторе последовательного порта:  01 00 00 02 25 1E 04 очевидно, 37 преобразуется в 25 и 30 в 1E... Как пройти 37 и 30, а не шестнадцатеричные значения... Я пробовал различные способы...

Теги:
hex
serial-port

4 ответа

7

Монитор последовательного порта показывает значения в шестнадцатеричном формате, поэтому они точно соответствуют точно указанным значениям. Преобразование не происходит, десятичное значение 37 равно 25 в шестнадцатеричном виде, а десятичное значение 30 равно 1E в шестнадцатеричном формате.

Используйте шестнадцатеричную нотацию (0x) для литеральных значений при создании массива, тогда вы увидите, что значения выглядят как ожидаемые в мониторе последовательного порта:

byte[] c = new byte[] {
   0x01,
   0x00,
   0x00,
   0x02,
   0x37,
   0x30,
   0x04
};

serialPort 1.Write(c, 0, c.Length);
2

Проблема заключается в том, что вы указали значения для отправки в десятичном формате и просматриваете их в шестнадцатеричном формате. Очевидно, что будут различия.

Чтобы исправить это, измените свой код, чтобы указать значения в шестнадцатеричном виде, вместо того, чтобы префикс каждого значения 0x, например:

c[0] = (char)0x01;//
c[1] = (char)0x00;
c[2] = (char)0x00;
c[3] = (char)0x02;
c[4] = (char)0x37;
c[5] = (char)0x30;
c[6] = (char)0x04;
serialPort1.Write(c, 0, c.Length);

Затем вы увидите те же значения на выходе, что и ожидаемые.

Также см. @Guffa answer, который показывает лучший способ инициализации массива, по крайней мере, если вы используя С# 3.5.

  • 0
    Инициализация массива работает уже в C # 2, в C # 3 вы можете опустить часть "new byte []".
1

Вы передаете 37 и 30, а не шестнадцатеричные значения.

Вы говорите о просмотре шестнадцатеричных значений?

Если это так, что вы используете для просмотра вывода последовательного порта? Если это не то, что вы написали, это может быть так, как работает программа.

0

Если вы хотите передать 37 в hex, используйте 0x37 вместо 37.

  • 1
    «Как передать 37 и 30, а не шестнадцатеричные значения»
  • 2
    Да, я это заметил. Тем не менее, я подумал, что это может быть возможно, что желаемый ввод дается в шестнадцатеричном формате, и Кал не заметил этого
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню