【问题标题】:Read big file over serial通过串行读取大文件
【发布时间】:2020-05-19 10:03:23
【问题描述】:

我是串行编程的新手,我在 stackoverflow 上阅读了很多答案,但似乎没有一个适合我的场景。

场景

我有一个 ESP32WROOM 模块,它根据请求通过串行端口发送一些字节,消息的结构是这样的:

前四个字节是消息长度,接下来的四个字节是命令,然后是有效负载,消息的最后一个字节是流字节的校验和。因此,例如,它看起来是这样的:

MESSAGE LENGTH      COMMAND              PAYLOAD     CHECKSUM
0x00,0x00,0x02,0x05,0xBB,0xBB,0xBB,0xBB, .........., 0xCC

我在 C# 中的问题

现在我尝试通过串行发送的文件是我的 ESP32WROOM 从 Internet 下载的 5Mb 文件,该文件以 517 字节的块通过串行发送(按照我上面所说的方式..消息长度, 命令等..)。

我正在使用的c#端

port_DataReceived

监听传入的串行传输和

buffer = new byte[port.BytesToRead];
port.Read(buffer, 0, buffer.Length);

从串行读取,但是我没有一次收到所有 517 字节。我真的不明白发生了什么,所以请任何人提供任何代码来完成我的任务,因为我失去了希望?

非常感谢

【问题讨论】:

    标签: c# serial-port esp32


    【解决方案1】:

    作为串行通信规范,并没有决定应该接收多少字节来通知事件。

    SerialPort.DataReceived Event

    表示已通过 SerialPort 对象表示的端口接收到数据。

    不保证每收到一个字节都会引发 DataReceived 事件。使用 BytesToRead 属性来确定缓冲区中还有多少数据需要读取。

    SerialPort.BytesToRead Property

    获取接收缓冲区中数据的字节数。

    接收缓冲区包括串行驱动程序的接收缓冲区以及 SerialPort 对象本身的内部缓冲区。
    因为 BytesToRead 属性同时表示 SerialPort 缓冲区和 Windows 创建的缓冲区,所以它可以返回比 ReadBufferSize 属性更大的值,ReadBufferSize 属性只表示 Windows 创建的缓冲区。

    然后,Read方法实际读取的字节数会通过返回值通知。

    SerialPort.Read Method

    从 SerialPort 输入缓冲区读取。

    返回值
    Int32
    读取的字节数。

    确保接收到的数据总量在517字节以上,然后将每517字节切出并检查格式。

    如果接收到的数据或切割后的剩余数据小于517字节,则缓冲等待,直到达到517字节,或者进行超时检查。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-22
      • 2023-04-07
      • 2020-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多