如何解决引发异常-从Arduino到Visual Basic接收数据
我正在尝试从Arduino发送串行数据并在Visual Basic上读取它。当我执行代码时,有时可以工作,有时不能:抛出异常,System.ArgumentOutOfRangeException:'索引和长度必须引用字符串中的位置。你能帮助我吗? 我是Visual Basic的新手,谢谢。
Imports System.IO
Imports System.IO.Ports
Imports System.Threading
Public Class Form1
Dim TWSL,TWAL,THL,AoAL,WAL,PeL,RoilL,RyL,RydL As Integer
Dim TWS,TWA,TH,AoA,WA,Pe,Roil,Ry,Ryd,TWSResult,TWAResult,THResult,AoAResult,WAResult,PeResult,RoilResult,RyResult,RydResult As String
Dim StrSerialIn,StrSerialInRam As String
Private Sub Form1_Load(sender As Object,e As EventArgs) Handles MyBase.Load
Me.CenterToParent()
SerialPort1.PortName = "COM4"
SerialPort1.BaudRate = 9600
SerialPort1.Open()
Timer1.Start()
SerialPort1.Write(TrackBarAWA.Value & Chr(10))
End Sub
Private Sub Timer1_Tick(sender As Object,e As EventArgs) Handles Timer1.Tick
Try
StrSerialIn = SerialPort1.ReadExisting
Dim TB As New TextBox
TB.Multiline = True
TB.Text = StrSerialIn
If TB.Lines.Count > 0 Then
If TB.Lines(0) = "Failed to read" Then
Timer1.Stop()
SerialPort1.Close()
Return
End If
StrSerialInRam = TB.Lines(0).Substring(0,2)
If StrSerialInRam = "A" Then
TWS = TB.Lines(0)
TWSL = TWS.Length
Else
TWS = TWS
End If
StrSerialInRam = TB.Lines(1).Substring(0,3)
If StrSerialInRam = "B" Then
TWA = TB.Lines(1)
TWAL = TWA.Length
Else
TWA = TWA
End If
StrSerialInRam = TB.Lines(2).Substring(0,3)
If StrSerialInRam = "C" Then
TH = TB.Lines(2)
THL = TH.Length
Else
TH = TH
End If
StrSerialInRam = TB.Lines(3).Substring(0,2)
If StrSerialInRam = "D" Then
AoA = TB.Lines(3)
AoAL = AoA.Length
Else
AoA = AoA
End If
StrSerialInRam = TB.Lines(4).Substring(0,1)
If StrSerialInRam = "E" Then
WA = TB.Lines(4)
WAL = WA.Length
Else
WA = WA
End If
StrSerialInRam = TB.Lines(5).Substring(0,3)
If StrSerialInRam = "F" Then
Pe = TB.Lines(5)
PeL = Pe.Length
Else
Pe = Pe
End If
StrSerialInRam = TB.Lines(6).Substring(0,3)
If StrSerialInRam = "G" Then
Roil = TB.Lines(6)
RoilL = Roil.Length
Else
Roil = Roil
End If
StrSerialInRam = TB.Lines(7).Substring(0,3)
If StrSerialInRam = "H" Then
Ry = TB.Lines(7)
RyL = Ry.Length
Else
Ry = Ry
End If
StrSerialInRam = TB.Lines(8).Substring(0,3)
If StrSerialInRam = "I" Then
Ryd = TB.Lines(8)
RydL = Ryd.Length
Else
Ryd = Ryd
End If
TWSResult = Mid(TWS,2,TWSL)
TWAResult = Mid(TWA,TWAL)
THResult = Mid(TH,THL)
AoAResult = Mid(AoA,AoAL)
WAResult = Mid(WA,WAL)
PeResult = Mid(Pe,PeL)
RoilResult = Mid(Roil,RoilL)
RyResult = Mid(Ry,RyL)
RydResult = Mid(Ryd,RydL)
TWSvalue.Text = TWSResult
TWAvalue.Text = TWAResult
THvalue.Text = THResult
AoAvalue.Text = AoAResult
WAvalue.Text = WAResult
PeValue.Text = PeResult
RoilValue.Text = RoilResult
RyValue.Text = RyResult
RydValue.Text = RydResult
解决方法
根据我的收集,您正在尝试从文本框的特定行中的特定位置获取字符。根据您在问题中包含的错误消息,我假设该错误发生在包含“ String。Substring”方法的代码行上。如果从中获取子字符串的字符串太短而无法覆盖您在子字符串方法中指定的范围,则会收到此错误。例如,如果您从第2行开始的子字符串长度为3个字符,且从字符0开始,并且少于3个字符,则会出现此错误。
请参阅有关String.Substring方法here
的文档版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。