【问题标题】:C# Serial Port communicationC#串口通信
【发布时间】:2011-06-09 20:59:44
【问题描述】:

我正在尝试使用 SerialPort 类处理串行端口。

应用要求我们先接收一个命令,然后在20ms内回复;问题是,我们读取的命令和实际命令之间存在延迟(最多 15ms),我们没有时间发回回复。

我们需要读取的命令长度固定为20字节,每次从输入缓冲区中轮询一个字节。

serialPort.Read(input, 0, 1).

我不知道这个过程有什么问题。

【问题讨论】:

    标签: c#


    【解决方案1】:

    为什么一次读取一个字节?如果你期望 20 个字节,你可以写:

    byte[] buffer = new byte[20];
    int bytesRead;
    int totalBytesRead = 0;
    while ((bytesRead = serialPort.Read(buffer, totalBytesRead, buffer.Length - totalBytesRead)) != 0  
        && totalBytesRead < buffer.Length)
    {
        totalBytesRead += bytesRead;
    }
    

    此时,您已拥有全部 20 个字节,或者您已到达流的末尾。

    “我们读取的命令与实际命令之间存在延迟(最多 15 毫秒)”是什么意思?

    【讨论】:

    • 我将使用示波器在线检查数据,当我收到命令时,我会发送一封信与实际命令进行比较,从示波器,我测量延迟高达15ms ,我想知道造成这种延迟的原因。
    • 你说从你告诉发送者发送一个字节到接收者实际读取它之间最多有 15 毫秒?有很多事情可能导致这种情况。发送方可能正在短暂缓冲,接收方可能正在缓冲。接收者可能无法立即对角色做出反应。有没有一种方法可以确定您的计算机何时接收到该字符? 15 毫秒是相当可疑的,因为这是您从 .NET 程序中获得的最佳分辨率。
    【解决方案2】:

    您是否在使用 DataRecieved 事件?前段时间我也遇到过类似的错误,显然有些功能在不使用事件处理程序的情况下是不会被调用的。

    【讨论】:

    • 我没有使用DataRecieved事件,你的意思是我应该使用DataRecieved事件,而不是一一轮询数据?
    • 你应该明确地使用事件,在我的情况下,我从来没有在不使用事件的情况下收到任何数据,花了几天时间才弄清楚。
    猜你喜欢
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    相关资源
    最近更新 更多