簡體   English   中英

從串行端口Visual Basic中讀取字符串

[英]Read String From Serial port Visual Basic

Imports System.IO.Ports 
Imports System.Text

Public Class Form4
    Dim myStringBuilder As String
    Dim insert As New OleDb.OleDbCommand
    Dim cnn As New OleDb.OleDbConnection
    Public user As String

Private Sub Serialport2_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort2.DataReceived
    myStringBuilder = SerialPort2.ReadExisting()
    Me.Invoke(New EventHandler(AddressOf UpdateControls))
End Sub

Private Sub UpdateControls(ByVal sender As Object, ByVal e As EventArgs)
    Dim A As String = myStringBuilder
    Dim Sqql As String

    If Not cnn.State = ConnectionState.Open Then
        cnn.Open()
    End If

    insert.Connection = cnn


    Dim dt As New DataTable
    Sqql = "SELECT * FROM `FileInfo` WHERE `File ID`='" & A & "'"
    Dim cmd As New OleDb.OleDbDataAdapter(Sqql, cnn)
    cmd.Fill(dt)
    Dim i As Integer = dt.Rows.Count
    Dim todaysdate As String = String.Format("{0:dd/MM/yyyy}", DateTime.Now)
    If i = 1 Then
            insert.CommandText = "INSERT INTO `File Log`(File ID,Name,Information,Time,Date) " & _
                " VALUES('" & A & "','" & dt.Rows(0).Item("Name") & "','" & user & " telah" & dt.Rows(0).Item("Status") & "File" & "','" &
_
                TimeOfDay & "','" & todaysdate & "')"
            textBox1.Text += dt.Rows(0).Item("Name") & "   " & TimeOfDay & "   " & todaysdate & 

Environment.NewLine
            textBox1.Select(textBox1.TextLength, 0)
            textBox1.ScrollToCaret()
            insert.ExecuteNonQuery()
            myStringBuilder = ""
        Else
            myStringBuilder = ""
            textBox1.Text += A & Environment.NewLine
        End If


End Sub


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    cnn = New OleDb.OleDbConnection
    cnn.ConnectionString = "Provider=Microsoft.Jet.Oledb.4.0; Data Source=" & Application.StartupPath & "\data.mdb"

    If SerialPort2 IsNot Nothing Then
        SerialPort2.Close()
    End If

    SerialPort2 = My.Computer.Ports.OpenSerialPort("COM27", 9600, Parity.None, 8, StopBits.One)
    textBox1.Text = "-- Door Have Open -- " & Environment.NewLine & Environment.NewLine


End Sub

Private Sub textBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles textBox1.TextChanged

End Sub End Class

在我的串行監視器視圖中,它將正確顯示,但在Visual Basic中,它將自動換行,並且不會在一行中顯示字符串。 我嘗試了其他方法,例如serialport.readline(),但沒有任何反應。

如果您在從串行端口提取數據時遇到問題,可以嘗試以下操作:

Sub SerialPort_DataReceived(sender As Object, e As SerialDataReceivedEventArgs)

    Dim currentSP As SerialPort = Convert.ChangeType(sender, GetType(SerialPort))
    Dim strBuilder As System.Text.StringBuilder = New System.Text.StringBuilder()

    For index = 1 To currentSP.BytesToRead        
        strBuilder.Append(Convert.ChangeType(currentSP.ReadByte(), GetType(Char)))
    Next

    ' Have a global string to allow the threads to have a shared resource
    myString = strBuilder.ToString()

    Me.Invoke(New EventHandler(AddressOf UpdateControls))

End Sub

它的工作方式應與SerialPort.ReadLine() ,該方法還允許您隨意操作數據。 除了使用字符串,您還可以始終像這樣處理數據:

Dim buffer As Byte() = New Byte(currentSP.BytesToRead) {}
buffer(index) = Convert.ChangeType(currentSP.ReadByte(), GetType(Byte))

因此,您可以將Byte添加到緩沖區中,而不是將Char添加到String

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM