System.IO.Ports.dll 错误中的 System.TimeoutException

我编写了一个设置参数的控制台 C# 程序(我从项目->调试选项中给出了参数),我试图从以太网和串行端口获取数据。

我成功设置了 args 参数,但程序在控制台突然打开时出现超时错误,并且就像处于无限循环中一样,但没有循环。(在读取 while 之前发生错误)string filename = args[4];

对于那些想了解这些参数是什么的人;1 = IP,[2] = 端口号,[3] = 端口名称(COM3),[4] = 文件名。

[编辑] 考虑到我可能同时从以太网和串行端口的两个连接获取数据,超时是为了防止数据丢失。

另外我想说的是,添加DataReceived += new SerialDataReceivedEventHandler(ProcessReceivedData);i 而不是 while 没有任何好处,因为它再次发生在 while 循环之前。

有人有什么主意吗?

https://img1.mukewang.com/650fef62000154c119161074.jpg

static int Main(string[] args)

        {


            int err = 0;


            if (args.Length == 5)

            {

                IPAddress IP = IPAddress.Parse(args[1]);

                int CmdPort;

                if (int.TryParse(args[2],out CmdPort))

                {

                    string filename = args[4];//takes filename 


                    String root = @".\\"; //DEFAULT EXE PATH ROOT

                    string path_combined;

                    path_combined = Path.Combine(root, filename);

                    StreamWriter sw;

                    try

                    {

                        sw = File.AppendText(path_combined);

                        p = new SPWrapper(IP, CmdPort, args[3], sw);

                        if (p.Init())

                        {

                            while (!Console.KeyAvailable)

                            {

                                p.GetMessage();

                                Thread.Sleep(100);

                            }

                            p.Close();

                        }

                        sw.Flush();

                        sw.Close();

                    }

                    catch (System.IndexOutOfRangeException ex)

                    {

                        System.ArgumentException argEx = new System.ArgumentException("File creation failed!", ex);

                        err = -2;

                        throw argEx;

                    }

                }


喵喵时光机
浏览 128回答 2
2回答

繁星coding

经过评论里和你的讨论,我想我可以回答你的问题了。正如您自己发现的那样,该错误绝对与您怀疑的那行没有任何关系。您会收到一个TimeoutException有意义的消息,因为InitilizeSerialPort您将读取超时设置为 10 毫秒。这是非常短的,特别是考虑到您正在读取整行,而不仅仅是几个字节。你确实在那里使用了更大的数字。默认值为 500 毫秒,这是一个相当不错的时间。如果您确实需要降低,请尝试一下,但在大多数情况下您不需要更改它。由于您正在阅读一整行,因此实际上 500 毫秒很可能还不够,具体取决于您每行获得的信息量。尝试一些值,直到它起作用(但如果 90 就足够了,请不要将其设置为 100,而是给它一点空间)。也许值得一提的是,超时当然是最大值。如果指定 1000ms,并且读取需要 100ms,它将在 100ms 后返回,而不等待超时。要解决此问题,您可以完全删除设置 -property 的行ReadTimeout(它将使用默认值 500ms)或自行将其设置为更高的值。遗憾的是,我无法帮助您UnauthorizedAccessException解决上一条评论中提到的问题,因为这很大程度上取决于您的设置。如果您需要帮助,您应该提出一个新问题。编辑:顺便说一句,你正在TimeoutException完全吞下GetMessage. 不要那样做。当另一个错误发生时,您已经在编写控制台消息,因此也可以在那里执行此操作。同样的方法也适用于SocketException刚刚吞下的东西。永远不要吞下异常。

当年话下

您是否检查过以确保args[1]、args[2]等是您认为的那样?尝试将 更改args[1]为args[0]并将其余部分减少 1 args[2]->args[1]等。
打开App,查看更多内容
随时随地看视频慕课网APP