我正试图从WPF C#应用程序发送一个单词到作为服务器运行的Arduino。不时发送完整的作品。
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);
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
答案 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
内部完成此循环不会退出,直到客户端没有更多数据。由于在询问的情况下这似乎不是问题,因此if
到while
更改是有意义的。