从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
问题似乎出在这段代码上:
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
中读取客户端数据,则该循环将不会退出,直到没有更多的数据来自客户端。由于这似乎不是一个问题,在询问的情况下,if
到while
的变化是有意义的。