none
SerialPort Timeout RRS feed

  • 問題

  • 最近遇到一個問題想請教

    我自己寫了一個serialport接收程式

    這個小程式執行就會自動開port然後隨時接收資料

    但會遇到一個問題就是擺久了就收不到資料了

    得要close在open

    請教有什麼設定或方法可以解決嗎

    PS:

    資料不會一直丟,我裝在測試電腦上,需要測試時才會用

    所以可能擺著半天或是一整天沒用隔天要用就得重開程式

    2013年12月12日 上午 10:18

解答

  • 我甚麼時候升格當版主?

    放在事件裡非同步呼叫時,當事件被重複觸發,就會造成緩衝區被不同執行緒同時讀取,當執行緒互相衝突時,就會造成執行緒互相咬死而鎖定緩衝區,接下來執行緒就會一直堆積增加到滿為止。

    解決方案兩種選一:

    1. 不要用事件而是用輪詢

    2. 事件內用靜態變數避免重複執行,例如:

    Dim bRunning As Boolean = False

    Sub 事件

       If bRunning Then Exit Sub Else bRunning = True

       你的工作

       bRunning = False

    End Sub


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

    • 已標示為解答 dodolon 2013年12月24日 上午 01:24
    2013年12月20日 下午 02:01
  • Serial Port 系列(9) 基本篇 -- The Dark Side of the DataReceived Event

    Serial Port 系列(10) 基本篇 -- DataReceived Event 簡易應對方針

    Serial Port 系列(11) 基本篇 -- 利用執行緒讀取資料


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

    • 已標示為解答 dodolon 2013年12月24日 上午 01:24
    2013年12月20日 下午 02:14
    版主

所有回覆

  • 你應該先說明你的程式碼內容是甚麼, 不然可能要去行天宮問恩主公會好一點.

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


    2013年12月12日 下午 01:34
    版主
  • 若是你用事件收,處理不好的話... 可以用工作管理員看一下執行緒,超過 30 條以上就會收不到資料,然後一直鎖到 512 條...


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

    2013年12月12日 下午 04:11
  • 功能只是單純的port會一直開著,當我要測試Device時,將Rs232線接上傳輸測試

    Code大致如下

      void MainWindow_Loaded(object sender, RoutedEventArgs e)
            {
                try
                {
                    if (BC != null)
                    {
                        BC.KillInstance();  //先釋放個體
                    }
                    BC = DeviceCheck.GetInstance();
                    bool portstate = BC.HasPortName;
                    if (portstate)
                    {
                        BC.MyEvent += new MyDelegate(BC_MyEvent);
                        BC.OpenCOM();
                        TitleName.Foreground = Brushes.White;
                    }
                    else
                    {
                        TitleName.Foreground = Brushes.Black;
                    }
    
                }
                catch (Exception ex)
                {
                    ErLog.writeMsg(ex);
                    TitleName.Foreground = Brushes.Black;
                }
            }
            public delegate void BCValue(string[] value); //接收資料用的
            void BC_MyEvent(string[] Value)
            {
                try
                {
                    if (!this.Dispatcher.CheckAccess())
                    {
                        this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action<string[]>(GetBC), Value);
                    }
                    else
                    {
                        GetBC(Value);
                    }
                }
                catch { }
            }
            void GetBC(string[] wValue)
            {
                  //將收到的值顯示在textbox
            }

    2013年12月13日 上午 02:02
  • 如心冷大所言的, 你是否使用了 DataReceived  Event 接收資料.


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

    2013年12月13日 上午 05:57
    版主
  • 然後 ? 現在狀況怎麼了 ?

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

    2013年12月19日 上午 11:05
    版主
  • ^^" 因為這是自己在研究的東西  最近本身工作關係沒有實際測試

    我serial是獨立的class 且我有用instance確保只有一個實體

    接收的部分如下

        public event MyDelegate MyEvent;
            //接值
            void scomport_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                try
                {
                    byte[] bCom = null;
                    int iLength = currentPort.BytesToRead;
                    bCom = new byte[iLength];
                    System.Threading.Thread.Sleep(500);
                    currentPort.Read(bCom, 0, iLength);
                         ......................
                    sbCom.Clear();
                    MyEvent(Devicevalue);
                    }
                }
                catch { }
            }

    心冷板主提到的

    可以用工作管理員看一下執行緒,超過 30 條以上就會收不到資料,然後一直鎖到 512 條...

    是指用process去偵測執行緒然後做kill的處理嗎?還是我接收的部分要做怎樣的處理?



    2013年12月20日 上午 10:01
  • 我甚麼時候升格當版主?

    放在事件裡非同步呼叫時,當事件被重複觸發,就會造成緩衝區被不同執行緒同時讀取,當執行緒互相衝突時,就會造成執行緒互相咬死而鎖定緩衝區,接下來執行緒就會一直堆積增加到滿為止。

    解決方案兩種選一:

    1. 不要用事件而是用輪詢

    2. 事件內用靜態變數避免重複執行,例如:

    Dim bRunning As Boolean = False

    Sub 事件

       If bRunning Then Exit Sub Else bRunning = True

       你的工作

       bRunning = False

    End Sub


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

    • 已標示為解答 dodolon 2013年12月24日 上午 01:24
    2013年12月20日 下午 02:01
  • Serial Port 系列(9) 基本篇 -- The Dark Side of the DataReceived Event

    Serial Port 系列(10) 基本篇 -- DataReceived Event 簡易應對方針

    Serial Port 系列(11) 基本篇 -- 利用執行緒讀取資料


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

    • 已標示為解答 dodolon 2013年12月24日 上午 01:24
    2013年12月20日 下午 02:14
    版主