简体   繁体   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

in my serial monitor view it will appear correctly but in visual basic it will auto break line and not display the string in one line. 在我的串行监视器视图中,它将正确显示,但在Visual Basic中,它将自动换行,并且不会在一行中显示字符串。 I Tried other method like serialport.readline() but nothing happen. 我尝试了其他方法,例如serialport.readline(),但没有任何反应。

If you are having issues with extracting data from your serial port you could try this: 如果您在从串行端口提取数据时遇到问题,可以尝试以下操作:

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

It should work the same way as the SerialPort.ReadLine() , this approach also lets you manipulate the data however you want. 它的工作方式应与SerialPort.ReadLine() ,该方法还允许您随意操作数据。 Instead of working with a string you could always work the data like this: 除了使用字符串,您还可以始终像这样处理数据:

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

So instead of appending the Char to the String you can add the Byte to the buffer 因此,您可以将Byte添加到缓冲区中,而不是将Char添加到String

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM