请原谅我的无知,…我正在做的事情必须非常简单,但是,它不是“逻辑上”的。如你所知,我正在处理一个“串行”设备。我尝试了所有我能用的VisualBasic,但它对我不起作用,所以我在c#上工作。我偶然发现了以下代码:
string[] RawData = new string[205];
_serialPort.Write("D5\r\n");第一次尝试:硬编码201次。
RawData[0] = _serialPort.ReadLine();
RawData[1] = _serialPort.ReadLine();
RawData[2] = _serialPort.ReadLine();
RawData[3] = _serialPort.ReadLine();
RawData[4] = _serialPort.ReadLine();
RawData[5] = _serialPort.ReadLine();
RawData[6] = _serialPort.ReadLine();
RawData[7] = _serialPort.ReadLine();
RawData[8] = _serialPort.ReadLine();
RawData[9] = _serialPort.ReadLine();
//....x 201 times
RawData[201] = _serialPort.ReadLine();第二次尝试:
for (int i = 0; i <= 202; i++)
{
RawData[i] = _serialPort.ReadLine();
// Thread.Sleep(500);
}正如您所能做到的,我需要创建一个数组来保存设备返回的“光谱数据”。
我最初的反应是使用一个循环从串行端口获取数据。很简单,除了在循环期间执行“消失”和程序挂起。
我尝试在每个ReadLine之间添加500ms的休眠时间,但没有效果。如果我手动遍历每个ReadLines,在调试模式下,它可以工作。
但是如果我在下一条指令上设置了一个断点,那就是在循环之外,那么所有的赌注都是无效的。
所以,如果我发出201条单独的ReadLine语句,如上面所示(我只显示了9条),那么它就可以工作了吗?
发布于 2020-02-27 10:26:38
此for周期:
for (int i = 0; i <= 202; i++)问题203读取:对于从0到202的索引。如果你的设备只提供201行结果,那么当你的代码读取第202行时,你的代码永远不会收到它,它将“永远”等待设备。
发布于 2020-02-27 10:47:40
正如@Ondrej Tucny所说,你可能正在进行更多的调用,而SerialPort正在等待它,所以你不能传递到下一条指令。
如果这就是问题所在,我建议不要使用ReadLine。
ReadLine是不好的,因为它会“等待”,直到它收到EOL,并且超时设置在串行端口。
如果你不知道你会得到多少数据,ReadLine不是一个好主意。每次你调用它,你可能需要挂起,直到它超时,或者当你收到EOL时幸运地过去了。
我建议您使用Read或ReadExisting
另一种解决方法是将SerialPort.ReadTimeout设置得足够小并捕获TimeoutException,这样进程就不会等待。
发布于 2020-02-27 10:53:51
我讨厌说…(如果我看起来像个傻子…,不要介意)控件从未返回给我的原因是,通过循环201次,在不知不觉中,我试图从设备中检索“不存在”的数据--鸡蛋在我脸上。我必须检查我的201个手动ReadLine语句…去发现,在某个时候,我也失去了控制?我开始插入断点50,100,150,然后200,注意到有一个点,超过这个点,程序将停止响应。通过查看捕获的数据,它开始有意义了(我可以看到“逻辑”--哈!哈!哈!)。因此,我删除了201条重复的、丑陋的语句,并将循环的最大值改为176,然后一切都变得很棒。谢谢你的耐心。
https://stackoverflow.com/questions/60425364
复制相似问题