首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RS-232异常行为-跟进

RS-232异常行为-跟进
EN

Stack Overflow用户
提问于 2020-02-27 10:16:09
回答 3查看 40关注 0票数 0

请原谅我的无知,…我正在做的事情必须非常简单,但是,它不是“逻辑上”的。如你所知,我正在处理一个“串行”设备。我尝试了所有我能用的VisualBasic,但它对我不起作用,所以我在c#上工作。我偶然发现了以下代码:

代码语言:javascript
复制
            string[] RawData = new string[205];

            _serialPort.Write("D5\r\n");

第一次尝试:硬编码201次。

代码语言:javascript
复制
            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();

第二次尝试:

代码语言:javascript
复制
            for (int i = 0; i <= 202; i++)
            {
                RawData[i] = _serialPort.ReadLine();
                // Thread.Sleep(500);
            }

正如您所能做到的,我需要创建一个数组来保存设备返回的“光谱数据”。

我最初的反应是使用一个循环从串行端口获取数据。很简单,除了在循环期间执行“消失”和程序挂起。

我尝试在每个ReadLine之间添加500ms的休眠时间,但没有效果。如果我手动遍历每个ReadLines,在调试模式下,它可以工作。

但是如果我在下一条指令上设置了一个断点,那就是在循环之外,那么所有的赌注都是无效的。

所以,如果我发出201条单独的ReadLine语句,如上面所示(我只显示了9条),那么它就可以工作了吗?

EN

回答 3

Stack Overflow用户

发布于 2020-02-27 10:26:38

for周期:

代码语言:javascript
复制
for (int i = 0; i <= 202; i++)

问题203读取:对于从0到202的索引。如果你的设备只提供201行结果,那么当你的代码读取第202行时,你的代码永远不会收到它,它将“永远”等待设备。

票数 2
EN

Stack Overflow用户

发布于 2020-02-27 10:47:40

正如@Ondrej Tucny所说,你可能正在进行更多的调用,而SerialPort正在等待它,所以你不能传递到下一条指令。

如果这就是问题所在,我建议不要使用ReadLine

ReadLine是不好的,因为它会“等待”,直到它收到EOL,并且超时设置在串行端口。

如果你不知道你会得到多少数据,ReadLine不是一个好主意。每次你调用它,你可能需要挂起,直到它超时,或者当你收到EOL时幸运地过去了。

我建议您使用ReadReadExisting

另一种解决方法是将SerialPort.ReadTimeout设置得足够小并捕获TimeoutException,这样进程就不会等待。

票数 0
EN

Stack Overflow用户

发布于 2020-02-27 10:53:51

我讨厌说…(如果我看起来像个傻子…,不要介意)控件从未返回给我的原因是,通过循环201次,在不知不觉中,我试图从设备中检索“不存在”的数据--鸡蛋在我脸上。我必须检查我的201个手动ReadLine语句…去发现,在某个时候,我也失去了控制?我开始插入断点50,100,150,然后200,注意到有一个点,超过这个点,程序将停止响应。通过查看捕获的数据,它开始有意义了(我可以看到“逻辑”--哈!哈!哈!)。因此,我删除了201条重复的、丑陋的语句,并将循环的最大值改为176,然后一切都变得很棒。谢谢你的耐心。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60425364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档