我最近從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驅動程序。我究竟做錯了什麼?(以上代碼片段)
你解決了這個問題嗎?我必須與這些模型一起工作,我不知道數據通信的價格如何。 – gingo 2015-03-18 11:30:33