Верность общения с pySerial - PullRequest
       122

Верность общения с pySerial

0 голосов
/ 04 августа 2020

Я пишу программу панели управления с Python для коммерческого контроллера температуры Oxford instruments, с которым мы можем связываться по RS-232. У меня есть программа, написанная с помощью TkInter, но она пропускает символы при записи / чтении с прибора. С PySerial минимальным рабочим примером для воспроизведения проблемы является

import serial
s = serial.Serial(port='COM2', baudrate=9600, timeout=2)  #temp controller on COM2
s.write(b'Q2\r\n')  #initial setup for instrument
for i in range(100):
    print(i, 
          s.write(b'@1R0\r\n'),  #asks for current temperature
          s.readline())

В случайных точках на протяжении 100 итераций я получаю сообщение от прибора, указывающее, что команда была искажена; например,

0 6 b'R100.73\r\n'
1 6 b'R100.73\r\n'
2 6 b'R100.73\r\n'
...etc...
39 6 b'R100.73\r\n'
40 6 b'?@10\r\n'       <---*Error message from instrument
41 6 b'R100.73\r\n'
42 6 b'R100.73\r\n'
...etc...
99 6 b'R100.73\r\n'

Когда i = 40, прибор получил только «@ 10 \ r \ n» вместо «@ 1R0 \ r \ n». Это показывает, что он недоволен знаком "?" в ответ. Кажется, что потеря данных происходит как при записи, так и при чтении. Я не знаю, что делать дальше. Эта проблема становится особенно проблемной c, когда один из последних байтов '\ r' или '\ n' поврежден / утерян.

Добавление задержек, кажется, меняет сообщение об ошибке, которое я получаю (b '' вместо b '? @ 10 \ r \ n' или аналогичный), но эти задержки не решают проблему:

import serial
from time import sleep
s = serial.Serial(port='COM2', baudrate=9600, timeout=2)
s.write(b'Q2\r\n')
for i in range(100):
    sleep(0.01)
    j = s.write(b'@1R0\r\n')
    sleep(0.01)
    k = s.readline()
    print(i, j, k)

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

EDIT: Оказывается, моя ошибка заключалась в том, что я просто забыл запросить два стоповых бита вместо значения по умолчанию (одного). После переключения на два связь с прибором стала достаточно надежной.

...