문제

GPS 장치 (USB-Serial)에서 Boost :: asio :: serial_port 클래스 읽기에 문제가 있습니다. 장치를 연결하고 읽는 것은 제대로 작동하지만 장치를 분리하고 다시 연결하면 read_some은 포트에서 바이트를 읽지 않습니다.

부스트는 직렬 포트가 사라 졌음을 감지하기 위해 (is_open ()가 true를 반환합니다)을 감지하지 않으므로, 데이터를 얻지 못하면 장치를 주기적으로 취소 (), close () 및 open (gps_port) 포트 옵션을 재설정합니다. 도중에. 그러나 이것은 도움이되지 않습니다. 입력 버퍼는 비어 있습니다.

내가 뭔가를 놓치거나 잘못하고 있습니까, 아니면 ASIO의 버그입니까? 포트가 사라 졌음을 감지하는 표준 방법이 있습니까?

도움이 되었습니까?

해결책

귀하의 경우 정확한 이유가 무엇인지 말하기는 어렵지만 연습은 종종 비활성화해야한다는 것을 보여줍니다. RTS 직렬 포트의 감도.

RTS Real의 핀입니다 RS-232 상대방의 장치가 켜져있을 때 켜진 인터페이스.

serial_port::read_some 기본을 호출합니다 Windows API 이 신호에서 보이는 기능.

당신은 진짜가 없기 때문에 RS-323 장치, 당신은 결함이있을 수있는이 신호의 드라이버 에뮬레이션에 의존해야합니다 (불행히도 종종).

비활성화하려면 호출하십시오 serial_port::set_option(DCB) ~와 함께 RTSControl 로 설정 RTS_CONTROL_DISABLE.

만약에 close()'손잡이가 도움이되지 않으면 문제가 될 수 있습니다. boost. 소스 코드 close() 이렇게 보인다 :

  boost::system::error_code close(implementation_type& impl,
      boost::system::error_code& ec)
  {
    if (is_open(impl))
    {
      if (!::CloseHandle(impl.handle_))
      {
        DWORD last_error = ::GetLastError();
        ec = boost::system::error_code(last_error,
            boost::asio::error::get_system_category());
        return ec;
      }

      impl.handle_ = INVALID_HANDLE_VALUE;
      impl.safe_cancellation_thread_id_ = 0;
    }

    ec = boost::system::error_code();
    return ec;
  }

, 즉 IF CloseHandle() 어떤 이유로 든 실패 (또는 교수형) 내부 핸들 값은 할당되지 않습니다. INVALID_HANDLE_VALUE 그리고 is_open() 항상 돌아올 것입니다 true.

이 문제를 해결하려면 확인하십시오 is_open() 직후 close()'ing, 그리고 그것이 돌아 오면 true, 전체 인스턴스를 파괴하십시오 boost::asio::serial_port 그리고 다시 만들어냅니다.

다른 팁

일반적으로 유형을 제외해야합니다 boost::system::system_error 언제 read_some 더 이상 준비가되지 않습니다. 사용해보십시오 read 대신, 오류를 반환하고 단지 돌아 오지 않을 수도 있습니다. 비동기 방법을 시도 할 수도 있습니다. 이 경우 장치가 분리 된 경우 핸들러가 오류 객체를 가져와야합니다.

대체 적으로 당신은 native() 그것을 함수하고 clearcommerror ()를 호출하십시오. 오류를 반환 할 수 있습니다.

ASIO의 쉬운 취급에도 불구하고 boost::ip:tcp, 나는 취급 부스트를 생각한다 serial_port Windows 7에 특별한주의가 필요합니다.
나는 비슷한 문제가 있었고 인스턴스를 재설정하여 극복했습니다 boost::asio::io_service, io_service_.reset().
데이터를 비동기 적으로 읽을 수 있지만 두 번째 시도에서 똑같은 일을하지 못합니다.
사실, 읽기 기능 자체의 문제가 아니었고 비동기식 읽기가 실패하여 즉시 수익을 올렸습니다. boost::asio::io_service::run() 두 번째 시도에서.

요즘 새로운 부스트 라이브러리를 사용하고 있기 때문에 이것이 원래 포스터와 같은 문제인지 확신하지 못합니다.
어쨌든 여기 내 해결책이 있습니다.

// port open step
port_ = boost::shared_ptr<boost::asio::serial_port>
        (new boost::asio::serial_port(io_service_));
boost::thread t(boost::bind(&boost::asio::io_service::run, &io_service_));
port_->async_read_some(....);
.......

// port close step
port_->cancel();
port_->close();
port_.reset();

io_service_.stop();
io_service_.reset();  // <-- IMPORTANT: this makes serial_port works in repeat use.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top