从c#到Arduino通过网络接收到的不完整数据

本文关键字:整数 数据 网络 Arduino | 更新日期: 2023-09-27 18:07:03

我正试图从WPF c#应用程序发送一个字到作为服务器运行的Arduino。每隔一段时间,完成的工作就不发送。

c#代码
public void send(String message)
{
    TcpClient tcpclnt = new TcpClient();
    ConState.Content = "Connecting.....";
    try
    {
        tcpclnt.Connect("192.168.0.177", 23);
        ConState.Content = "Connected";
        String str = message;
        Stream stm = tcpclnt.GetStream();
        ASCIIEncoding asen = new ASCIIEncoding();
        byte[] ba = asen.GetBytes(str);
        stm.Write(ba, 0, ba.Length);
        tcpclnt.Close();
    }
    catch (Exception)
    {
        ConState.Content = "Not Connected";
        return;
    }
}

如何发送给方法:

String mes = "back;";
send(mes);

Arduino代码:

if (client.available() > 0) {
    // Read the bytes incoming from the client:
    char thisChar = client.read();
    if (thisChar == ';')
    {
        //Add a space
        Serial.println("");
    }
    else {
        //Print because it's not a space
        Serial.write(thisChar);
    }
}

Arduino正在使用聊天服务器示例。我正在发送"返回"answers"向前"。串口监视器上的结果:

back
forwaback
forward
back
forwaforwar

从c#到Arduino通过网络接收到的不完整数据

问题似乎出在这段代码上:

if (client.available() > 0) {
  // read the bytes incoming from the client:
  char thisChar = client.read();
  ...
}

的作用是:

  • 检查是否从客户端接收到数据
  • 从客户端缓冲区读取单个字节
  • 退出,然后继续做其他事情

正如OP指出的,这直接来自Arduino聊天服务器的例子。在该示例中,loop()中的正常工作取决于在建立新连接后正确设置alreadyConnected标志:如果不是,则在读取任何数据之前刷新缓冲区。这是一个可能的地雷。


尽管如此,在OP的情况下,没有理由将if块更改为while循环,换句话说,而不是

if (client.available() > 0) {

while (client.available() > 0) {

使用if语句的唯一原因是,如果客户端发送大量数据,则确保在loop()中经常执行其他处理:如果从while中读取客户端数据,则该循环将不会退出,直到没有更多的数据来自客户端。由于这似乎不是一个问题,在询问的情况下,ifwhile的变化是有意义的。