日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C# 学习笔记(13)自己的串口助手

發布時間:2025/4/16 C# 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# 学习笔记(13)自己的串口助手 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C# 學習筆記(13)自己的串口助手

UI界面

界面部分參考野火串口助手,自己拖控件拖一個即可

功能實現

掃描串口

  • 方法一 使用串口自帶的get函數
  • 比較簡單實用

    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> private void LoadParam() {UpdateSerialName(cmbSerialName, GetComName(), Properties.Settings.Default.serialPortName);//UpdateSerialName(cmbSerialName, SerialPort.GetPortNames(), Properties.Settings.Default.serialPortName);cmbBaudRate.Text = Properties.Settings.Default.serialPortBaud;cmbParity.SelectedIndex = cmbParity.Items.IndexOf(Properties.Settings.Default.serialPortParity);cmbDataBits.Text = Properties.Settings.Default.serialPortDataBits;cmbStopBits.Text = Properties.Settings.Default.serialPortStopBits;ckbStopDisPlay.Checked = Properties.Settings.Default.ckbStopDisPlay;ckbAutoClear.Checked = Properties.Settings.Default.ckbAutoClear;ckbRxHex.Checked = Properties.Settings.Default.ckbRxHex;ckbSaveRxFile.Checked = Properties.Settings.Default.ckbSaveRxFile;ckbTimeStamp.Checked = Properties.Settings.Default.ckbTimeStamp;ckbRxWordWrap.Checked = Properties.Settings.Default.ckbRxWordWrap;ckbRxUTF8.Checked = Properties.Settings.Default.ckbRxUTF8;ckbAutoTx.Checked = Properties.Settings.Default.ckbAutoTx;ckbTxWordWrap.Checked = Properties.Settings.Default.ckbTxWordWrap;ckbTxUTF8.Checked = Properties.Settings.Default.ckbTxUTF8;txbTxAutoTime.Text = Properties.Settings.Default.txbTxAutoTime; }/// <summary> /// 保存參數 /// </summary> private void SaveParam() {Properties.Settings.Default.serialPortName = cmbSerialName.Text;Properties.Settings.Default.serialPortBaud = cmbBaudRate.Text;Properties.Settings.Default.serialPortParity = cmbParity.Text;Properties.Settings.Default.serialPortDataBits = cmbDataBits.Text;Properties.Settings.Default.serialPortStopBits = cmbStopBits.Text;Properties.Settings.Default.ckbStopDisPlay = ckbStopDisPlay.Checked;Properties.Settings.Default.ckbAutoClear = ckbAutoClear.Checked;Properties.Settings.Default.ckbRxHex = ckbRxHex.Checked;Properties.Settings.Default.ckbSaveRxFile = ckbSaveRxFile.Checked;Properties.Settings.Default.ckbTimeStamp = ckbTimeStamp.Checked;Properties.Settings.Default.ckbRxWordWrap = ckbRxWordWrap.Checked;Properties.Settings.Default.ckbRxUTF8 = ckbRxUTF8.Checked;Properties.Settings.Default.ckbAutoTx = ckbAutoTx.Checked;Properties.Settings.Default.ckbTxWordWrap = ckbTxWordWrap.Checked;Properties.Settings.Default.ckbTxUTF8 = ckbTxUTF8.Checked;Properties.Settings.Default.txbTxAutoTime = txbTxAutoTime.Text;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]; }

    窗口拖拽

    • 開啟控件拖拽
    • 添加事件
    /// <summary> /// 發送文本框 文件拖拽支持 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void txbTx_DragDrop(object sender, DragEventArgs e) {e.Effect = DragDropEffects.None;txbTx.Text = "";string path = ((string[])e.Data.GetData(DataFormats.FileDrop))[0];txbTx.Text = OpenFile(path); }/// <summary> /// 發送文本框 文件拖拽支持 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void txbTx_DragEnter(object sender, DragEventArgs e) {if (e.Data.GetDataPresent(DataFormats.FileDrop)){string[] path = (string[])e.Data.GetData(DataFormats.FileDrop);if(path.Length == 1 && path[0].Contains(".")){//改變鼠標樣式e.Effect = DragDropEffects.Copy;}else{e.Effect = DragDropEffects.None;} } }

    源碼 https://github.com/mian2018/CSharp_COM

    總結

    以上是生活随笔為你收集整理的C# 学习笔记(13)自己的串口助手的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 懂色av一区二区夜夜嗨 | 欧洲久久久久久 | 欧美国产精品一区 | 东北高大丰满bbbbzbbb | 中文字幕日产乱码中 | 久久亚洲成人 | 免费在线观看成年人视频 | 在线黄视频| 在线免费观看视频黄 | 精品白浆 | 亚洲蜜桃精久久久久久久久久久久 | 国产91精品久久久久久久 | 日韩视频在线一区二区 | 草久免费视频 | 国产精品视频久久久久久 | 国产精品一区二区自拍 | 久久久亚洲精品视频 | 午夜影院0606 | 天天躁日日躁aaaxxⅹ | 野花视频在线免费观看 | 69er小视频 | 欧美激情精品久久久久久变态 | 91精品国产综合久久精品 | 亚洲色图35p | 杨幂一区二区国产精品 | 99久久精品免费看国产四区 | 国产欧美日韩精品在线观看 | 成人福利在线看 | 一区二区在线观看免费视频 | 男人天堂综合 | 成人黄色免费网 | 日韩免费视频 | 在线免费中文字幕 | 一区二区三区在线观看免费 | 国产一线天粉嫩馒头极品av | 国产午夜无码精品免费看奶水 | 日韩精品在线视频免费观看 | 调教91| 99视频在线免费 | 中文字幕 自拍 | 自拍偷拍中文字幕 | www.伊人 | 国产视频aaa | 日韩免费福利视频 | 日本特黄色片 | 国产日韩中文字幕 | 久久久久一区二区精码av少妇 | 亚洲精品国产精品乱码在线观看 | 精品免费一区二区 | 红桃视频黄色 | 国产精品国产三级国产专区52 | 成人www.| 久久成人久久爱 | 久久噜| 狠狠夜夜 | a国产在线 | 波多野结衣电车 | 青青草逼| 风流少妇 | 国产日日日 | 国产又黄又 | 欧美日韩国产电影 | 久久影院一区二区 | 亚洲一区二区成人 | 五十路妻| 久久久亚洲一区 | 十八禁一区二区三区 | 毛片你懂的 | 亚洲日本视频在线观看 | 午夜婷婷| 成人精品国产 | 亚洲中文字幕一区在线 | 污视频91| 欧美xx在线 | 啪啪影音| 久草97| 中文精品久久久久人妻不卡 | 国产黄a三级三级三级看三级男男 | 最新国产拍偷乱偷精品 | 欧美爱爱网站 | 中文字幕av在线播放 | 91色啪 | 动漫av一区二区 | 亚洲精选国产 | 成人福利av | 青青草原综合网 | 亚洲七区 | 国产日日日 | 伦乱天堂 | 美女网站黄频 | 亚洲一区在线免费观看 | 欧美一区二区视频在线 | 69精品一区二区三区 | 国产精品电影网站 | 国产资源一区 | 秘密基地在线观看完整版免费 | 夫妻性生活自拍 | 欧美日本在线视频 | 牛夜精品久久久久久久99黑人 |