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

时间:2013-04-02 00:55:02

标签: c# wpf serial-port arduino tcpclient

我正试图从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

1 个答案:

答案 0 :(得分:0)

问题似乎与此代码有关:

if (client.available() > 0) {

  // read the bytes incoming from the client:
  char thisChar = client.read();

  ...
}

它的作用是:

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

正如OP指出的那样,这直接来自Arduino chat server example。在该示例中,这在loop()中正确工作取决于在建立新连接后立即设置的alreadyConnected标志:如果不是,则在读取任何数据之前刷新缓冲区。那是一种可能的地雷。


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

if (client.available() > 0) {

while (client.available() > 0) {

拥有if语句的唯一原因是,如果您的客户端发送了大量数据,请确保在loop()中经常进行其他处理:如果客户数据的读取是从while内部完成此循环不会退出,直到客户端没有更多数据。由于在询问的情况下这似乎不是问题,因此ifwhile更改是有意义的。