직렬 포트 쓰기 메소드가 데이터를 보내기 전에 줄이 지워질 때까지 기다리려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/222455

문제

다음은 내가하려는 일에 대한 배경입니다.

  1. 모바일 장치에서 Bluetooth 프린터로 직렬 포트를 엽니 다.
  2. Bluetooth 프린터에 EPL/2 양식을 보내서받을 데이터를 처리하는 방법을 이해하도록하십시오.
  3. 양식이 접수되면 레이블 스톡에 인쇄 될 프린터에 일부 데이터를 보내십시오.
  4. 각 레이블을 인쇄 할 때마다 필요한만큼 3 단계를 반복하십시오.

양식이 각 레이블보다 우선 할 필요가 없으므로 2 단계 만 발생합니다. 내 문제는 양식을 보낼 때 레이블 데이터를 너무 빨리 보내면 인쇄되지 않는다는 것입니다. 때때로 나는 보낸 데이터 대신 라벨에 "Bluetooth Failb : Radio Non-operational"이 인쇄됩니다.

다음을 수행함으로써 문제에 대한 방법을 찾았습니다.

for (int attempt = 0; attempt < 3; attempt++)
{
    try
    {
        serialPort.Write(labelData);
        break;
    }
    catch (TimeoutException ex)
    {
        // Log info or display info based on ex.Message
        Thread.Sleep(3000);
    }
}

따라서 기본적으로, 나는 시간 초과 exception을 잡고 일정 시간을 기다린 후에 쓰기 방법을 다시 시도 할 수 있습니다 (3 초는 항상 작동하는 것처럼 보이지만 덜 작동하는 것처럼 보이며 모든 시도마다 예외를 던지는 것 같습니다). 세 번의 시도 후 나는 직렬 포트에 뭔가 잘못되었다고 가정하고 사용자에게 알려줍니다.

이 방법은 잘 작동하는 것 같지만 이것을 처리하는 더 좋은 방법이 있다고 확신합니다. Serialport 클래스에는 사용해야한다고 생각하는 몇 가지 속성이 있지만 실제로 사용 방법에 대한 좋은 문서 나 예제를 찾을 수는 없습니다. 나는 일부 속성을 가지고 놀았지만 그중 어느 누구도 내가 달성하려는 일을하지 않는 것 같습니다.

다음은 내가 한 재산 목록입니다.

  • CD 홀딩
  • ctsholding
  • DSR 홀딩
  • dtrenable
  • 악수
  • rtsenable

나는 이것들의 일부 조합이 내가 더 우아하게하는 일을 처리 할 것이라고 확신합니다.

Zebra QL 220+ Bluetooth 프린터 및 Windows Mobile 6 핸드 헬드 장치 인 C# (2.0 프레임 워크)을 사용하고 있습니다. 솔루션에 차이가있는 경우.

모든 제안은 감사 할 것입니다.

업데이트

또한 모바일 장치가 Bluetooth 2.0을 사용하는 반면 프린터는 버전 1.1에만 사용됩니다. 속도 차이가 데이터를 수신 할 때 프린터가 뒤쳐지게하는 것이라고 가정합니다.

도움이 되었습니까?

해결책

Flow Control은 여기서 정답이며 Bluetooth 연결에 존재/구현/적용 할 수 없습니다.

Zebra 사양을 확인하고 이들이 구현 여부 또는 켜질 수 있는지 확인하십시오. 소프트웨어 흐름 제어 (Xon, Xoff)를 통해 다양한 버퍼가 가득 찼을 때 확인할 수 있습니다.

또한 Bluetooth 라디오는 최대 250k보다 빠르게 전송할 수 없을 것입니다. 인위적으로 제한하는 것을 9,600bps로 고려할 수 있습니다. 이는 라디오에 레트라 스미트, 오류 수정, 감지 및 자체 흐름 제어를위한 많은 호흡 공간이 가능합니다.

다른 모든 것이 실패하면 지금 사용하고있는 해킹은 나쁘지 않지만 Zebra Tech 지원에 전화하여 포기하기 전에 추천 사항을 찾을 것입니다.

-아담

다른 팁

글쎄, 나는 이미 주어진 두 가지 제안을 바탕으로 이것을 할 수있는 방법을 찾았습니다. 다음과 함께 직렬 포트 개체를 설정해야합니다.

serialPort.Handshake = Handshake.RequestToSendXOnXOff;
serialPort.WriteTimeout = 10000; // Could use a lower value here.

그런 다음 글을 쓰기 만하면됩니다.

serialPort.Write(labelData);

Zebra 프린터는 소프트웨어 흐름 제어를 지원하므로 버퍼가 거의 가득 차면 모바일 장치로 Xoff 값을 보냅니다. 이로 인해 모바일 장치가 프린터에서 XON 값이 전송 될 때까지 대기하여 모바일 장치에 계속 전송할 수 있음을 효과적으로 알립니다.

쓰기 타임 아웃 속성을 설정하면 쓰기 시간 초과 예외가 발생하기 전에 전송에 허용되는 총 시간을 제공합니다. 질문에서 내 샘플 코드에서 한 것처럼 여전히 쓰기 시간 초과를 포착하고 싶을 것입니다. 그러나 소프트웨어 흐름 컨트롤이 일련의 포트 쓰기 전송을 시작하고 중지하기 때문에 매번 3 번 (또는 임의의 양) 시간을 루프 할 필요는 없습니다.

문제는 일련의 포트 코드가 아니라 기본 블루투스 스택과 관련이있을 수 있습니다. 당신이 사용하고있는 포트는 순전히 가상이며, 악수가 구현 될 가능성은 거의 없습니다 (크게 의미가 없기 때문에). CTS/RTS DTR/DSR은 단순히 작업중 인 작업에 적용 할 수 없습니다.

근본적인 문제는 가상 포트를 만들 때 그 아래에 Bluetooth 스택에 바인딩하고 페어링 된 직렬 장치에 연결해야한다는 것입니다. 포트 자체는 그것이 얼마나 오래 걸릴지 모르고 아마도이 일을 비동기 적으로 수행하도록 설정되었을 것입니다 (비동기 OEM에 달려 있음) 발신자가 오랫동안 잠금을 막지 않도록합니다. 페어링 된 장치 또는 페어링 된 장치가 범위가 벗어났습니다.

코드는 해킹처럼 느껴질 수 있지만 아마도 당신이하고있는 일을하는 것이 가장 좋고 휴대용 방법 일 것입니다.

Bluetooth 스택 API를 사용하여 연결하기 전에 장치가 있는지 확인하려고 시도 할 수 있지만 스택 API의 표준화는 없으므로 Widcom과 Microsoft API는 그렇게하는 방식에 따라 다르며 Widcom은 독점적이며 독점적이며 값비싼. 당신이 끝나는 것은 스택 유형을 발견하고 적절한 검증기 클래스를 동적으로로드하고 스택을 호출하고 장치를 찾는 것입니다. 이에 비추어, 당신의 간단한 설문 조사는 훨씬 더 깨끗해 보이며, 당신은 Widcom SDK를 위해 몇 달러를 껍질을 벗길 필요가 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top