2012-01-31 2 views
0

필자가 작성한 C# 어플리케이션에 블루투스 (블루스 미르호 금 장치)를 통해 통신하는 arduino 메가가 있습니다. arduino는 항상 32 문자의 직렬 신호를 보내고, 첫 번째는 항상 "S"이고 마지막은 "E"입니다. 퍼티를 사용하면이 신호가 정확하게 99 %의 시간 동안 전송되고 있음을 확인할 수 있습니다.안정된 블루투스 시리얼 통신을위한 통신 속도

public string receiveCommandHC() 
    { 

     string messageHC = ""; 
     if (serialHC.IsOpen) 
     { 

      while (serialHC.ReadChar() != 'S') 
      { 

      } 
      messageHC = serialHC.ReadTo("E"); 
      serialHC.DiscardInBuffer(); 
     } 
     return messageHC; 

    } 

serialHC 직렬 클래스입니다 :

지금 내가 다음 코드를하고있는 중이 야 내 C# 응용 프로그램으로이 신호를 읽고 싶어.

가끔은 완벽하게 작동하지만 다른 경우에는 문제가 발생하기 때문에 가끔은 작동하지만 다른 이유는 알 수 없습니다.

내가 가진 것처럼 보이는 문제는 내가 arduino에서 읽은 데이터에 약간 큰 지연을 가져 오는 경우가 있다는 것입니다. 버튼 상태를 보냈기 때문에이 사실을 알았고 실제로 버튼을 누르거나 아루 두이 노를 릴리스 한 후 몇 초만 바뀝니다. 블루투스 장치의 표준 전송 속도 인 115200을 사용하여 훨씬 낮은 속도로 변경하면 더 나은 결과를 얻을 수 있을지 궁금해하고 있습니까? 이점이 있으면 어떻게 될까요? 나는 높은 통신 속도를 필요로하지 않으며, 상태를 4-5 번 업데이트하는 것조차도 내 응용 프로그램에 허용 될 것입니다.

지연이 제 코드에서 오는 것이 가능합니까? 나는 그것이 "S"를 기다리고있는 while 회 돌이일지도 모른다라고 생각한다. 그러나 그 다음 나는 항상 고속으로오고있는 새로운 신호가 있기 때문에 왜 거기에 매달려야하는지 안다.

나는 오래된 데이터는 신경 쓰지 않고 그냥 건너 뛰고 싶기 때문에 DiscardInBuffer()를 사용하고 있습니다. 최신 데이터를 읽고 그 신선한 데이터에 대해 행동하는 것이 훨씬 더 중요합니다.

도움 주셔서 감사합니다.

안부,

벤더

업데이트 : debuging 동안

그냥 조금 더 정보를 알아 냈다.

블루투스를 통해 연결
  1. 두 번째 블루투스 연결이 다른 장치 (다른 COM 포트와 다른 보드로 PC에서 설립
  2. (USB 케이블을 통해 전혀 지연 없음) : 문제에만 나타납니다 것 속도)

누구나 PC에서 동일한 블루투스 동글에서 두 개의 다른 장치를 실행하는 erxperiances가 있습니까? 나는 두 가지 문제에 모두 연결할 수 있지만 이전에 언급 한 지연 문제는 여전히 가지고 있습니다. 어떤 도움

+0

receiveCommandHC() 호출을 트리거하는 데 사용 하시겠습니까? 이 루프가 명령을 정상적으로 수신 할 가능성이 있지만, 다음 몇 가지 incomming msg는 지연 중에 serialport에 의해 버퍼링됩니다. 가장 오래된 메시지가 먼저 읽히고 더 새로운 메시지가 삭제됩니다. 하나의 빠른 디버깅 실험은 더 이상 새로운 메시지가 버려지는지 확인하기 위해 삭제를 주석 처리하는 것입니다. 나는 지금 같은 전송 속도를 유지할 것이다. – jdh

+0

안녕하십니까, 귀하의 응답을 주셔서 감사합니다, 나는 incomming 데이터를 읽는 모든 50ms를 실행하는 타이머를 사용하고 있습니다. – Bender

+0

포트를 열 때 SerialPort가 DTR 신호를 보내는 것은 이상합니다. 이것을 명시 적으로 false로 설정하십시오. – leppie

답변

3

현재 물리적 직렬 포트를 사용하지 정말 있습니다에 대한

감사합니다. BlueTooth 드라이버는 을 에뮬레이트합니다. 이것은 일반적이며, Windows API에는 직렬 포트와 통신 할 수있는 API 함수 세트가 잘 정의되어 있습니다. 하나를 모방하면 드라이버 인터페이스가 단순 해지기 때문에 공급 업체는 인터페이스 DLL을 제공하거나 복잡한 DeviceIoControl() 프로토콜을 문서화 할 필요가 없습니다.

실제 통신 설정이 중요하지 않다는 것을 의미합니다. 전송 속도는이 시나리오에서 의미가 없습니다. 전송 속도를 설정하는 것은 BlueTooth 무선 신호입니다. 운전 기사는 귀하가 선택한 것을 수락하지만 그렇지 않으면 무시합니다. 핸드 쉐이크 신호 일 수 있습니다.이를 구현하는 것은 드라이버에게 달려 있습니다. 통신 오류보고는 거의 구현되어 있지 않습니다. BlueTooth에는 실제 직렬 포트와 달리 오류 수정 프로토콜이 있습니다.

아니요, 데이터 손실은 완전히 자체 유발됩니다. 분명히 드라이버 에 DiscardInBuffer()를 구현합니다. 어떤 것도 달성하지만 운전자가받은 모든 데이터는 버려야합니다. 코드가 조금 늦게 실행되거나 쓰레드 컨텍스트 스위치에 의해 인터럽트되면 이것은 잘못 될 수 있습니다.

DiscardInBuffer() 호출을 삭제하십시오.

+0

안녕하세요, 도와 주셔서 감사합니다. 나는 DiscardInBuffer()를 삭제하려고 시도했는데, 나는 그 작업과 관련이 있을지 모르지만 추가 테스트를 할 때 실제로 지연 시간이 길어질 것임을 알았습니까? 장치가 USB와 연결된 경우에도 DiscardInBuffer()없이 지연이 발생했습니다 ... – Bender

+1

DiscardInBuffer는 아무런 문제가 없지만 문제를 일으 킵니다. 다른 쪽 끝에서 자주 데이터를 보내지 마십시오. 또는 기본 앱에서 요청할 때만 보내십시오. –

+0

그래, 내일 실험실에서 이걸 꼭 시험해 봐야 겠어. – Bender