2017-01-20 3 views
2

Я хотел бы отправить байт (желательно 0000 0001) через последовательный порт с использованием пользовательского класса Python-скрипта, но, к сожалению, я новичок в Python с фоном в Basic. Я включил код ниже попытки, которую я нашел на лабораторном ПК у коллеги, который сейчас ушел.Отправка байта через последовательный порт - пользовательский класс python

Из чего я могу сказать, будет отправлено содержимое pulseValue. Однако, когда я устанавливаю pulseValue в '1' в программе просмотра eyetracking, которую я использую, отправляется более одного бита. Я думаю, что программа требует установки pulseValue, иначе я думаю, что мог бы write(bytes(*something*)).

Мне было интересно, выглядит ли код ниже, что он будет делать, что мне нужно от него?

import sreb 
import serial 

class pulseSend(sreb.EBObject): 

    def __init__(self): 
     sreb.EBObject.__init__(self) 
     self.serial = serial.Serial(0) 

    def sendPulse(self,pulseValue): 
     """RETURN:0""" 
     self.serial.write(pulseValue) 


     return 0 
+0

Я уверен, что ваш уценки был поодаль - Я обновил свой вопрос немного прояснить. Если это не правильно, вы всегда можете вернуться и [изменить] свой вопрос. –

ответ

0

'1' является строка, содержащая символ 1 (который имеет ASCII код 65), а не числом 1. Это в двоичной системе 01000001, так что да, есть больше чем один бит. Ваши требования не очень ясны, но я думаю, что вы хотите написать chr(1) для символа с минимальным набором бит. Вы можете записать chr(0x01) (шестнадцатеричный) или chr(0b00000001) (двоичный код), чтобы сделать значение бита символа более четким.

0

Ваш вопрос отсутствует, как именно вы вызываете код, но я предполагаю, что вы сделали что-то вроде этого:

sender = pulseSend() 
sender.sendPulse('1') 

Как jasonharper упоминает, что это неправильно, потому что вы посылающий текст'1'. Текст, как правило, кодирует ASCII (хотя в Python3 это UTF). ASCII использует цифры 0-255 (или 0000 0000 - 1111 1111) для создания персонажей. Характер '1' фактически является целым числом 49:

>>> ord('1') 
49 

Если вы можете отправить фактическое целочисленное значение, это здорово:

sender.sendPulse(1) 

Но вы не можете быть в состоянии, в этом случае (как jasonharper также упоминает), вы захотите преобразовать значение int в его значение символа, которое вы делаете с chr. Вот несколько различных способов, вы могли бы написать «отправить строку, которая соответствует двоичным 0000 0001»:

sender.sendPulse('\x01') # using the hex escape code 
sender.sendPulse(chr(1)) # the integer 1, so `1111 1111` would be 255 
sender.sendPulse(chr(0x01)) # hex literal 
sender.sendPulse(chr(0b01)) # Binary literal. Could also be 0b00000001. You could use `0b0000_0001` or `0b_0000_0001` in Python 3.6+ 
+0

Я думал, что это может быть так, но я не был уверен, как отправить '0000 0001', а не символ 1. Мне нужно назначить' pulseValue' в графическом интерфейсе eyetracker - нет кода, доступного для 'sender .sendPulse (pulseValue) "к сожалению. Есть ли способ, которым я могу преобразовать это значение в то, что мне нужно, с чем-то вроде 'self.serial.write (chr (pulseValue))?? (Хотя, конечно, этот пример отправил бы «1111 1111»). –

+0

Было бы намного проще, если бы я мог использовать один из ваших примеров, но правильно ли я считаю, что мне нужно использовать переменную 'pulseValue' каким-то образом, поскольку она была передана классу? –

+0

Обновление: я просто использовал тестер последовательного порта и не понял, что, хотя я правильно настроил порт COM1 на компьютере, разные программные средства по-прежнему используют другую скорость передачи данных и т. Д. После настройки тестера портов аппарат I необходимость запуска может различать разные символы, что отлично. 'self.serial.write (chr (pulseValue))' должен работать, но в настоящее время я получаю некоторые ошибки библиотеки python. Будет обновляться после его работы! –

Смежные вопросы