国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
VB.NET 串口訪問之一
VB.NET 串口訪問之一
2011-10-02 10:50:01     我來說兩句 
收藏    我要投稿    [字體: ]

 

一不小心看到一高手寫的C#串中操作系列的文章,很不錯(cuò),可惜我輩不懂C#,于是順便改成用VB.NET2010

  其中幾乎都有注解。

 

 

 

 

順便說明,再發(fā)送16進(jìn)制不是很完善,有懂的兄弟,說明一下

 

Imports System 

Imports System.Collections.Generic 

Imports System.ComponentModel 

Imports System.Data 

Imports System.Drawing 

Imports System.Linq 

Imports System.Text 

Imports System.IO.Ports 

Imports System.Text.RegularExpressions 

 

 

Public Class Form1 

 

    WithEvents Comm As SerialPort = New SerialPort 

    Private Builder As StringBuilder = New StringBuilder '避免在事件處理方法中反復(fù)的創(chuàng)建,所以定義到外面 

    Private ReceiveCount As Long = 0     '接收計(jì)數(shù) 

    Private SendCount As Long = 0        '發(fā)送計(jì)數(shù) 

 

    Private Listening As Boolean = False  '是否沒有執(zhí)行完invoke相關(guān)操作  

    Private Closingg As Boolean = False     '是否正在關(guān)閉串口,執(zhí)行Application.DoEvents,并阻止再次invoke    

 

    Public Delegate Sub UpdateData(ByVal mByte() As Byte) 

 

    Public Sub ShowData(ByVal mByte() As Byte) 

        Console.WriteLine(mByte) 

        ReceiveCount += mByte.Length 

        Builder.Clear() 

 

        If CheckBoxHex.Checked Then 

            For Each b As Byte In mByte 

                Builder.Append(b.ToString("X2") + " ") 

            Next 

 

        Else 

 

            Builder.Append(Encoding.ASCII.GetString(mByte)) 

 

        End If 

        TxtGet.AppendText(Builder.ToString) 

        labelGetCount.Text = "Get:" + ReceiveCount.ToString 

    End Sub 

 

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 

 

        '初始化下拉串口名稱列表框 

        Dim Ports() As String = SerialPort.GetPortNames 

        Array.Sort(Ports) 

        ComboPortName.Items.AddRange(Ports) 

        ComboPortName.SelectedIndex = IIf(ComboPortName.Items.Count > 0, 0, -1) 

        ComboBaudrate.SelectedIndex = ComboBaudrate.Items.IndexOf("9600") 

        '初始化Serialport對(duì)象 

        Comm.NewLine = vbCrLf 

        Comm.RtsEnable = True 

 

        'AddHandler Obj.Ev_Event, AddressOf EventHandler 

        'RemoveHandler Obj.Ev_Event, AddressOf EventHandler 

        'AddHandler Comm.DataReceived, AddressOf Comm_DataReceived 

 

    End Sub 

 

    Private Sub Comm_DataReceived(sender As Object, e As System.IO.Ports.SerialDataReceivedEventArgs) Handles Comm.DataReceived 

        If Closingg Then Return '如果正在關(guān)閉,忽略操作,直接返回,盡快的完成串口監(jiān)聽線程的一次循環(huán)    

 

        Try 

            Listening = True                    '設(shè)置標(biāo)記,說明我已經(jīng)開始處理數(shù)據(jù),一會(huì)兒要使用系統(tǒng)UI的。 

            Dim n As Long = Comm.BytesToRead    '先記錄下來,避免某種原因,人為的原因,操作幾次之間時(shí)間長,緩存不一致    

            Dim Buf(n - 1) As Byte              '聲明一個(gè)臨時(shí)數(shù)組存儲(chǔ)當(dāng)前來的串口數(shù)據(jù)  

 

            Comm.Read(Buf, 0, n)                '讀取緩沖數(shù)據(jù) 

            Builder.Clear()                     '清除字符串構(gòu)造器的內(nèi)容  

 

            Dim b As UpdateData = New UpdateData(AddressOf ShowData) 

            Me.BeginInvoke(b, Buf) 

 

        Catch ex As Exception 

            Err.Clear() 

        Finally 

            Listening = False                    '我用完了,ui可以關(guān)閉串口了。 

        End Try 

    End Sub 

 

    Private Sub ShowMsg(ByVal buffer() As Byte) 

        If CheckBoxHex.Checked Then 

            For Each b As Byte In Buffer 

                Builder.Append(b.ToString("X2") + " ") 

            Next 

        Else 

            Builder.Append(Encoding.ASCII.GetString(buffer)) 

        End If 

        Me.TxtGet.AppendText(Builder.ToString()) 

        labelGetCount.Text = "Get:" + ReceiveCount.ToString 

    End Sub 

 

    Private Sub BtnXOpen_Click(sender As System.Object, e As System.EventArgs) Handles BtnXOpen.Click 

        '根據(jù)當(dāng)前串口對(duì)象,來判斷操作  

        If Comm.IsOpen Then 

            Closingg = True ' 

            While Listening 

                Application.DoEvents() 

            End While 

            '打開時(shí)點(diǎn)擊,則關(guān)閉串口 

            Comm.Close() 

            Closingg = False 

        Else 

            Comm.PortName = ComboPortName.Text 

            Comm.BaudRate = Integer.Parse(ComboBaudrate.Text) 

            Try 

                Comm.Open() 

            Catch ex As Exception 

                '捕獲到異常信息,創(chuàng)建一個(gè)新的comm對(duì)象,之前的不能用了。  

                Comm = New SerialPort 

                '現(xiàn)實(shí)異常信息給客戶。  

                MessageBox.Show(ex.Message) 

            End Try 

        End If 

 

        '設(shè)置按鈕的狀態(tài)    

        BtnXOpen.Text = IIf(Comm.IsOpen, "Close", "Open") 

        BtnXOpen.Enabled = Comm.IsOpen 

 

    End Sub 

 

    '動(dòng)態(tài)的修改獲取文本框是否支持自動(dòng)換行。  

    Private Sub CheckBoxNewLineGet_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles CheckBoxNewLineGet.CheckedChanged 

        TxtGet.WordWrap = CheckBoxNewLineGet.Checked 

    End Sub 

 

    Private Sub BtnXSend_Click(sender As System.Object, e As System.EventArgs) Handles BtnXSend.Click 

        Dim n As Integer = 0  '定義一個(gè)變量,記錄發(fā)送了幾個(gè)字節(jié)  

        If checkBoxHexSend.Checked Then   '16進(jìn)制發(fā)送  

            '我們不管規(guī)則了。如果寫錯(cuò)了一些,我們允許的,只用正則得到有效的十六進(jìn)制數(shù)    

            Dim Mc As MatchCollection = Regex.Matches(TxtSend.Text.Trim, "(?i)[/da-f]{2}")   '"(?i)[/da-f]{2}" 

            Dim buf As List(Of Byte) = New List(Of Byte) 

 

            '依次添加到列表中    

            For Each m As Match In Mc 

                '  buf.Add(Byte.Parse(m.Value)) 

                buf.Add(Byte.Parse(m.Value, System.Globalization.NumberStyles.HexNumber)) 

            Next 

 

            '轉(zhuǎn)換列表為數(shù)組后發(fā)送   

            Comm.Write(buf.ToArray, 0, buf.Count) 

            n = buf.Count 

        Else                             'ascii編碼直接發(fā)送  

            '包含換行符 

            If checkBoxNewlineSend.Checked Then 

                Comm.WriteLine(TxtSend.Text) 

                n = TxtSend.Text.Length + 2 

            Else 

                Comm.Write(TxtSend.Text) 

                n = TxtSend.Text.Length 

            End If 

        End If 

 

        SendCount += n    '累加發(fā)送字節(jié)數(shù)  

        labelSendCount.Text = "Send:" + SendCount.ToString 

    End Sub 

 

    Private Sub BtnXReset_Click(sender As System.Object, e As System.EventArgs) Handles BtnXReset.Click 

 

        '復(fù)位接受和發(fā)送的字節(jié)數(shù)計(jì)數(shù)器并更新界面。 

        SendCount = 0 

        ReceiveCount = 0 

        labelGetCount.Text = "Get:0" 

        labelSendCount.Text = "Send:0" 

        Builder.Clear() 

 

    End Sub 

 

    Private Sub BtxClear_Click(sender As System.Object, e As System.EventArgs) Handles BtxClear.Click 

        TxtGet.Text = "" 

        Builder.Clear() 

    End Sub  

End Class 

摘自:wl58796351的專欄

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
C# 串口通訊
C# 串口操作系列(3)
C# 串口操作系列(1)
基于C# Winform的串口數(shù)據(jù)接收
C#與PLC通信開發(fā)之三菱FX系列PLC通信協(xié)議詳解
C#做一個(gè)簡單的進(jìn)行串口通信的上位機(jī)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服