亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 188 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號