2013-06-15 4 views
3

데이터를위한 여러 직렬 포트를 폴링하고 결과를 데이터베이스에 저장하는 realbasic 콘솔 어플리케이션을 작성하고 있습니다.realbasic 살아있는 지 알기 위해 시리얼 포트를 테스트합니다.

나의 초기 아이디어는 포트를 열고 데이터를 읽은 다음 다시 닫는 것이 었습니다. 문제는 직렬 포트를 여는 데 최대 4 초가 걸릴 수 있으며 최대 8 개의 포트를 읽을 필요가 있습니다. 포트의 개폐는 각 사이클마다 실용적이지 않습니다.

직렬 장치가 열려있는 포트에서 연결이 끊어져서 문제가 발생할 가능성이 높습니다.

포트가 열린 상태인지 여부를 감지하여 연결된 장치가 사라진 것을 감지하면 포트를 열린 상태로두고 닫은 다음 다시 열 수 있습니다.

편집

직렬 포트는 블루투스 라디오를 말하고, 블루투스 시리얼 포트 인 마이크로 컨트롤러 차례 회담한다. 블루투스 장치가 범위를 벗어나 효과적으로 직렬 포트를 열어두기 전까지는 듣고 시작하는 모든 문자가 시작과 끝 문자가 있습니다.

물론 포트를 닫고 다시 열어도되지만 장치가 여전히 블루투스 시리얼 포트에 연결되어 있는지 감지하고 싶습니다.

또한 OSX의 직렬 포트에서 serial.close()를 호출하면 일시적인 정지 (바탕 화면 커서가 멈추는 경우)가 발생하며 100 % CPU 사용이 의심됩니다. 이는 Windows에서 발생하지 않기 때문에 포트는 1 분에 10 개의 블루투스 장치에서 데이터를 폴링 할 때 열어야하는 작업입니다.

직렬 포트를 여는 데 최대 4 초가 걸리기 때문에 SPP 직렬 연결 대신 블루투스 라디오에 직접 HID 연결을 사용하는 것이 가장 좋은 해결책이지만, 아무도 실제와 연결하지 않은 것처럼 보입니다. 전에는 블루투스 HID 장치가 없으므로 정보 나 도움이 필요하지 않습니다.

+0

어떤 OS가 필요합니까? –

+0

안녕, 토마스, 윈도우 및 OSX 플랫폼. 시리얼은 여전히 ​​상대적으로 느리다. 가장 좋은 해결책은 블루투스 장치를 HID 장치로 얘기하는 것이지만, 전에는 (비 -USB) HID 장치에 연결하기 위해 realbasic을 사용한 적이 없다. – crankshaft

+0

사용자 공간 장치 처리기를 설치하려면 RB 플러그인을 작성하거나 RB에서 대화하는 데몬을 작성해야합니다. 어느 쪽이든, 당신은 순수한 RB에서 이것을 할 수 없을 것입니다. –

답변

1

일반적으로 사용자가 수행하는 작업은 직렬 포트에 연결 한 다음 해당 포트로 전송 된 데이터를 수신하기 위해 대기하기 때문에 요청이 이상합니다. 다른 방법으로 말해 보겠습니다. 직렬 포트는 연결할 때 데이터를 기다리고있는 데이터를 저장하지 않습니다. 당신은 듣기도하고하지도 않습니다.

포트에 연결하여 데이터를 수신해야합니다. DataAvailable 이벤트를 수신하면 데이터 처리를 시작할 수 있지만 이벤트가 발생하기 전에 스트림의 모든 데이터가 수신 및 처리되지 않을 수 있습니다. 일반적으로 메시지 끝이 무엇인지 판별해야합니다. 때로는 이것이 카라 기 리턴이며 때로는 그렇지 않습니다. 시스템에 따라 다릅니다. 내가 RB에 시리얼 프로그래밍을 한 이후 http://docs.xojo.com/index.php/Serial.DataAvailable

1

에서 DataAvailable에

자세한 내용은 그것은 몇 년이, 그래서 나는 모든 것을 기억하지 않습니다.

Serial 클래스에는 "LineStateChanged"이벤트가 있습니다. BT 연결이 끊어 지거나 다시 연결되면 해당 연결이 호출되는지 확인 했습니까?

그래도 문제가 해결되지 않으면 낮은 수준의 BSD/POSIX 함수를 사용하여 포트를 열고 ioctl() 호출을 사용하여 해당 상태를 파악할 수 있습니다. 나는 이것에 대한 예제가 없다. 그리고 이것이 이것이 올바른 방법임을 확신하지 못합니다. 아마도 C 프로그램이 무엇을하는지 배우고 그것을 RB로 변환 할 것입니다.

나쁜 성능에 대해 : 일반적으로 RB의 이벤트 관리에 대한 제한된 제어 때문입니다. 직렬 포트를 더 자주 폴링 할 필요가 없다는 것을 알지 못합니다. OS에서 더 많은 유휴 시간을 요구하는 다른 이유. 트릭은 높은 빈도 (예 : 10ms마다 한 번)로 타이머를 실행 한 다음 Timer 's Action 이벤트에서 직렬 포트의 Poll 기능을 호출하는 것입니다.