掃描對于工業(yè)商業(yè)的主要輸入設(shè)備很常見,與掃描槍的通訊也非常簡單。之前看到網(wǎng)上有很多人問,但大多說人沒有給出確切的回答,其實也就是源代碼啦。
我剛好做了一個項目用到了這種掃描槍,現(xiàn)在把做的步驟和代碼上傳上來,跟大家分享一下。
RS232串口的掃描槍不會像USB的掃描槍自動的吧數(shù)據(jù)輸入的光標焦點所在的位置,因此,需要我們手動的將掃描的數(shù)據(jù)添加到對應(yīng)的位置。這也給我們 的軟件開發(fā)增加了一丟丟工作。
如果是USB,則只需把鼠標光標定位到需要輸入的位置上去。
如果是RS232的則需要一些額外的操作。
下面來看看實現(xiàn)的步驟。
環(huán)境:VS2015 C#,SerialPort類
首先熟悉,serialPort類,這個類是C#自帶的一個串口通訊,使用非常方便,性能還算穩(wěn)定,因為我用著目前沒發(fā)現(xiàn)什么問題。不知道實時性如何。
表1 SerialPort類的常用屬性
名 稱 | 說 明 |
BaseStream | 獲取 SerialPort 對象的基礎(chǔ) Stream 對象 |
BaudRate | 獲取或設(shè)置串行波特率 |
BreakState | 獲取或設(shè)置中斷信號狀態(tài) |
BytesToRead | 獲取接收緩沖區(qū)中數(shù)據(jù)的字節(jié)數(shù) |
BytesToWrite | 獲取發(fā)送緩沖區(qū)中數(shù)據(jù)的字節(jié)數(shù) |
CDHolding | 獲取端口的載波檢測行的狀態(tài) |
CtsHolding | 獲取“可以發(fā)送”行的狀態(tài) |
DataBits | 獲取或設(shè)置每個字節(jié)的標準數(shù)據(jù)位長度 |
DiscardNull | 獲取或設(shè)置一個值,該值指示 Null 字節(jié)在端口和接收緩沖區(qū)之間傳輸時是否被忽略 |
DsrHolding | 獲取數(shù)據(jù)設(shè)置就緒 (DSR) 信號的狀態(tài) |
DtrEnable | 獲取或設(shè)置一個值,該值在串行通信過程中啟用數(shù)據(jù)終端就緒 (DTR) 信號 |
Encoding | 獲取或設(shè)置傳輸前后文本轉(zhuǎn)換的字節(jié)編碼 |
Handshake | 獲取或設(shè)置串行端口數(shù)據(jù)傳輸?shù)奈帐謪f(xié)議 |
IsOpen | 獲取一個值,該值指示 SerialPort 對象的打開或關(guān)閉狀態(tài) |
NewLine | 獲取或設(shè)置用于解釋 ReadLine( )和WriteLine( )方法調(diào)用結(jié)束的值 |
Parity | 獲取或設(shè)置奇偶校驗檢查協(xié)議 |
續(xù)表
名 稱 | 說 明 |
ParityReplace | 獲取或設(shè)置一個字節(jié),該字節(jié)在發(fā)生奇偶校驗錯誤時替換數(shù)據(jù)流中的無效字節(jié) |
PortName | 獲取或設(shè)置通信端口,包括但不限于所有可用的 COM 端口 |
ReadBufferSize | 獲取或設(shè)置 SerialPort 輸入緩沖區(qū)的大小 |
ReadTimeout | 獲取或設(shè)置讀取操作未完成時發(fā)生超時之前的毫秒數(shù) |
ReceivedBytesThreshold | 獲取或設(shè)置 DataReceived 事件發(fā)生前內(nèi)部輸入緩沖區(qū)中的字節(jié)數(shù) |
RtsEnable | 獲取或設(shè)置一個值,該值指示在串行通信中是否啟用請求發(fā)送 (RTS) 信號 |
StopBits | 獲取或設(shè)置每個字節(jié)的標準停止位數(shù) |
WriteBufferSize | 獲取或設(shè)置串行端口輸出緩沖區(qū)的大小 |
WriteTimeout | 獲取或設(shè)置寫入操作未完成時發(fā)生超時之前的毫秒數(shù) |
表2 SerialPort類的常用方法
方 法 名 稱 | 說 明 |
Close | 關(guān)閉端口連接,將 IsOpen 屬性設(shè)置為False,并釋放內(nèi)部 Stream 對象 |
Open | 打開一個新的串行端口連接 |
Read | 從 SerialPort 輸入緩沖區(qū)中讀取 |
ReadByte | 從 SerialPort 輸入緩沖區(qū)中同步讀取一個字節(jié) |
ReadChar | 從 SerialPort 輸入緩沖區(qū)中同步讀取一個字符 |
ReadLine | 一直讀取到輸入緩沖區(qū)中的 NewLine 值 |
ReadTo | 一直讀取到輸入緩沖區(qū)中指定 value 的字符串 |
Write | 已重載。將數(shù)據(jù)寫入串行端口輸出緩沖區(qū) |
WriteLine | 將指定的字符串和 NewLine 值寫入輸出緩沖區(qū) |
接下來就是寫接收到掃描碼的數(shù)據(jù)處理,
這個需要在根據(jù)你把數(shù)據(jù)寫入到什么地方,這里是寫入到了一個TEXTBOX里。
所以需要用textbox的數(shù)據(jù)更新事件來處理,
舉例如:如果輸入的條碼,二維碼以ENTER結(jié)束,則在收到ENTER后處理接收的數(shù)據(jù)
private void textBox2_TextChanged(object sender, EventArgs e) { MessageBox.Show("KEY DOWN!"); if (textBox2.Text[textBox2.TextLength - 2] == 0x0D && textBox2.Text[textBox2.TextLength - 1] == 0x0A) { MessageBox.Show("input the ENTER!"); } }
串口接收也可以寫成一個線程,不需要使用它的串口接收函數(shù)。如如下:
private void ReadPort() { while( _keepReading && myComPort.IsOpen ) { int n = myComPort.BytesToRead; byte[] buf = new byte[n]; myComPort.Read(buf, 0, n); textBox2.Invoke ( new EventHandler( delegate { textBox2.Text = textBox2.Text + Encoding.ASCII.GetString(buf); } ) ); } }
另外增加:
_keepReading = true;_readThread = new Thread(ReceiveData);_readThread.Start();
結(jié)束
源代碼傳送門:
http://download.csdn.net/detail/u011518659/9748676
新聞熱點
疑難解答