首页 > 解决方案 > VBA SerialPort_DataReceived 延迟或未收到所有数据

问题描述

天。

通过 VBA,基本程序的串行有一些问题。向 Arduino 发送字符,Arduino 接收字符,访问 SD 卡并打印到串行。WinForm 将此数据作为变量收集并写入 .csv 文件。

发送字符(是的,我知道 tis 字符串 atm 计划更改 :))

    Private Sub Button_Download_Click(sender As Object, e As EventArgs) Handles Button_Download.Click
        Dim downloadChar As String = "a" & vbCrLf
        SerialPort1.Write(downloadChar)
        SaveFileDialog1.FileName = devName
        SaveFileDialog1.ShowDialog()
    End Sub

接收字节

   Private Sub Serialport1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
        MsgBox("Fired")
        Dim strBuilder As System.Text.StringBuilder = New System.Text.StringBuilder()
        For index = 1 To SerialPort1.BytesToRead
            strBuilder.Append(Convert.ChangeType(SerialPort1.ReadByte(), GetType(Char)))
        Next
        Dim myString = strBuilder.ToString()
        TextBox2.CheckForIllegalCrossThreadCalls = False
        TextBox2.Text = TextBox2.Text + myString
        Dim Path As String
        Path = SaveFileDialog1.FileName
        System.IO.File.WriteAllText(Path, myString)
    End Sub

问题是 _datareceived 子被触发不止一次(当前是 2kb 文件大小的两倍),它写入了 myString。

如果我添加一个消息框,例如“已触发”并在单击“确定”之前稍等片刻,它可以完美地工作,如下所示。这对我来说很好,但是对于更大的文件大小,等待时间是未知的。

我尝试过执行循环,将变量添加到 bytestoread,例如 startBytes 和 moreBytes,如果 moreBytes > 0 退出,则检查该循环。尝试了除 MsgBox/timers 之外的变量/对话框。

问题:任何其他方式来延迟 _datarecieved 以便在读取 bytestoreceive 之前能够接收所有字节?

为菜鸟问题道歉。:(

标签: vb.netvisual-studio

解决方案


推荐阅读