2016-03-25 3 views
0

Это код, который считывает из z1 соринкиClash связи между последовательным портом чтения и записи Коды

while True: 
    if not ser.isOpen(): 
     try: 
     ser = serial.Serial(z1port, z1baudrate,timeout=0, parity=serial.PARITY_NONE, 

        stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS) 
     except: 
     sys.exit("Error connecting device") 

    queue = ser.inWaiting() 
    if queue > 0: 
     data = ser.read(1000) 
     print data 
    time.sleep(0.2) 

И это код, который у меня есть, что я использую его, чтобы написать сучок

# some event-driven code here so that whenever a message is received then do: 
print(str(msg.payload)) 
ser = serial.Serial("/dev/ttyUSB1") 
print ser.isOpen() 
ser.write(msg.payload) 

выход из второго кода должно быть, если msg.payload = «привет»:

hello 
True 

Но тогда код для чтения перестает считывать данные из последовательного порта (код будет работать, но без ввода). Как решить эту проблему?

+1

Вы создаете два последовательных соединения с одним и тем же портом (/ dev/ttyUSB1)? Это будет проблемой. – mhopeng

+0

@mhopeng Как я могу использовать одно и то же соединение? Или собрать их вместе, чтобы получить требуемый результат? –

+0

см. Мой ответ для примера. – mhopeng

ответ

0

Я использовал идею @mhopeng для написания кода, который реализует многопоточное программирование, где одна функция обрабатывает чтение, а другая обрабатывает запись. И прежде чем они оба будут вызваны, я подключусь к последовательному порту и передам его в оба потока.

Мне пришлось использовать многопоточность, потому что мне нужен отдельный поток для записи в любое время с пользовательского ввода.

1

Вы можете создать только одно последовательное соединение с устройством. Код в вашем вопросе создает два соединения: одно в основной и одно в подпрограмме. В основной программе, необходимо создать соединение для установления связи с устройством:

ser = serial.Serial(z1port, z1baudrate) # I assume z1port='/dev/ttyUSB1' 

Затем в подпрограмме можно также создать соединение:

ser = serial.Serial("/dev/ttyUSB1") 

Так что есть два соединения пытаются использовать тот же порт. Это не будет работать.

Вместо этого вы должны использовать исходное соединение по всей вашей программе, и определить свои подпрограммы, чтобы получить соединение в качестве входного параметра. Например:

ser = serial.Serial(z1port, z1baudrate) 
# do whatever to make connection to the device 
getMessage(ser) # call subroutine to read data *with the existing connection* 
ser.close()  # close connection when finished 

def getMessage(serConn): 
    # read data 
    data = serConn.read(1000) 
    # send ack 
    serConn.write(b'OK') 

Другой вариант - открывать и закрывать последовательные соединения по всему вашему коду, когда вам нужно общаться. Это, как правило, гораздо менее эффективно, и имеет смысл только в том случае, если с устройством будет только прерывистая связь.

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