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.