none
該怎麼動態的建立serialport並動態的讓這些serialport開啟? RRS feed

  • 問題

  • 我需要利用serialport來讀取電腦某com的資料,但com的來源會依情況增加,需要利用到好幾個serialport同時讀取好幾個com的資料。

    我的想法是,依button來判斷需要有幾個serialport之後再建立幾個serilaport ,之後設定初值後,再一個一個開啟。

    我這麼做會有一個奇怪的問題,好像沒有辦法同時間open很多個serialport,我是利用回圈開啟,開啟到下一個後會說serialPort_DataReceived 已關閉。

    我有利用過執行緒測試過,不過我使用的方法一直失敗...。

    不知道有什麼建議或是該修改的地方。

    List<System.IO.Ports.SerialPort> sps = new List<System.IO.Ports.SerialPort>(); //建立一個可放SerialPort的物件集合sps
    
            private void button1_Click_1(object sender, EventArgs e)
            {
                int button_count = 0;
    
                foreach (object item in this.groupBox1.Controls)
                {
                    if (item is Button)
                    {
                        button_count += 1;
                    }
                }
                for (int i = 0; i <= button_count; i++) //有幾個 button 就設定幾個serialport
                {
                    sps.Add(new System.IO.Ports.SerialPort()); //加入一個SerialPort物件
                }
                
                foreach (System.IO.Ports.SerialPort sp in sps) 
                {//取出在sps集合中的每一個 SerialPort,並操作。  除了 portname 其他先設定
                    sp.BaudRate = 9600;
                    sp.DataBits = 8;
                    sp.Parity = System.IO.Ports.Parity.None;
                    sp.StopBits = System.IO.Ports.StopBits.One;
                    sp.Encoding = Encoding.Default;
                    sp.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(serialPort_DataReceived);
                }
                
                for (int j = 1; j <= sps.Count; j++)
                {
                    
                    sps[j].PortName = "COM"+j.ToString();
                    //sps[j].PortName = "COM" + j.ToString();
                    sps[j].DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.serialPort_DataReceived);
                    try
                        {
                        sps[j].Open();
                        MessageBox.Show("COM"+j.ToString()+"成功開啟");
                        }
                    catch
                    {
                        MessageBox.Show("COM"+j.ToString()+"無法使用");
                        //this.Controls["button" + j.ToString()].Enabled = false;
                    }
                }
            }
    
    

     

    • 已移動 璉璉 2011年11月12日 下午 12:40 (從:Visual Studio一般討論區(General))
    2011年11月4日 上午 08:53

解答

  • 您依button建立SerialPort時,會多建一個吧!

    for (int i = 0; i <= button_count; i++) => for (int i = 0; i < button_count; i++)

    嗯~ 也要確定是否真的有該com port,不然也是會失敗的!

     


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    • 已編輯 亂馬客 2011年11月5日 上午 02:34
    • 已標示為解答 璉璉 2011年11月12日 下午 12:40
    2011年11月4日 上午 10:19
  • 不同的 COM 可以同時開。

    同一 COM 不能同時開。請特別注意 NB 裡面有 Voice Modem 的,預設會被 NB 的 driver 開著。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已標示為解答 璉璉 2011年11月12日 下午 12:40
    2011年11月4日 下午 02:46

所有回覆

  • 您依button建立SerialPort時,會多建一個吧!

    for (int i = 0; i <= button_count; i++) => for (int i = 0; i < button_count; i++)

    嗯~ 也要確定是否真的有該com port,不然也是會失敗的!

     


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    • 已編輯 亂馬客 2011年11月5日 上午 02:34
    • 已標示為解答 璉璉 2011年11月12日 下午 12:40
    2011年11月4日 上午 10:19
  • 不同的 COM 可以同時開。

    同一 COM 不能同時開。請特別注意 NB 裡面有 Voice Modem 的,預設會被 NB 的 driver 開著。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已標示為解答 璉璉 2011年11月12日 下午 12:40
    2011年11月4日 下午 02:46
  • 喔喔!

    2011年11月5日 下午 11:53
  • 謝謝提醒!
    2011年11月5日 下午 11:55