0

我正在尝试从 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 正在使用聊天服务器示例。我正在发送“回”;和“前进”;穿过。串行监视器上的结果:

back
forwaback
forward
back
forwaforwar
4

1 回答 1

0

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

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()whileifwhile

于 2013-04-02T15:19:45.463 回答