시리얼 통신에서 둘 이상의 프로세스가 작동할때의 질문입니다.
글로 설명이 힘든 줄 알지만, 어디를 봐야 할지 짐작가는 데가 전부 없어져서 질문 올려 봅니다.
타겟 보드와 다른 보드 사이에서 RS485 로 시리얼 통신을 하고 있습니다. ( 2선이용. 제어선 없음. 우선은 1:1 통신)
이 시리얼 프로그램은, [다른 보드]를 일정 시간 간격(현재는 1초로 설정 )으로 감시(정해진 패킷을 보내고 그에 대한 데이터를 받음)합니다. 이 시리얼 프로그램 자체는, 혼자 돌 때는 에러 없이 잘 돌아갑니다.
그런데요. Com port를 사용하지 않는, touch pad의 입력을 감시하는 프로그램을 실행시킨 후에 위의 시리얼 통신 프로그램을 실행시키면, 이상하게 4번에 1번 - 7번에 1번정도로 에러가 납니다.
에러가 난다는게.... 감시 프로그램이 보낸 패킷에 대한 답을 수신하는 것이 실패하는 거죠.
근데, 실제로 데이터가 [다른 보드]에서 송신 안 되는 건 아니고, 단지 타겟 보드에서 (데이터가 송신되었음에도 불구하고) 수신을 못 하는 거더라구요.(이건 시리얼 케이블 모니터로 직접 오가는 데이터를 확인했습니다.)
즉, [다른 보드]는 타겟 보드에서 패킷(10-20 byte)을 받아 그에 따른 응답 데이터(10-40byte)를 송신하는데, [타겟 보드]가 막상 수신을 못하더라구요.
그래서....
1. 혹시 [Blocking mode - Non blocking mode] 의 문제가 아닌가...생각해서, 두 개의 프로그램(Touch 감시, RS485 감시)를 blocking / non blocking mode로 해 봤습니다.
근데 결과는 같더군요.
2. 특히 Touch 프로그램의 경우는, touch device를 select()를 써서도 감시해 보고, 단순히 select() 없이 read()만으로 감시하는 것도 해 봤는데, 결과가 같더라구요.
3. 프로세서 파워나 메모리의 문제인가 ... 해서, Touch 감시 프로그램보다 훨씬 무거운 GUI 프로그램 + 시리얼 감시 프로그램 으로 돌려 봤습니다만, 이때는 오히려 문제가 전혀 없었습니다.
일단 touch 프로그램은 시리얼을 전혀 안 쓰니까, 메모리 공유 문제나 뭐 그런 거는 아닐거라고 생각하는데요, 뭐가 문제인지 모르겠네요.
설명이 부족한 건 알지만, 혹시 어디가 문제인 지 짐작가시는 부분이 있으신 분들은, 주저말고 말씀해 주시기 바랍니다. 제 머리에서 짐작가는 부분은 다 건드려 봐서, 어디를 더 뒤져봐야 될 지 모르겠습니다.
혹시나 해서 에러 상황을 조금 더 자세히 설명하면요,
[다른 보드]가 송신하는 데이터는 크게 [ACK + DATA] 로 나뉘는데요. ACK는 1 byte, DATA는 대충 10-40 byte(상황에 따라 다름) 입니다. DATA는 패킷 앞뒤에 stx , etx 있구요. 로그를 보면 ACK까지는 잘 수신하는데, DATA를 수신하지 못해서 Retry 하더라구요. 보통 2번째 try에서는 수신하구요, 3번까지 try하는 경우는 딱 한 번 봤습니다.
속도는 57600 이고, 현재 1초에 한번씩 패킷을 송수신합니다.
전에 [타겟 보드] - [다른 보드]간에 RS485 com port테스트하는 프로그램을 간단히 만들어서(1234567890을 그대로 송수신해서 값이 제대로인지아닌지 ), 그때는 하루종일 돌려도 에러가 없던걸 확인했습니다.
그럼....좋은 하루 되시기 바랍니다.
두개의 프로그램이..
쓰레드로 돌리시고 있나요?
댓글 달기