.Net SerialPort條碼槍接收數據換行不完全斷斷續續異常
諸多公司通常會有所謂倉儲 有些則會導入條碼掃描取代手動輸入的E化 節省keyin耗時 近期由於移植過來的母公司早期寫的方式透過VB6的code based過舊不合適 要再另外寫一個.net 版本的barcode scanner 擴充程式接收來做不同業務邏輯 此時才發覺使用的條碼槍為rs232串口接收 需要透過 serial port 做讀取接收 https://www.posdata.eu/product/2874/datalogic-powerscan-pm9501-2d-hp-barcode-scanner-rs232-kit.html 只能說時常跟serial port接觸阿.... 其實也不難用.net 可能C#或是vb.net寫的 通常不外乎自己拉一個SerialPort控制項 或是程式初始物件 //create a Serial Port object SerialPort sp = new SerialPort (); 再去做DataReceivedHandler的事件註冊撰寫 這次發現在call SerialPort.ReadExisting方法從緩衝區讀出資料時候有時會是完整一行 有時則是會給我拆行 由於接收當下立馬有子字串拆接地幾個字元處裡 就會時常拆解錯 https://learn.microsoft.com/en-us/dotnet/api/system.io.ports.serialport.readexisting?view=net-8.0 建議在call SerialPort.ReadExisting方法之前 去call Thread.Sleep 方法 讓其延遲0.2~0.5秒 避免掃刷過程過快導致緩衝區資料來不及存入就被不完整讀取出來 另外補充說明 一般掃條碼如果用的是USB接口的就不是透過serialport而是藉由文字框監聽事件 相當於滑鼠鍵盤keyin 如果是透過rs232這類接口則無法藉由文字框監聽事件來讀取喔 如果不能進庫房現場確認user電腦的時候 可以請user先打開notepad嘗試請他測試能否打印進去就可以區別出來了 另外一維條碼還會有空間限制,你如果字串封裝成barcode,字串內文愈長則barcode就會長愈長,而二維條碼不會有此問題但相關字型和既定硬體設備就需要評估哪種變革較合適。