Csharp Winfrom 多串口通信


Csharp 多串口通信

  顧名思義,多串口通信,普通的PC機一般只有一個串口,現在很多家用的PC都沒有串口,那么問題來了,如何保證多串口呢?

  有一種神器,MOXA CP-168U Series PCI bus 

  

  需要PCI插槽支持,現在市面上要找大主板才會有PCI。

  OK,硬件准備妥當。當然我這個項目中還需要另外一件神器,紅外感應器,暫且不表。

 

  插入設備,裝好驅動,你會在設備管理器中發現 serial board拓展出的8個port。Csharp有針對串口的控件:serialPort,每添加一個物理串口,就需要添加一個控件,操作如下:

  1>.實例化串口並打開

  

   serialPort.PortName = item;  //串口名稱
     serialPort.BaudRate = 2400;   //波特率
     serialPort.DataBits = 8;    //數據位
     serialPort.Parity = Parity.Even; //校驗位
     serialPort.StopBits = StopBits.One; //停止位
     serialPort.ReadTimeout = 3000;   //讀寫超時控制在3秒內
     serialPort.WriteTimeout = 3000;

     //設置數據流控制;數據傳輸的握手協議
     serialPort.Handshake = Handshake.None;
     serialPort.ReceivedBytesThreshold = 1;
     serialPort.RtsEnable = true;

     if (!serialPort.IsOpen)
     {
        serialPort.Open();
     }

  2>.發送數據(byte)

  

byte[] ReadData = (byte)Function you need did
serialPort.Write(ReadData, 0, ReadData.Length);
serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
//此處需要特別說明的是,很多人在debug的時候,串口接受回應的事件(serialPort1_DataReceived)沒有被觸發
//此時可使用串口調試工具,檢查發送的值是否正確,一般情況都是因為命令錯誤,沒有回應,導致DataReceived沒有被觸發

 

  3>.接受回應並處理

  

public void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            //結束符后,接收返回值           
            int by = serialPort.BytesToRead;
            byte[] rece = new byte[by];
            serialPort.Read(rece, 0, by);

            //解析返回值          
           //dosomething
        }        

  如上所述,你只有一個串口需要操作是這樣做可以,但是如果你有5個 8頭的serial board需要處理時,你就不得不考慮這樣做的效率了。那應該怎樣呢??

  針對多個串口,可以通過讀取注冊表獲取PC的所有被激活的串口,然后遍歷實例化,由於沒有使用多線程,不用考慮線程之間的沖突,即使資源被釋放,也會在3秒后觸發下一個周期

  

     /// <summary>
        /// 打開並設置所有的串口
        /// </summary>
        private void OpenSettingAllSerialPort()
        {
            try
            {
                Microsoft.Win32.RegistryKey reg = Microsoft.Win32.Registry.LocalMachine;
                Microsoft.Win32.RegistryKey hardware = reg.OpenSubKey("HARDWARE");
                Microsoft.Win32.RegistryKey dev = reg.OpenSubKey("DEVICEMAP");
                Microsoft.Win32.RegistryKey siteKey = reg.OpenSubKey("SERIALCOMM");

                //獲取所有串口
                string[] strPort = System.IO.Ports.SerialPort.GetPortNames();   //siteKey.GetValueNames();

                if (ExcuteNum < 1)
                {
                    foreach (string item in strPort)
                    {
                        serialPort.PortName = item;  //串口名稱
                        serialPort.BaudRate = 2400;   //波特率
                        serialPort.DataBits = 8;    //數據位
                        serialPort.Parity = Parity.Even; //校驗位
                        serialPort.StopBits = StopBits.One; //停止位
                        serialPort.ReadTimeout = 3000;   //讀寫超時控制在3秒內
                        serialPort.WriteTimeout = 3000;

                        //設置數據流控制;數據傳輸的握手協議
                        serialPort.Handshake = Handshake.None;
                        serialPort.ReceivedBytesThreshold = 1;
                        serialPort.RtsEnable = true;

                        if (!serialPort.IsOpen)
                        {
                            serialPort.Open();
                        }

                        byte[] ReadData = devOpreation.Broadst_Addr();
                        serialPort.Write(ReadData, 0, ReadData.Length);
                        serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);

                        ExcuteNum++;
                    }
                }
                else
                {
                    byte[] ReadData = devOpreation.Broadst_Addr();
                    serialPort.Write(ReadData, 0, ReadData.Length);
                    serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show( "串口未找到或被占用. " + ex.Message);                 
            }          
            
        }

  至此,你用很少的代碼實現了多串口的實例化並打開,然后發送和接受處理利用同樣的場景,問題得到解決。

  到最后這樣就是你看到的真實樣子。

  

  2015/03/17  TymonYang

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM