欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#串口通信模塊使用方法示例

 更新時間:2020年06月16日 10:12:14   作者:張一西  
這篇文章主要介紹了C#串口通信模塊使用方法示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

C#串口模塊的使用。使用VS .net框架下WinForm程序應(yīng)用開發(fā)。

C#開發(fā)的串口通信小工具。

相比于QT添加的串口類,WinForm是通過組件的形式將串口加入到程序中。、



在創(chuàng)建完windows窗體之后,添加組件類,就可以將串口加入到其中。


然后就需要寫數(shù)據(jù)成員,初始化和方法,實現(xiàn)串口的讀寫功能。

串口類數(shù)據(jù)成員

 SerialPort SComm;      // 使用構(gòu)造函數(shù)取串口控件
  TextBox MsgRc;        // 接收數(shù)據(jù)成員
  //構(gòu)造函數(shù)初始化
  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;               // 數(shù)據(jù)位數(shù):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;  //返回接收到的數(shù)據(jù)個數(shù)

   byte[] dat = new byte[bufflen];
   SComm.Read(dat, 0, bufflen);
   MsgRc.AppendText(System.Text.Encoding.Default.GetString(dat));
   CommBuff = dat;  //
   GetHeadFlag = 0;
  }

自動獲取端口信息

定義了一些系統(tǒng)和設(shè)備的信息,然后調(diào)用API函數(shù)查找串口,如果設(shè)備信息帶COM字符,則認為為是串口。

之后再定義WndProc消息處理函數(shù),如果有新的硬件插入,則開啟定時器刷新端口信息。

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

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


//如果是設(shè)備字符串中存在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); //將系統(tǒng)消息傳遞自父類的WndProc
 }
//定時器函數(shù),刷新端口名
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");//獲取全部驅(qū)動名稱
  //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 == "停止發(fā)送")
  {
    button2.Text = "配置發(fā)送";
    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();
}

消息函數(shù)

最后WinForm窗口程序開發(fā),可以添加很多消息,比如關(guān)閉窗口消息等,可供開發(fā)完成不同的需求任務(wù)。

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://pan.baidu.com/s/19AJVPixsVK3x7Y7dSoruwg 提取碼: tp2s

到此這篇關(guān)于C#串口通信模塊使用方法示例的文章就介紹到這了,更多相關(guān)C#串口通信模塊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#中常見的文件處理操作小結(jié)

    C#中常見的文件處理操作小結(jié)

    這篇文章主要為大家詳細介紹了C#中常見的一些文件處理操作,例如文件管理,獲取文件信息和控制處理文件,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • 關(guān)于C#數(shù)強轉(zhuǎn)會不會拋出異常詳解

    關(guān)于C#數(shù)強轉(zhuǎn)會不會拋出異常詳解

    這篇文章主要給大家介紹了關(guān)于C#數(shù)強轉(zhuǎn)會不會拋出異常的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04
  • C#引用類型作為方法的參數(shù)分析

    C#引用類型作為方法的參數(shù)分析

    這篇文章主要介紹了C#引用類型作為方法的參數(shù)分析,以實例的形式較為詳細的分析了參數(shù)的傳值問題,需要的朋友可以參考下
    2014-11-11
  • C#委托與事件初探

    C#委托與事件初探

    事件是委托的一種特殊形式,當(dāng)發(fā)生有意義的事情時,事件處理對象通知過程。接下來通過本文給大家介紹C#委托與事件初探,感興趣的朋友一起學(xué)習(xí)吧
    2016-02-02
  • C#實現(xiàn)窗體中動態(tài)按鈕的設(shè)計方法

    C#實現(xiàn)窗體中動態(tài)按鈕的設(shè)計方法

    在窗體界面中,通常以按鈕來代替菜單欄的功能,這種形式雖然給用戶一種直觀、界面風(fēng)格各異的感覺,但通常按鈕都是以靜止的形式顯示,所以本文給大家介紹了C#實現(xiàn)窗體中動態(tài)按鈕的設(shè)計方法,感興趣的朋友可以參考下
    2024-04-04
  • Unity打包代碼到DLL的實現(xiàn)

    Unity打包代碼到DLL的實現(xiàn)

    本文主要介紹了Unity打包代碼到DLL的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • C#使用Linq to XML進行XPath查詢的代碼實現(xiàn)

    C#使用Linq to XML進行XPath查詢的代碼實現(xiàn)

    最近在用到HtmlAgliltyPack進行結(jié)點查詢時,發(fā)現(xiàn)這里選擇結(jié)點使用的是XPath,所以這里總結(jié)一下在C#中使用XPath查詢XML的方法,習(xí)慣了用Linq,這里也是用的Linq to xml的,需要的朋友可以參考下
    2024-08-08
  • 利用WPF實現(xiàn)Windows屏保的制作

    利用WPF實現(xiàn)Windows屏保的制作

    屏保程序的本質(zhì)上就是一個Win32?窗口應(yīng)用程序。本文將利用WPF實現(xiàn)Windows屏保的制作,文中的示例代碼簡潔易懂,對我們學(xué)習(xí)WPF有一定幫助,感興趣的可以了解一下
    2022-07-07
  • C#實現(xiàn)Word轉(zhuǎn)換RTF的示例代碼

    C#實現(xiàn)Word轉(zhuǎn)換RTF的示例代碼

    這篇文章主要為大家詳細介紹了如何利用C#實現(xiàn)Word轉(zhuǎn)換RTF,文中的示例代碼講解詳細,對我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12
  • json格式數(shù)據(jù)分析工具PageElement類分享(仿Session寫法)

    json格式數(shù)據(jù)分析工具PageElement類分享(仿Session寫法)

    json格式數(shù)據(jù)分析工具PageElement類分享,可像Session一樣自由獲取Json元素的Key與Value。并可方便與ADO進行交互
    2013-12-12

最新評論