开始我用C#编码。我通过套接字将不同大小的数据写入设备。在写入我想要从套接字读取的数据之后,因为一旦完成处理所有数据,设备将回写错误代码/完成消息。目前我有这样的事情:
byte[] resultErrorCode = new byte[1];
resultErrorCode[0] = 255;
while (resultErrorCode[0] == 255)
{
try
{
ReadFromSocket(ref resultErrorCode);
}
catch (Exception)
{
}
}
Console.WriteLine(ErrorList[resultErrorCode[0] - 48]);
我在其他地方使用ReadFromSocket
,所以我知道它工作正常。最终发生的事情是我连接的端口(在我的机器上)更改为随机端口。我认为这会导致另一方的固件连接不良。因此,当我在另一侧写入数据时,它会尝试将数据写入我连接的原始端口,但在尝试多次读取后,连接端口就会发生变化。
在收到完成命令之前,如何连续读取套接字?如果我知道循环有问题,因为对于我最小的测试文件,它需要1分13秒非常一致。我通过删除循环并将代码置于休眠状态1分15秒来测试代码。当它恢复时,它成功读取了我期待的完成命令。有没有人有任何建议?
答案 0 :(得分:1)
你应该拥有的是一个单独的线程,它将像外部硬件的驱动程序。该线程将接收所有数据,解析它并将适当的消息传输到应用程序的其余部分。这部分代码将让您了解如何从硬件接收和解析数据。
public void ContinuousReceive(){
byte[] buffer = new byte[1024];
bool terminationCodeReceived = false;
while(!terminationCodeReceived){
try{
if(server.Receive(buffer)>0){
// We got something
// Parse the received data and check if the termination code
// is received or not
}
}catch (SocketException e){
Console.WriteLine("Oops! Something bad happened:" + e.Message);
}
}
}
注意:
Thread.Sleep
并不是一个好主意。如果可能,您应该使用事件(在RS232连接的情况下)或阻止在不同线程上的调用,就像上面代码中的情况一样。