Acesse uma porta serial com dois scripts Python

2

Estou tentando acessar uma porta serial ( /dev/ttyACM0 ) no meu Rasbperry com dois scripts Python, o que obviamente não funciona porque um bloqueia o outro. A única coisa é que um script só precisa ler da porta serial, enquanto o outro só grava nele. Não consigo combinar os dois scripts porque o script de gravação só é executado de vez em quando para enviar alguns comandos, e o script de leitura precisa registrar mensagens ocasionais do outro dispositivo (portanto, precisa estar ouvindo o tempo todo).

EutenteiescreverumprogramaPythonthird,queagiacomoumreléentreosscriptseaportaserialúnica.Eleacompanhariaaportaserialegravariaosdadosdeentradadodispositivoemumaportavirtual(/dev/ttyACM0_read),apartirdaqualoscriptdeleituraserialido.Oscriptdegravaçãogravariaemumasegundaportavirtual(/dev/ttyACM0_write),deondeoprogramaderelélêosdadoseosgravanaportaserial.Issofalhouquandonãoconseguicriarasportasvirtuais("could not open port, no such file or directory" ). Pesquisas sobre a criação de portas seriais virtuais trouxeram nada de útil.

Durante a pesquisa, deparei com socat , mas não consegui identificar se era de alguma utilidade neste caso, já que (até onde eu entendi) só é possível criar uma conexão entre duas portas.

Então, talvez alguém possa me dizer como criar uma porta virtual para que eu possa usá-la com meu programa python de retransmissão ou uma solução diferente aparece no dilema de uma porta e dois scripts.

Informações da plataforma: Linux armv6l stretch v9

Atualização: Para esclarecer o meu uso, aqui estão os scripts python que eu uso:

write-script - ao chamar um URL ( hostname.local/foo ) no Raspberry, a porta serial é aberta rapidamente e um comando é enviado.

import web
import serial

urls = (
    '/foo', 'foo',
)

class foo:
    def GET(self):
        ser = serial.Serial('/dev/ttyACM0', 9600, timeout=1)
        ser.write("<311>")
        ser.close()
        return "Success"

if __name__ == "__main__":
    app = web.application(urls, globals())
    app.run()

read-script - Captura dados de entrada da porta serial e os grava em um arquivo.

import serial

ser = serial.Serial('/dev/ttyACM0', 9600, timeout=1)

while 1
    #If serial data is available, write it to txt file

ser.close()

Não há razão específica para usar uma porta virtual, eu pensei que essa seria a solução mais simples.

Como @meuh apontou nos comentários, a desativação do modo exclusivo na porta funcionaria, mas não consegui obter isso usando setserial :

pi@pizero:~ $ setserial /dev/ttyACM0 ^session_lockout
Cannot set serial info: Operation not supported
pi@pizero:~ $ sudo setserial /dev/ttyACM0 ^session_lockout
pi@pizero:~ $ 

Depois disso, nada mudou e o segundo script python retornou EBUSY (Dispositivo ou recurso ocupado) como antes.

    
por TryingHardStudent 02.05.2018 / 00:12

0 respostas