为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
喵喵时光机 2023-09-24 16:11:29
我编写了一个设置参数的控制台 C# 程序(我从项目->调试选项中给出了参数),我试图从以太网和串行端口获取数据。我成功设置了 args 参数,但程序在控制台突然打开时出现超时错误,并且就像处于无限循环中一样,但没有循环。(在读取 while 之前发生错误)string filename = args[4];对于那些想了解这些参数是什么的人;1 = IP,[2] = 端口号,[3] = 端口名称(COM3),[4] = 文件名。[编辑] 考虑到我可能同时从以太网和串行端口的两个连接获取数据,超时是为了防止数据丢失。另外我想说的是,添加DataReceived += new SerialDataReceivedEventHandler(ProcessReceivedData);i 而不是 while 没有任何好处,因为它再次发生在 while 循环之前。有人有什么主意吗?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;                    }                }
查看完整描述

2 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

经过评论里和你的讨论,我想我可以回答你的问题了。

正如您自己发现的那样,该错误绝对与您怀疑的那行没有任何关系。

您会收到一个TimeoutException有意义的消息,因为InitilizeSerialPort您将读取超时设置为 10 毫秒。这是非常短的,特别是考虑到您正在读取整行,而不仅仅是几个字节。
你确实在那里使用了更大的数字。默认值为 500 毫秒,这是一个相当不错的时间。如果您确实需要降低,请尝试一下,但在大多数情况下您不需要更改它。由于您正在阅读一整行,因此实际上 500 毫秒很可能还不够,具体取决于您每行获得的信息量。尝试一些值,直到它起作用(但如果 90 就足够了,请不要将其设置为 100,而是给它一点空间)。

也许值得一提的是,超时当然是最大值。如果指定 1000ms,并且读取需要 100ms,它将在 100ms 后返回,而不等待超时。要解决此问题,您可以完全删除设置 -property 的行ReadTimeout(它将使用默认值 500ms)或自行将其设置为更高的值。

遗憾的是,我无法帮助您UnauthorizedAccessException解决上一条评论中提到的问题,因为这很大程度上取决于您的设置。如果您需要帮助,您应该提出一个新问题。

编辑:
顺便说一句,你正在TimeoutException完全吞下GetMessage. 不要那样做。当另一个错误发生时,您已经在编写控制台消息,因此也可以在那里执行此操作。同样的方法也适用于SocketException刚刚吞下的东西。永远不要吞下异常


查看完整回答
反对 回复 2023-09-24
?
当年话下

TA贡献1890条经验 获得超9个赞

您是否检查过以确保args[1]args[2]等是您认为的那样?尝试将 更改args[1]args[0]并将其余部分减少 1 args[2]->args[1]等。



查看完整回答
反对 回复 2023-09-24
  • 2 回答
  • 0 关注
  • 127 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信