none
請問一段程式碼 , 何時會不執行 try 內的敘述 , 也不執行 catch 內的敘述 RRS feed

  • 問題

  • 以下是我的 程式碼

    因為要測試連接鬆脫故意將設備的連接拔掉 ,

    以 debug 設中斷點 , 該敘述有執行 , 但其下的敘述執行 , 也不會跳到 catch 段

    請問這是什麼狀況 ? 謝謝

    Dim serialPort As SerialPort

    serialPort = New SerialPort()

            serialPort.DtrEnable = True

            serialPort.RtsEnable = True

            serialPort.PortName = "COM4"
            serialPort.BaudRate = 19200
            serialPort.Parity = Parity.None
            serialPort.DataBits = 7
            serialPort.StopBits = StopBits.One
            serialPort.Handshake = Handshake.None

    serialPort.Open()

    Try
        Dim RET As Int32 = serialPort.ReadChar()   // 設中斷點
        MessageBox.Show(RET.ToString())
    Catch ex As Exception
        MessageBox.Show(ex.ToString())
    End Try


    • 已編輯 MIS110 2015年7月29日 上午 06:41
    2015年7月29日 上午 06:40

解答

  • 因為 他在等要讀個 char , 讀完才會往下走, 如果你沒給他讀個 char , 他就等在那直到 Timeout (如果你有設定的話)

    SerialPort.ReadTimeout 屬性

    還有, .Net Framework 的 serialport 類別的內部實作並沒有辦法讓你真的攔到 序列埠斷線這檔事, 一般我們都是發送一個封包, 然後設定 ReadTimeout , 如果逮到發送後過了某段時間沒收到回應, 則再測試一次, 連續幾次沒回應即判定為斷線. 

    另外, 如果你要寫序列埠程式, 建議你先看我的系列文章 海角點部落 serialport 系列

    從頭到尾一篇篇慢慢看, 慢慢理解, 不要一下子就忙著寫 code .

     

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 MIS110 2015年8月10日 上午 05:08
    2015年7月29日 下午 12:51
    版主
  • 實體 SerialPort 斷線不會引致錯誤,最多沒正常通訊而已,因為你的硬體還在線上。

    讀不到資料是緩衝區空的,最多逾時,並不是錯誤,一般還是建議用

    nBytes = SerialPort.Read(BufferBytes, 0, BufferBytesLength)

    去讀。

    另外你還要考慮電腦讀取速度跟資料傳輸速度差的問題。

    [.Net] 資料接收的常識


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    • 已標示為解答 MIS110 2015年8月10日 上午 05:08
    2015年7月29日 下午 03:08
  • 您可以把:

    serialPort.Open()

    一併包在Try中, 例如:

    Try

        serialPort.Open()

        Dim RET As Int32 = serialPort.ReadChar()   // 設中斷點
        MessageBox.Show(RET.ToString())
    Catch ex As Exception
        MessageBox.Show(ex.ToString())
    End Try

    再執行看看

    • 已標示為解答 MIS110 2015年8月10日 上午 05:08
    2015年7月29日 上午 06:48
  • 從 ReadBytes, 到真的執行 Read, 一定有些微的時間差, 所以有可能出現這情形沒錯.

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 MIS110 2015年8月10日 上午 05:08
    2015年8月4日 上午 07:15
    版主
  • 我注意到, 你應該用 ReadTimeout , 而不是 WriteTimeout 吧 ?


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 MIS110 2015年8月10日 上午 05:07
    2015年8月6日 上午 04:18
    版主

所有回覆

  • 您可以把:

    serialPort.Open()

    一併包在Try中, 例如:

    Try

        serialPort.Open()

        Dim RET As Int32 = serialPort.ReadChar()   // 設中斷點
        MessageBox.Show(RET.ToString())
    Catch ex As Exception
        MessageBox.Show(ex.ToString())
    End Try

    再執行看看

    • 已標示為解答 MIS110 2015年8月10日 上午 05:08
    2015年7月29日 上午 06:48
  • 謝謝您的回覆

    狀況仍然一樣 , 都是執行到 Dim RET As Int32 = serialPort.ReadChar()  之後就沒聲沒息了

    沒執行下面的 MessageBox.Show(RET.ToString())

    也沒執行 catch 那段

    2015年7月29日 上午 07:25
  • 你有等看看它會不會timeout嗎?
    2015年7月29日 上午 10:50
  • 因為 他在等要讀個 char , 讀完才會往下走, 如果你沒給他讀個 char , 他就等在那直到 Timeout (如果你有設定的話)

    SerialPort.ReadTimeout 屬性

    還有, .Net Framework 的 serialport 類別的內部實作並沒有辦法讓你真的攔到 序列埠斷線這檔事, 一般我們都是發送一個封包, 然後設定 ReadTimeout , 如果逮到發送後過了某段時間沒收到回應, 則再測試一次, 連續幾次沒回應即判定為斷線. 

    另外, 如果你要寫序列埠程式, 建議你先看我的系列文章 海角點部落 serialport 系列

    從頭到尾一篇篇慢慢看, 慢慢理解, 不要一下子就忙著寫 code .

     

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 MIS110 2015年8月10日 上午 05:08
    2015年7月29日 下午 12:51
    版主
  • 實體 SerialPort 斷線不會引致錯誤,最多沒正常通訊而已,因為你的硬體還在線上。

    讀不到資料是緩衝區空的,最多逾時,並不是錯誤,一般還是建議用

    nBytes = SerialPort.Read(BufferBytes, 0, BufferBytesLength)

    去讀。

    另外你還要考慮電腦讀取速度跟資料傳輸速度差的問題。

    [.Net] 資料接收的常識


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    • 已標示為解答 MIS110 2015年8月10日 上午 05:08
    2015年7月29日 下午 03:08
  • 沒有 try 也沒有 catch,表示連 try 的區塊都沒進去...

    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2015年7月29日 下午 03:49
    版主
  • 感謝各位熱心的提供各種可能方法 ,  我先試試再上來報告狀況
    2015年7月30日 上午 01:00
  • 因為拜讀各位提供的資料 , 海角點部落 serialport 系列 , [.Net] 資料接收的常識
    花了一些時間
    現發現了幾個問題 , 需要各位高手再次協助

    我是用一個form 上有一個 button 按下後執行一些功能


    1. try catch 的問題 (將接設備的那端連接線拔除,但維持連電腦的連接)
     
    用debug 逐步看,

    當我的 try 如下
    try
      serialPort.WriteTimeout = 5000  // 有執行
      serialPort.Open()               // 有執行
      serialPort.WriteTimeout = 5000    // 有執行 ,之後就跳出 form ,程式就當了
      RET = serialPort.ReadChar()       // 不會執行
      MessageBox.Show(RET.ToString())   // 不會執行
    Catch ex As Exception             // 不會進來
      MessageBox.Show(ex.ToString())
      serialPort.Close()
    End Try
    MessageBox.Show(ex.ToString())  // 不會執行

    2. 海角點部落 serialport 系列,有提到用 BytesToRead 先看緩衝區的資料 

    但當我下完 serialPort.Write(設備命令)後 , 用 3種方式卻看到不同結果

    用 MessageBox.Show(serialPort.BytesToRead.ToString()) 看 , 值是 0
    但用serialPort.ReadChar() 去讀卻是 2 個 bytes

    另一次 , 此次我在 MessageBox.Show(serialPort.BytesToRead.ToString())前
    用 MessageBox.Show("test1") 設中斷點 ,
    用 MessageBox.Show(serialPort.BytesToRead.ToString()) 看 , 值是 2
    再用serialPort.ReadChar() 去讀卻是 2 個 bytes 

    似乎是設備寫入緩衝區需要時間

    請問我如何讓電腦等一下再讀緩衝區 ?

    謝謝
    2015年8月4日 上午 04:01
  • 從 ReadBytes, 到真的執行 Read, 一定有些微的時間差, 所以有可能出現這情形沒錯.

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 MIS110 2015年8月10日 上午 05:08
    2015年8月4日 上午 07:15
    版主
  • 感謝 Bill 再次回覆 , 想請問大家 , 問題 1 為何會這樣 ? 謝謝
    2015年8月4日 上午 08:37
  • 跳出 form 時有任何的 message 嗎 ?

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2015年8月4日 上午 09:39
    版主
  • 跳出 form 時有任何的 message 嗎 ?    --> 沒有任何訊息 , 就當在那邊 , 點那裡都不會動
    2015年8月6日 上午 02:36
  • 我注意到, 你應該用 ReadTimeout , 而不是 WriteTimeout 吧 ?


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 MIS110 2015年8月10日 上午 05:07
    2015年8月6日 上午 04:18
    版主
  • 真的ㄟ , 終於找出問題了 , 太謝謝了
    2015年8月10日 上午 05:07