Проблема отправки байтов с pySerial и socat - PullRequest
1 голос
/ 02 апреля 2011

Я хочу отправить несколько байтов через pySerial.Я создал виртуальные последовательные порты с socat для тестирования:

socat PTY,link=./ptyp1,b9600 PTY,link=./ptyp2,b9600

Вот код Python:

ser = serial.Serial('./ptyp1')
x = struct.pack('B',2)
print binascii.hexlify(x) # 02
ser.write(x)
y = ser.read(2)
print binascii.hexlify(y) # 5e42

Выходной сигнал, который я получаю:

02   # x
5e42 # y

ВыходЯ ожидаю:

02 # x
02 # y

Что я здесь не так делаю?Это сокат или питон?

Редактировать:

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

x = 12  => y = 5E 52 0D 0A 5E 50
x = 100 => y = 100 # why does it work here?

Решение:

Проблема заключалась в том, что я читал на том же порту, на который писал.Если я правильно понял, socat «соединяет» два порта как «in» и «out».Поэтому я должен читать ./ptyp2, если я пишу ./ptyp1.После этого все хорошо.

Ответы [ 3 ]

1 голос
/ 20 мая 2011

Проблема заключалась в том, что я читал на том же порту, на который писал.Если я правильно понял, socat «соединяет» два порта как «in» и «out».Поэтому я должен читать ./ptyp2, если я пишу ./ptyp1.После этого все хорошо.

0 голосов
/ 02 апреля 2011

То, что вы, похоже, получаете назад, это строка "^ B".Возможно, что socat (или что-то еще по пути) интерпретирует отправляемый вами байт (\x02) как какой-то управляющий код.

С макушки головы, Ctrl-B является мнемоникой страницы, но я не уверен.

0 голосов
/ 02 апреля 2011

Я установил socat для проверки вашего кода.Я запустил эту строку:

socat PTY,link=./ptyp1,b9600 PTY,link=./ptyp2,b9600

Затем работает следующий код:

from binascii import hexlify
from serial import Serial, struct

ser = Serial('ptyp1')
x = struct.pack('B', 2)
print hexlify(x) # 02
ser.write(x)
y = ser.read()
print hexlify(y) # 5E
y = ser.read()
print hexlify(y) # 42

Ouput:

02
5e
42
...