C# 学习笔记(13)自己的串口助手
生活随笔
收集整理的這篇文章主要介紹了
C# 学习笔记(13)自己的串口助手
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
C# 學習筆記(13)自己的串口助手
UI界面
界面部分參考野火串口助手,自己拖控件拖一個即可
功能實現
掃描串口
比較簡單實用
SerialPort.GetPortNames();如果開發特定設備具有特定串口名,可以掃描設備管理器獲取串口全名,篩選含有特定名稱的串口
/// <summary> /// 獲取COM口 從設備管理器獲取COM口詳細信息,篩選后返回符合要求的COM口(篩選包涵 str 字符串的COM口) /// </summary> /// <returns></returns> public string[] GetComName() {List<string> coms = new List<string>();string str = "COM"; //篩選關鍵字 可自行修改try{//搜索設備管理器中的所有條目using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from Win32_PnPEntity")){var hardInfos = searcher.Get();foreach (var hardInfo in hardInfos){if (hardInfo.Properties["Name"].Value != null){if (hardInfo.Properties["Name"].Value.ToString().Contains("(COM")){coms.Add(hardInfo.Properties["Name"].Value.ToString());}}}searcher.Dispose();}List<string> strs = new List<string>();foreach (string portName in coms){if (portName.Contains(str)){strs.Add(portName.Substring(portName.IndexOf("(COM")).Replace('(', ' ').Replace(')', ' ').Trim());}}return strs.ToArray();}catch{return null;} }串口熱插拔
當使用串口時,如果串口斷開連接,立即關閉串口,當有新的串口插入,刷新串口列表
public const int WM_DEVICE_CHANGE = 0x219; //設備改變 public const int DBT_DEVICEARRIVAL = 0x8000; //設備插入public const int DBT_DEVICE_REMOVE_COMPLETE = 0x8004; //設備移除/// <summary>/// USB熱插拔支持/// </summary>/// <param name="m"></param>protected override void WndProc(ref Message m){switch (m.WParam.ToInt32()) //判斷消息類型{case DBT_DEVICEARRIVAL:{if (serialPortCOM.IsOpen){}else{this.BeginInvoke(new Action(() => {UpdateSerialName(cmbSerialName, GetComName(), cmbSerialName.Text);}));}}break;case DBT_DEVICE_REMOVE_COMPLETE:{if (serialPortCOM.IsOpen){}else{this.BeginInvoke(new Action(() => { CloseSerialPort(); UpdateSerialName(cmbSerialName, GetComName(), cmbSerialName.Text); }));}}break;}base.WndProc(ref m);}接收顯示
/// <summary> /// 串口接收回調函數 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void serialPortCOM_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) {//50ms處理一次串口接收Thread.Sleep(50);if(!serialPortCOM.IsOpen){return;}Byte[] recvByteTemp = new Byte[serialPortCOM.BytesToRead];serialPortCOM.Read(recvByteTemp, 0, recvByteTemp.Length);//異步處理 防止UI界面卡死this.BeginInvoke(new Action<byte[]>((byte[] data)=> { DisplayRxInfo(data); }), recvByteTemp); }/// <summary> /// 接收處理 /// </summary> /// <param name="data">串口接收字節數據</param> private void DisplayRxInfo(byte[] data) {try{if (ckbStopDisPlay.Checked){//停止顯示return;}string str = "";if (ckbRxHex.Checked){//十六進制顯示str = MyConver.ByteToHex(data);if (ckbTimeStamp.Checked){//時間戳str = str.Replace("0A", "0A \r\n[" + DateTime.Now.Millisecond.ToString() + "]->>>");}}else{str = RxEncoding.GetString(data);if (ckbTimeStamp.Checked){//時間戳str = str.Replace("\n", "\n[" + DateTime.Now.Millisecond.ToString() + "]->>>");}}if (ckbAutoClear.Checked && txbRx.TextLength > 4096){//自動清除txbRx.Text = "";}txbRx.AppendText(str);if (ckbSaveRxFile.Checked){//將接收信息寫入文件File.AppendAllText(CurrentFilePath, str);}RxCounter += data.Length;}catch{} }進制轉換
public static class MyConver {/// <summary>/// 字節數組轉16進制字符串/// </summary>/// <param name="data"></param>/// <returns></returns>public static string ByteToHex(byte[] data){StringBuilder stringBuilder = new StringBuilder(1024);for (int i = 0; i < data.Length; i++){stringBuilder.Append(data[i].ToString("X2") + " ");}return stringBuilder.ToString();}/// <summary>/// hex string字節數組轉byte/// </summary>/// <param name="str"></param>/// <returns></returns>public static byte[] HexToByte(string str){str = str.Replace(" ", "");if (str.Length % 2 != 0){str = str.Insert(str.Length - 1, "0");}byte[] bytesHex = new byte[str.Length / 2];try{for (int i = 0; i < str.Length / 2; i++){bytesHex[i] = Convert.ToByte(str.Substring(2 * i, 2), 16);}}catch{}return bytesHex;} }保存配置信息
c# 提供了setting文件,可以十分方便的保存配置信息
- 保存時一定要記得使用 Properties.Settings.Default.Save();保存
歷史路徑
/// <summary> /// 記錄歷史文件信息 /// </summary> /// <param name="path"></param> private void SaveFilePath(params string[] path) {List<string> strList = new List<string>();strList.Add(Properties.Settings.Default.logPath1);strList.Add(Properties.Settings.Default.logPath2);strList.Add(Properties.Settings.Default.logPath3);strList.Add(Properties.Settings.Default.logPath4);strList.Add(Properties.Settings.Default.logPath5);foreach (var item in path){if (!string.IsNullOrWhiteSpace(item)){strList.Remove(item);strList.Insert(0, item);}}///* 保存當前路徑 */Properties.Settings.Default.logPath1 = strList[0];Properties.Settings.Default.logPath2 = strList[1];Properties.Settings.Default.logPath3 = strList[2];Properties.Settings.Default.logPath4 = strList[3];Properties.Settings.Default.logPath5 = strList[4];Properties.Settings.Default.Save();/* 歷史文件菜單 */toolStripMenuItem2.Text = strList[0];toolStripMenuItem3.Text = strList[1];toolStripMenuItem4.Text = strList[2];toolStripMenuItem5.Text = strList[3];toolStripMenuItem6.Text = strList[4]; }窗口拖拽
- 開啟控件拖拽
- 添加事件
源碼 https://github.com/mian2018/CSharp_COM
總結
以上是生活随笔為你收集整理的C# 学习笔记(13)自己的串口助手的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 调试笔记--jlink 变量转实时波形小
- 下一篇: C# 学习笔记(14)自己的串口助手--