none
關於Serial Port的問題 RRS feed

  • 問題

  • 我在private void ATPort_DataReceived(object sender, SerialDataReceivedEventArgs e)裡面放了下面這段程式

    while (!closing && ATPort != null && ATPort.IsOpen && ATPort.BytesToRead != 0)
                    {                   
                        ResponseMessage = ATPort.ReadLine().Trim();                
                        NC.log(ATResCount.ToString() + ":" + ResponseMessage);
                        ATResCount++;
                        UIControl.BeginInvoke(updater, new object[] { ResponseMessage });
                    }
        reply = true;
        if (closing)
                        ATPort.close(); 

    當我的Form想要關閉時,我想要先對Port下Write 一串指令
    然後Port會回應給我
    我想要等回應結束之後
    再做Port.CLose
    但是每次總是會出錯  似乎是因為我PORT已經先關閉,但還在迴圈裡面執行Port.Readline的樣子
    請問我應該怎麼做才對?
    2009年1月20日 上午 02:18

解答

  • 你可以簡單的用延遲加上 Read/Write 指令來做你最後要做的動作,不用去處理事件,例如

    Code Snippet

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                //Remove handler
                serialPort1.DataReceived -= serialPort1_DataReceived;
                //Serialport.Writr....
                //delay
                System.Threading.Thread.Sleep(300);
                //SerialPort.Read.....
            }

     

     

    另外,如果是要再表單關閉前做些事情的話,要去處理Closing的事件,Closed已經來不及了..
    2009年1月20日 上午 05:37

所有回覆

  • 看不到你Form_Closing的事件是怎麼處理的,不過你可以在closing中取消表單關閉動作,之後做你傳送的動作等等,完成之後程式在自己產生關閉的動作。

     

    2009年1月20日 上午 02:45
  • 抱歉 補上其他部分:
            private void Form_Closed(object sender, EventArgs e)
            {
                stop();      
            }
            private void stop()
            {           
    if (ATPortIsOpen)
                {
                    closing = true;
                    ATSendDatamsg);               
                }
            }
             private void ATsendData(string s)
            {           
                ATPort.Write(s);           
                Wait_Reply();      
            }      

            private void Wait_Reply()
            {
                while (!reply)
                    Thread.Sleep(SendDelay);
                reply = false;      
            }
            private void ATPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                try
                {
                    while (!closing && ATPort != null && ATPort.IsOpen && ATPort.BytesToRead != 0)
                    {                   
                        ResponseMessage = ATPort.ReadLine().Trim();                
                        UIControl.BeginInvoke(updater, new object[] { ResponseMessage });
                    }
                    reply = true;
                    if (closing)
                    {                           
                        close();
                    }
                }
                catch (IOException ie)
                {
                    log(ie.ToString());
                }
            }
            public void close()
            {
                if (ATPort != null && ATPort.IsOpen)
                {
                    ATPort.DiscardInBuffer();
                    ATPort.DiscardOutBuffer();
                    ATPort.Close();
                }
    }

    2009年1月20日 上午 03:44
  • 你可以簡單的用延遲加上 Read/Write 指令來做你最後要做的動作,不用去處理事件,例如

    Code Snippet

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                //Remove handler
                serialPort1.DataReceived -= serialPort1_DataReceived;
                //Serialport.Writr....
                //delay
                System.Threading.Thread.Sleep(300);
                //SerialPort.Read.....
            }

     

     

    另外,如果是要再表單關閉前做些事情的話,要去處理Closing的事件,Closed已經來不及了..
    2009年1月20日 上午 05:37
  •  

    原來如此!!要在CLOSING裡面做嗎?

     

    太感謝了 我去試試看

     

    因為我想要在關閉FORM的時候釋放資源,但是又需要透過SP去下指令關閉DEVICE

     

    才會搞的這麼麻煩...

     

    不過 如果用SLEEP的話,我怕在不同機器不同環境下跑會有時候出問題耶

     

    不知道有沒有徹底解決的辦法?

    2009年1月20日 上午 06:30
  • 我是覺得你要做的事情不適合再用事件去做,用sleep當然是比較呆,你可以抓長一點的時間,要不然就是用迴圈一直去偵測232的buffer是不是已經有資料進來,之後再去處理也是一個方式。

    2009年1月20日 上午 07:16