C#串口通信模塊使用方法示例
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)文章
關(guān)于C#數(shù)強轉(zhuǎn)會不會拋出異常詳解
這篇文章主要給大家介紹了關(guān)于C#數(shù)強轉(zhuǎn)會不會拋出異常的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04C#實現(xiàn)窗體中動態(tài)按鈕的設(shè)計方法
在窗體界面中,通常以按鈕來代替菜單欄的功能,這種形式雖然給用戶一種直觀、界面風(fēng)格各異的感覺,但通常按鈕都是以靜止的形式顯示,所以本文給大家介紹了C#實現(xiàn)窗體中動態(tài)按鈕的設(shè)計方法,感興趣的朋友可以參考下2024-04-04C#使用Linq to XML進行XPath查詢的代碼實現(xiàn)
最近在用到HtmlAgliltyPack進行結(jié)點查詢時,發(fā)現(xiàn)這里選擇結(jié)點使用的是XPath,所以這里總結(jié)一下在C#中使用XPath查詢XML的方法,習(xí)慣了用Linq,這里也是用的Linq to xml的,需要的朋友可以參考下2024-08-08C#實現(xiàn)Word轉(zhuǎn)換RTF的示例代碼
這篇文章主要為大家詳細介紹了如何利用C#實現(xiàn)Word轉(zhuǎn)換RTF,文中的示例代碼講解詳細,對我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下2022-12-12json格式數(shù)據(jù)分析工具PageElement類分享(仿Session寫法)
json格式數(shù)據(jù)分析工具PageElement類分享,可像Session一樣自由獲取Json元素的Key與Value。并可方便與ADO進行交互2013-12-12