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

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

C#讀取RS232串口掃描槍

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

掃描對(duì)于工業(yè)商業(yè)的主要輸入設(shè)備很常見,與掃描槍的通訊也非常簡(jiǎn)單。之前看到網(wǎng)上有很多人問,但大多說人沒有給出確切的回答,其實(shí)也就是源代碼啦。

我剛好做了一個(gè)項(xiàng)目用到了這種掃描槍,現(xiàn)在把做的步驟和代碼上傳上來,跟大家分享一下。

RS232串口的掃描槍不會(huì)像USB的掃描槍自動(dòng)的吧數(shù)據(jù)輸入的光標(biāo)焦點(diǎn)所在的位置,因此,需要我們手動(dòng)的將掃描的數(shù)據(jù)添加到對(duì)應(yīng)的位置。這也給我們 的軟件開發(fā)增加了一丟丟工作。

如果是USB,則只需把鼠標(biāo)光標(biāo)定位到需要輸入的位置上去。

如果是RS232的則需要一些額外的操作。

下面來看看實(shí)現(xiàn)的步驟。

環(huán)境:VS2015 C#,SerialPort類

首先熟悉,serialPort類,這個(gè)類是C#自帶的一個(gè)串口通訊,使用非常方便,性能還算穩(wěn)定,因?yàn)槲矣弥壳皼]發(fā)現(xiàn)什么問題。不知道實(shí)時(shí)性如何。

表1                                                      SerialPort類的常用屬性

名  稱

說  明

BaseStream

獲取 SerialPort 對(duì)象的基礎(chǔ) Stream 對(duì)象

BaudRate

獲取或設(shè)置串行波特率

BreakState

獲取或設(shè)置中斷信號(hào)狀態(tài)

BytesToRead

獲取接收緩沖區(qū)中數(shù)據(jù)的字節(jié)數(shù)

BytesToWrite

獲取發(fā)送緩沖區(qū)中數(shù)據(jù)的字節(jié)數(shù)

CDHolding

獲取端口的載波檢測(cè)行的狀態(tài)

CtsHolding

獲取“可以發(fā)送”行的狀態(tài)

DataBits

獲取或設(shè)置每個(gè)字節(jié)的標(biāo)準(zhǔn)數(shù)據(jù)位長(zhǎng)度

DiscardNull

獲取或設(shè)置一個(gè)值,該值指示 Null 字節(jié)在端口和接收緩沖區(qū)之間傳輸時(shí)是否被忽略

DsrHolding

獲取數(shù)據(jù)設(shè)置就緒 (DSR) 信號(hào)的狀態(tài)

DtrEnable

獲取或設(shè)置一個(gè)值,該值在串行通信過程中啟用數(shù)據(jù)終端就緒 (DTR) 信號(hào)

Encoding

獲取或設(shè)置傳輸前后文本轉(zhuǎn)換的字節(jié)編碼

Handshake

獲取或設(shè)置串行端口數(shù)據(jù)傳輸?shù)奈帐謪f(xié)議

IsOpen

獲取一個(gè)值,該值指示 SerialPort 對(duì)象的打開或關(guān)閉狀態(tài)

NewLine

獲取或設(shè)置用于解釋 ReadLine( )和WriteLine( )方法調(diào)用結(jié)束的值

Parity

獲取或設(shè)置奇偶校驗(yàn)檢查協(xié)議

續(xù)表

名  稱

說  明

ParityReplace

獲取或設(shè)置一個(gè)字節(jié),該字節(jié)在發(fā)生奇偶校驗(yàn)錯(cuò)誤時(shí)替換數(shù)據(jù)流中的無(wú)效字節(jié)

PortName

獲取或設(shè)置通信端口,包括但不限于所有可用的 COM 端口

ReadBufferSize

獲取或設(shè)置 SerialPort 輸入緩沖區(qū)的大小

ReadTimeout

獲取或設(shè)置讀取操作未完成時(shí)發(fā)生超時(shí)之前的毫秒數(shù)

ReceivedBytesThreshold

獲取或設(shè)置 DataReceived 事件發(fā)生前內(nèi)部輸入緩沖區(qū)中的字節(jié)數(shù)

RtsEnable

獲取或設(shè)置一個(gè)值,該值指示在串行通信中是否啟用請(qǐng)求發(fā)送 (RTS) 信號(hào)

StopBits

獲取或設(shè)置每個(gè)字節(jié)的標(biāo)準(zhǔn)停止位數(shù)

WriteBufferSize

獲取或設(shè)置串行端口輸出緩沖區(qū)的大小

WriteTimeout

獲取或設(shè)置寫入操作未完成時(shí)發(fā)生超時(shí)之前的毫秒數(shù)

表2                                                     SerialPort類的常用方法

方 法 名 稱

說  明

Close

關(guān)閉端口連接,將 IsOpen 屬性設(shè)置為False,并釋放內(nèi)部 Stream 對(duì)象

Open

打開一個(gè)新的串行端口連接

Read

從 SerialPort 輸入緩沖區(qū)中讀取

ReadByte

從 SerialPort 輸入緩沖區(qū)中同步讀取一個(gè)字節(jié)

ReadChar

從 SerialPort 輸入緩沖區(qū)中同步讀取一個(gè)字符

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)建串口,實(shí)例化對(duì)象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);                    }                    )                );這部分指令徐需要的,因?yàn)橛锌赡苣愕拇诒挥迷诹似渌€程里,所以需要用到代理,否則系統(tǒng)報(bào)錯(cuò)。

接下來就是寫接收到掃描碼的數(shù)據(jù)處理,

這個(gè)需要在根據(jù)你把數(shù)據(jù)寫入到什么地方,這里是寫入到了一個(gè)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!");            }        }

串口接收也可以寫成一個(gè)線程,不需要使用它的串口接收函數(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


上一篇:1100. Mars Numbers (20)

下一篇:面向?qū)ο?1)

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 迁安市| 湘乡市| 巧家县| 平泉县| 兴城市| 延长县| 怀远县| 北辰区| 原阳县| 云南省| 黎平县| 石狮市| 通山县| 中山市| 寿光市| 军事| 南通市| 九江市| 修武县| 左权县| 武穴市| 东乌珠穆沁旗| 长汀县| 神木县| 镇江市| 嘉荫县| 永州市| 保康县| 元朗区| 余江县| 乌兰浩特市| 蓬安县| 泸水县| 烟台市| 高雄市| 开化县| 泰兴市| 涿鹿县| 武鸣县| 东方市| 枞阳县|