
/dev/ttyACM0
두 개의 Python 스크립트를 사용하여 Rasbperry()의 직렬 포트에 액세스하려고 하는데 , 하나가 다른 하나를 차단하기 때문에 분명히 작동하지 않습니다. 문제는 한 스크립트는 직렬 포트에서 읽기만 하면 되고 다른 스크립트는 쓰기만 하면 된다는 것입니다. 쓰기 스크립트는 일부 명령을 보내기 위해 가끔씩만 실행되는 반면, 읽기 스크립트는 다른 장치에서 가끔 메시지를 기록해야 하기 때문에(따라서 항상 수신해야 하기 때문에) 두 스크립트를 결합할 수 없습니다.
나는 글을 쓰려고 노력했다.제삼스크립트와 단일 직렬 포트 간의 중계 역할을 하는 Python 프로그램입니다. 직렬 포트를 수용하고 장치에서 들어오는 데이터를 /dev/ttyACM0_read
읽기 스크립트가 읽을 가상 포트( )에 씁니다. 쓰기 스크립트는 두 번째 가상 포트( /dev/ttyACM0_write
)에 쓰고, 릴레이어는 이 포트에서 데이터를 읽고 이를 직렬 포트에 씁니다. 이것실패가상포트( "could not open port, no such file or directory"
)를 생성할 수 없을 때. 가상 직렬 포트 생성에 관한 검색에서는 유용한 결과가 나오지 않았습니다.
검색하는 동안 이 내용을 발견했지만 socat
(내가 아는 한) 두 포트 사이에만 연결을 생성할 수 있기 때문에 이 경우에 어떤 용도로 사용되는지 알 수 없습니다.
따라서 누군가가 릴레이 Python 프로그램에서 사용할 수 있도록 더미 포트를 만드는 방법을 알려줄 수도 있고, 내가 겪고 있는 단일 포트 2 스크립트 딜레마에 대한 다른 솔루션을 제시할 수도 있습니다.
플랫폼 정보: Linuxarmv6lstretchv9
업데이트: 사용 사례를 명확히 하기 위해 제가 사용하는 Python 스크립트는 다음과 같습니다.
스크립트 작성- 라즈베리에서 URL( )을 호출하면 hostname.local/foo
시리얼 포트가 잠시 열리고 명령어가 전송됩니다.
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()
스크립트 읽기- 직렬 포트에서 들어오는 데이터를 캡처하여 파일에 씁니다.
import serial
ser = serial.Serial('/dev/ttyACM0', 9600, timeout=1)
while 1
#If serial data is available, write it to txt file
ser.close()
가상 포트를 사용하는 특별한 이유는 없으며, 단지 이것이 가장 쉬운 솔루션이라고 생각했습니다.
@meuh가 댓글에서 지적했듯이 포트에서 단독 모드를 취소하면 작동하지만 다음을 사용하여 이를 달성할 수는 없습니다 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:~ $
이후에는 아무 것도 변경되지 않습니다. 두 번째 Python 스크립트는 이전과 같이 EBUSY(장치 또는 리소스 사용 중)를 반환합니다.