C #: связь через SerialPort - PullRequest
2 голосов
/ 24 июля 2009

Я хочу записать в последовательный порт com1

01 00 00 02 37 30 04

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

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

 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, а не шестнадцатеричныйценности ... я пробовал разные способы ...

Ответы [ 4 ]

7 голосов
/ 24 июля 2009

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

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

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

serialPort 1.Write(c, 0, c.Length);
2 голосов
/ 24 июля 2009

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

Чтобы исправить это, измените код, указав вместо него шестнадцатеричные значения, добавив к каждому значению 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 s answer , который показывает лучший способ инициализации массива, по крайней мере, если выиспользуя C # 3.5.

1 голос
/ 24 июля 2009

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

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

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

0 голосов
/ 24 июля 2009

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

...