国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

C#讀取RS232串口掃描槍

2019-11-11 03:26:36
字體:
供稿:網(wǎng)友

掃描對于工業(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ū)

SerialPort使用方法:1,首先添加引用using System.IO.Ports;using System.IO;2,創(chuàng)建串口,實例化對象public SerialPort myComPort = new SerialPort("COM4", 9600, Parity.None);3,創(chuàng)建窗口接收函數(shù)PRivate void ReceiveData(object sender, SerialDataReceivedEventArgs e)        {            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);                    }                    )                );        }4,串口接收函數(shù)綁定myComPort.DataReceived += ReceiveData;這里面需要注意的是textBox2.Invoke                (new EventHandler(                    delegate                    {                        textBox2.Text = textBox2.Text + Encoding.ASCII.GetString(buf);                    }                    )                );這部分指令徐需要的,因為有可能你的串口被用在了其他線程里,所以需要用到代理,否則系統(tǒng)報錯。

接下來就是寫接收到掃描碼的數(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


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 雷山县| 黄大仙区| 驻马店市| 桃江县| 哈巴河县| 崇信县| 浮山县| 昌乐县| 宁德市| 石渠县| 贡嘎县| 家居| 南皮县| 尚志市| 乡宁县| 白玉县| 东乌珠穆沁旗| 钟山县| 肃南| 赣榆县| 万山特区| 阿城市| 翁牛特旗| 珠海市| 深水埗区| 巧家县| 灯塔市| 额敏县| 襄汾县| 清涧县| 潜江市| 徐闻县| 郎溪县| 开封市| 阳春市| 阿图什市| 德钦县| 竹北市| 天津市| 丽水市| 宜章县|