C#串口通信模塊使用

C#串口模塊的使用。使用VS .net框架下WinForm程序應用開發。

  C#開發的串口通信小工具。

在這裏插入圖片描述
  相比於QT添加的串口類,WinForm是通過組件的形式將串口加入到程序中。
在這裏插入圖片描述
在這裏插入圖片描述
  在創建完windows窗體之後,添加組件類,就可以將串口加入到其中。
在這裏插入圖片描述
  然後就需要寫數據成員,初始化和方法,實現串口的讀寫功能。

串口類數據成員
   SerialPort SComm;            // 使用構造函數取串口控件
   TextBox MsgRc;               // 接收數據成員
   //構造函數初始化
   public SerialComm(SerialPort SerialPortx,TextBox TextMsg)
   {
       SComm = SerialPortx;    //串口模塊
       MsgRc = TextMsg;        //存放接收到的消息
   }
串口初始化
   public bool SeriaInit(string comx)
   {
       try
       {
           if (SComm.IsOpen)
               SComm.Close();
       }
       catch 
       {

       }
       SComm.PortName = comx;                          // 串口號
       SComm.BaudRate = 921600;                        // 波特率:1000000
       SComm.DataBits = 8;                             // 數據位數:8
       SComm.StopBits = System.IO.Ports.StopBits.One;  // 停止位
       SComm.Parity = System.IO.Ports.Parity.None;     // 奇偶校驗無
       SComm.Encoding = Encoding.Default;
       SComm.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.serialPort1_Rcv);
       try
       {
           SComm.Open();                                // 打開串口
           return true;
       }
       catch 
       {
           MessageBox.Show(comx + "端口被佔用","提示",MessageBoxButtons.OK,MessageBoxIcon.Error);
           return false;
       }
   }
串口寫
   public void SeriaWrite(byte [] data, byte len)
   {
       try
       {
           if (SComm.IsOpen)
           {
               SComm.Write(data, 0, len);    
           }
       }
       catch { }
                           
   }
串口讀

  串口讀到的消息存放再MsgRc中, 之後顯示到TextBox中。

  void serialPort1_Rcv(object sender, SerialDataReceivedEventArgs e)
  {
      UInt16 bufflen = (UInt16)SComm.BytesToRead;    //返回接收到的數據個數

      byte[] dat = new byte[bufflen];
      SComm.Read(dat, 0, bufflen);
      MsgRc.AppendText(System.Text.Encoding.Default.GetString(dat));
      CommBuff = dat;    //
      GetHeadFlag = 0;
   }
自動獲取端口信息

  定義了一些系統和設備的信息,然後調用API函數查找串口,如果設備信息帶COM字符,則認爲爲是串口。

  之後再定義WndProc消息處理函數,如果有新的硬件插入,則開啓定時器刷新端口信息

 public enum HardwareEnum
 {
    // 硬件
    Win32_Processor,         // CPU 處理器
    Win32_PhysicalMemory,    // 物理內存條
    Win32_Keyboard,          // 鍵盤
    Win32_PointingDevice,    // 點輸入設備,包括鼠標。
    Win32_FloppyDrive,       // 軟盤驅動器
    Win32_DiskDrive,         // 硬盤驅動器
    Win32_CDROMDrive,        // 光盤驅動器
    Win32_BaseBoard,         // 主板
    Win32_BIOS,              // BIOS 芯片
    Win32_ParallelPort,      // 並口
    Win32_SerialPort,        // 串口
    Win32_SerialPortConfiguration,   // 串口配置
    Win32_SoundDevice,               // 多媒體設置,一般指聲卡。
    Win32_SystemSlot,                // 主板插槽 (ISA & PCI & AGP)
    Win32_USBController,             // USB 控制器
    Win32_NetworkAdapter,            // 網絡適配器
    Win32_NetworkAdapterConfiguration, // 網絡適配器設置
    Win32_Printer,                  // 打印機
    Win32_PrinterConfiguration,     // 打印機設置
    Win32_PrintJob,                 // 打印機任務
    Win32_TCPIPPrinterPort,         // 打印機端口
    Win32_POTSModem,                // MODEM
    Win32_POTSModemToSerialPort,    // MODEM 端口
    Win32_DesktopMonitor,           // 顯示器
    Win32_DisplayConfiguration,     // 顯卡
    Win32_DisplayControllerConfiguration,    // 顯卡設置
    Win32_VideoController,                  // 顯卡細節。
    Win32_VideoSettings,                    // 顯卡支持的顯示模式。

    // 操作系統
    Win32_TimeZone,                    // 時區
    Win32_SystemDriver,                // 驅動程序
    Win32_DiskPartition,               // 磁盤分區
    Win32_LogicalDisk,                 // 邏輯磁盤
    Win32_LogicalDiskToPartition,      // 邏輯磁盤所在分區及始末位置。
    Win32_LogicalMemoryConfiguration,  // 邏輯內存配置
    Win32_PageFile,                    // 系統頁文件信息
    Win32_PageFileSetting,             // 頁文件設置
    Win32_BootConfiguration,           // 系統啓動配置
    Win32_ComputerSystem,              // 計算機信息簡要
    Win32_OperatingSystem,             // 操作系統信息
    Win32_StartupCommand,              // 系統自動啓動程序
    Win32_Service,                     // 系統安裝的服務
    Win32_Group,                       // 系統管理組
    Win32_GroupUser,                   // 系統組帳號
    Win32_UserAccount,                 // 用戶帳號
    Win32_Process,                     // 系統進程
    Win32_Thread,                      // 系統線程
    Win32_Share,                       // 共享
    Win32_NetworkClient,               // 已安裝的網絡客戶端
    Win32_NetworkProtocol,             // 已安裝的網絡協議
    Win32_PnPEntity,                   //all device
}


//如果是設備字符串中存在COM,則保存該字符串,則找到串口名。
private static string[] GetHarewareInfo(HardwareEnum hardType, string propKey)
{
    List<string> strs = new List<string>();
    try
    {
        using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from " + hardType))
        {
            var hardInfos = searcher.Get();
            foreach (var hardInfo in hardInfos)
            {
                if (hardInfo.Properties[propKey].Value != null)
                {
                    String str = hardInfo.Properties[propKey].Value.ToString();
                    if (str.Contains("COM"))
                    {
                        strs.Add(str);
                    }
                }
            }
        }
        return strs.ToArray();
    }
    catch
    {
        MessageBox.Show("硬件端口查找錯誤", "程序猿的提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
        return null;
    }
    finally
    {
        strs = null;
    }
}

//自動檢測新的硬件插入,如果存在則開啓定時器,刷新端口名
 protected override void WndProc(ref Message m)
 {
     const int WM_DEVICECHANGE = 0x219;
     if (m.Msg == WM_DEVICECHANGE)
     {
         timer3.Interval = 100;
         timer3.Enabled = true;
         DeviceTimer3Flag = true;

     }
     base.WndProc(ref m); //將系統消息傳遞自父類的WndProc
 }
//定時器函數,刷新端口名
private void timer3_Tick(object sender, EventArgs e)
{
    if (DeviceTimer3Flag)
    {
        DeviceTimer3Flag = false;
        RefreshComList();
        timer3.Enabled = false;
        this.comboBox1.SelectedIndex = -1;
        
    }
    if(ShowTimer3Flag)
    {
        ShowTimer3Flag = false;
        timer3.Enabled = false;
        toolStripStatusLabel4.Text = "";
    }
}
//刷新端口名信息
protected void RefreshComList()
{
    string[] str = GetHarewareInfo(HardwareEnum.Win32_PnPEntity, "Name");//獲取全部驅動名稱
    //foreach (string vPortName in SerialPort.GetPortNames())
    try
    {
        comboBox1.Items.Clear();
        for (byte i = 0; i < str.Length; i++)
        {
            //this.comboBox1.Text =  vPortName ;
            comboBox1.Items.Add(str[i]);
        }
    }
    catch (Exception)
    {
        ShowMessage("沒有可用端口", 1000);
    }
    this.Refresh();
}
//獲取端口信息後,提取出COM口,初始化端口。
 private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    if(button2.Text == "停止發送")
    {
        button2.Text = "配置發送";
        timer2.Enabled = false;
    }
    string comPortName;
    string TempByte;
    string ConstByte = "-";
    int startIndex = comboBox1.SelectedItem.ToString().LastIndexOf("(");
    int endIndex = comboBox1.SelectedItem.ToString().LastIndexOf(")");
    if ((endIndex-startIndex)>5)
    {
        TempByte = comboBox1.SelectedItem.ToString().Substring(startIndex + 6, 1);
          if (TempByte == ConstByte)
        {
           comPortName  = comboBox1.SelectedItem.ToString().Substring(startIndex + 1, 5);
        }
        else
        {
            comPortName = comboBox1.SelectedItem.ToString().Substring(startIndex + 1, 4);
        }
    }
    else
    {
       comPortName  = comboBox1.SelectedItem.ToString().Substring(startIndex + 1, 4);
    }
    if (SerialCommx.SeriaInit(comPortName))
    {
        ShowMessage(SerialCommx.GetPortName() + "已打開", 1000);
        button2.Enabled = true;
    }
    else
    {
        ShowMessage(SerialCommx.GetPortName() + "未打開",1000);
        button2.Enabled = false;
    }
    CurrentCOM = comboBox1.SelectedItem.ToString();
}

消息函數

  最後WinForm窗口程序開發,可以添加很多消息,比如關閉窗口消息等,可供開發完成不同的需求任務。

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if (thread != null)
        thread.Abort();
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
    this.Text = "1111";
}

在這裏插入圖片描述
代碼鏈接:https://download.csdn.net/download/qq_34430371/12310619

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章