2012-04-07 24 views
0

我最近從Datalogic購買了3款條形碼閱讀器(2臺Magellan 3300HSi和1臺Gryphon 4400)。製造商提供了一個我已安裝的USB到COM驅動程序,並允許我使用SerialPort類與掃描儀進行通信。一旦我插入掃描儀(通過USB),一個COM端口被添加到設備管理器中,允許我調用它的Open()方法。使用.NET 4.0中的SerialPort與WPF的多個條形碼閱讀器

我正在構建的應用程序的一部分是測試與掃描儀的通信是否正常。這是通過執行測試掃描完成的。在此掃描中使用的方法是:

1.打開掃描器

public static SerialPort OpenPort(string comPortName) 
{ 
    bool error; 
    this.comport = new SerialPort(); 
    this.comport.BaudRate = 9600; 
    this.comport.DataBits = 8; 
    this.comport.StopBits = (StopBits)Enum.Parse(typeof(StopBits), "One"); 
    this.comport.Parity = (Parity)Enum.Parse(typeof(Parity), "None"); 
    this.comport.PortName = comPortName; 

    try{ 
     this.comport.Open(); 
    } 
    catch (UnauthorizedAccessException) { error = true; } 
    catch (IOException) { error = true; } 
    catch (ArgumentException) { error = true; } 

    if (error) 
    { 
      return null; 
    } 

    return comport; 

}

2.數據處理程序聽者

public void PortDataReceived(object sender, SerialDataReceivedEventArgs e) 
    { 
     SerialPort comport = sender as SerialPort; 

     if (!comport.IsOpen) return; 

     string data = comport.ReadExisting(); 

     MessageBox.Show("Data received " + data); 
    } 

3.。附接數據處理器

this.comPort.DataReceived += new SerialDataReceivedEventHandler(PortDataReceived); 

4.編寫關閉/斷開方法

public void CloseScanner() 
    { 
     if (this.comport.IsOpen) 
     { 
      this.comport.Close(); 
      this.comPort.DataReceived -= new SerialDataReceivedEventHandler(PortDataReceived); 
     } 

對於做一個測試掃描,我點擊一個按鈕,OpenPort被調用,則返回的SerialPort對象。我附加數據處理程序。我執行掃描。掃描的數據得到顯示。我關閉掃描儀。

這裏的問題:

這就像一個魅力,如果我只能做一次。如果在關閉串行端口後,我想使用同一個端口執行另一個測試,則端口會成功打開,但不會收到數據。掃描儀(設備)在第二次關閉時發出錯誤嗶聲。

奇怪的是,這隻發生在我的麥哲倫掃描儀上。獅鷲在隨後的重新開放行動中像一個魅力。

爲了讓事情更加奇怪,我使用Putty的串行模式連接到了端口。當關閉膩子並再次打開新的會話時,麥哲倫掃描儀工作得很好。

我的猜測是這與串口在.NET中關閉的方式有關。也許資源沒有被釋放或什麼。起初,我認爲這必須是掃描儀問題,要求我遵循特定的協議來關閉連接。但是,膩子似乎對它的工作很好。 (我猜膩子使用不同的類與掃描儀進行通信,甚至可能使用WIN32 API)。

如果有人知道這可能是什麼原因,請告知。可能這是一些線程問題呢?我正在認真考慮在Putty的源代碼中看看他們如何解決這個問題或者使用WIN32 API(儘管如此,這會讓事情複雜化)。

TLTR: 關閉並重新打開SerialPort,使我無法從條形碼掃描儀接收數據。它僅在端口第一次打開時起作用。我使用製造商的USB到COM驅動程序。我究竟做錯了什麼?(以上代碼片段)

+0

你解決了這個問題嗎?我必須與這些模型一起工作,我不知道數據通信的價格如何。 – gingo 2015-03-18 11:30:33

回答

1

如果您正在開發針對特定設備的條形碼讀取器應用程序,最好使用它們的sdk /對象而不是使用.Net通用SerialPort類。 .Net框架在這個領域並沒有變得更好。這仍然是一種緩慢和越野車。

你可以看看Jan Axelson的網站,它包含很多.Net和Win32的例子。