C#串列埠通訊模組使用方法示例
阿新 • • 發佈:2020-06-17
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,len); } } catch { } }
串列埠讀
串列埠讀到的訊息存放再MsgRc中, 之後顯示到TextBox中。
void serialPort1_Rcv(object sender,SerialDataReceivedEventArgs e) { UInt16 bufflen = (UInt16)SComm.BytesToRead; //返回接收到的資料個數 byte[] dat = new byte[bufflen]; SComm.Read(dat,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("硬體埠查詢錯誤","程式猿的提示",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://pan.baidu.com/s/19AJVPixsVK3x7Y7dSoruwg 提取碼: tp2s
到此這篇關於C#串列埠通訊模組使用方法示例的文章就介紹到這了,更多相關C#串列埠通訊模組內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!