2009-03-31 1 views
2

여기에 아주 이상한 문제가 있습니다. 어쩌면 저를 도와 줄 수 있습니다. 직렬 포트를 통해 연결된 바코드 카드 판독기를 사용하는 Windows CE 6 장치가 있습니다. 나는 이것을 처리하기 위해 Compact Framework의 (v2.0) SerialPort 클래스를 사용하고 있으며 모든 것이 잘 동작하고 있습니다.데이터가 이전에 수신 된 경우 SerialPort.Open()이 시스템을 고정시킵니다. (Compact Framework)

그러나 한 가지 문제가 있습니다. 직렬 포트가 열리기 전에 카드를 스 와이프하면 Open() 호출에서 전체 시스템이 고정됩니다. 예외도없고, 경고도없고, 아무런 이유없이 시스템이 완전히 멈췄습니다. 포트를 열기 전에 버퍼 지우기를 시도했지만 InvalidOperationException이있어 포트가 열린 후에 만이 메서드를 사용할 수 있습니다.

복잡성과 관련이 있는지 확인하기 위해 단순화 된 버전의 코드를 만들었지 만 포트를 여는 버튼이있는 간단한 양식은 같은 방식으로 고정됩니다. 여기에 간단한 코드입니다 : 내가 잘못 뭘하는지 볼 수

private void btConnect_Click(object sender, EventArgs e) 
{ 
     try 
     { 
      this.serialPort = new SerialPort(this.txName.Text, Convert.ToInt32(this.txBaud.Text)); 
      this.serialPort.RtsEnable = this.chRTS.Checked; 

      this.serialPort.Open(); //it freezes here 
      this.btConnect.Text = "Disconnect"; 

      this.txName.Enabled = false; 
      this.txBaud.Enabled = false; 
      this.chRTS.Enabled = false; 
     } 
     catch 
     { 
      MessageBox.Show("Failed to open port. Please check your settings and try again.", "Operation failed", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1); 
     } 
} 

, 나는 그것이 콤팩트 프레임 워크의 버그라고 생각하기 시작하고있다. 카드 판독기는 F03030DKD03003\r\n과 같은 패킷을 전송합니다. 어떤 아이디어? 미리 감사드립니다.

답변

1

내가 직렬 드라이버를 수행 할 때 FIFO가있을 때 수신 데이터 레지스터에 데이터가있는 경우 칩이 잠기는 16550 UART (적어도 그 중 일부)의 버그가 발생했습니다. 사용하도록 설정되었습니다.

FIFO를 활성화하기 전에 드라이버에서 칩을 지워 버리는 버그가 수정되었습니다. 그러나 WinCE 6만큼이나 최근의 버그로 인해이 버그를 처리하지 못했지만, 가능하다면 (아마도 현재 가장 최근의 16550 구현에 더 이상이 버그가 없을 수도 있습니다) 놀랄 것입니다. WinCE에 익숙하지 않습니다 - 일부 DDK에서 사용할 수있는 직렬 드라이버의 소스입니까? 사용중인 직렬 드라이버에 대한 지원/업데이트 옵션이 있습니까?

+0

불행히도 나쁜 가정 - OEM이 직렬 드라이버를 제공합니다. CE는 샘플을 제공하지만 많은 OEM이 이전 버전의 오래된 드라이버를 가져옵니다. – ctacke

3

MS가 제공 한 SerialPort 클래스는 많은 것을 요구합니다. 당신이 정말로 알아야 할 것은 네이티브 콜에서 정확하게 멈추는 부분입니다. 내 생각 엔 내부 버퍼에 데이터가 있거나 어쩌면 오버런이 설정되어 있고 관리되는 래퍼가 그 버퍼를 보충하고있는 것 같습니다.

내 제안은 무료이며 전체 소스와 함께 제공되는 OpenNETCF serial library을 얻는 것입니다. 그것은 MS가 제공하는 클래스와 인터페이스 호환이 가능하며, 드라이버 호출까지 코드를 걸어서 무슨 일이 일어나는지 볼 수 있습니다.