我刚刚完成了自动滑动门的编程,该滑动门通过C#中的应用程序进行控制。该应用程序通过TCP / IP以太网与电机通信以移动门。我现在必须制作另一个可以同时控制两个门的版本。我立即遇到一个问题,如果我尝试同时发送命令,则尝试与之通信的第二个电动机将立即断开连接。我主要通过设置两个后台工作人员来解决此问题。每个工作人员从每个回路的每个电动机加载所有必需的变量,并发送当前排队的任何命令。不幸的是,电机偶尔会出现指令溢出和连接松动的情况。发生这种情况时,我无法重新连接。 这是我发送电机命令的功能:
public string[] SendMotorCommand(string motorCommand, bool timeout = true, int timeoutMS = 2000)
{
string[] messagesReceived = null;
if (connected)
{
try
{
//example from: http://stackoverflow.com/questions/10182751/server-client-send-receive-simple-text
//---create a TCPClient object at the IP and port no.---
NetworkStream nwStream = Client.GetStream();
if (timeout)
nwStream.ReadTimeout = timeoutMS;
else
nwStream.ReadTimeout = -1;
byte[] bytesToSend = Encoding.ASCII.GetBytes(motorCommand + "\r");
nwStream.Write(bytesToSend, 0, bytesToSend.Length);
/*if (motorCommand.Contains("PR"))
{*/
//---read back the text---
byte[] data = new byte[Client.ReceiveBufferSize];
int bytesRead = nwStream.Read(data, 0, data.Length);
string str = Encoding.ASCII.GetString(data, 0, bytesRead).Trim();
messagesReceived = str.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries);
//}
}
catch (Exception ex)
{
Debug.WriteLine("Failed to send or receive command " + motorCommand + " at IP " + ip);
Debug.WriteLine(ex);
Client.Close();
Client = new TcpClient();
Client.Connect(ip, 503);
}
}
return (messagesReceived);
}
如您所见,如果电动机无法通信,则我将关闭当前客户端并重新创建它,但是,在初始通信失败后,我将永远无法重新连接。我可以让他们再次工作的唯一方法是重新启动该应用程序。以太网连接没有任何改变的事实使我认为,如果连接失败,我应该能够可靠地重新建立连接。
这些命令中大约有20条是循环运行的,但是有许多可能排队,尤其是在命令不断超时的情况下。一堆命令是否有可能排队并且以太网接口仍在处理这些命令?作为临时解决方案,我将我的应用程序设置为在命令失败时重新启动,这种情况发生时,它通常会重新启动几次,然后再继续。这使我认为仍有一些事情要处理。
答案 0 :(得分:0)
这似乎是我的命令队列出现的问题。
这是我的命令发送方式:
string[] currentCommands = commands.ToArray();
commands.Clear();
foreach (string command in currentCommands)
{
SendMotorCommand(command);
}
它看起来像是随机的,该字符是作为命令发送的()不知道如何显示它,但是它看起来像是一个较高的小L。这似乎使通讯崩溃。不确定它是如何到达的,因为我从未将此字符添加到队列中,但是我怀疑它与将命令转换为数组有关。如果在循环运行时添加命令,则可能会中断此操作。现在,我正在“ SendMotorCommand”功能中进行检查,以跳过发送的命令。这解决了问题,但想知道如果有人有想法,为什么会发生这种情况。