C.Net串口工具源碼 串口調試工具 支持16進位發送 可以定時自動發送

来源:https://www.cnblogs.com/chengchenxu/archive/2018/03/17/8591718.html
-Advertisement-
Play Games

軟體功能: 使用C#實現PC串口通訊 支持定時發送 支持16進位(hex) ASCII UTF-8 Unicode 四種編碼格式 支持配置文件的保存和讀取 可以可以顯示發送歷史 可以統計總的發送位元組數和接受位元組數 軟體界面: C#源碼: using System; using System.Coll ...


軟體功能:

 

使用C#實現PC串口通訊

支持定時發送

支持16進位(hex) ASCII UTF-8 Unicode 四種編碼格式

支持配置文件的保存和讀取

可以可以顯示發送歷史

可以統計總的發送位元組數和接受位元組數

軟體界面:

 

Screen Shot 2018-03-17 at 17.47.04 PM.png

 

C#源碼:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.IO.Ports;
using System.Threading;
using System.IO;
using System.Xml.Serialization;
 
namespace 串口調試工具
{
    public partial class Form1 : Form
    {
        private SerialPort sp = new SerialPort();//鏈接對象
        Config config = new Config();//配置文件
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            //獲取串口列表
            string[] comList = SerialPort.GetPortNames();
            if (comList.Length == 0)
            {
                MessageBox.Show("無可用串口");
                return;
            }
            foreach (var com in comList)
            {
                cmbComList.Items.Add(com);
            }
 
 
            //添加波特率
            int[] baudRate = { 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 43000, 56000, 57600, 115200 };
            foreach (var br in baudRate)
            {
                cmbBautRade.Items.Add(br);
            }
 
            //添加數據位
            int[] dataBits = { 8, 7, 6, 5 };
            foreach (var db in dataBits)
            {
                cmbDataBits.Items.Add(db);
            }
 
            //添加停止位
            int[] stopBits = { 1, 2, 3 };
            foreach (var sb in stopBits)
            {
                cmbStopBits.Items.Add(sb);
            }
 
            //添加檢驗方式
            string[] parity = { "None", "Even", "Mark", "Odd", "Space" };
            foreach (var p in parity)
            {
                cmbParity.Items.Add(p);
            }
 
            //添加常用編碼
            string[] encode = { "ASCII","UTF-8","Unicode","Hex"};
            foreach (var en in encode)
            {
                cmbEncodeSend.Items.Add(en);
                cmbEncodeRec.Items.Add(en);
            }
 
            //載入配置文件
            LoadConfig();
        }
 
        private void LoadConfig()
        {
            //把配置信息賦值給控制項預設值
            cmbComList.SelectedItem = config.PortName;
            if (cmbComList.SelectedIndex == -1) cmbComList.SelectedIndex = 0;
            cmbBautRade.SelectedItem = config.BautRade;
            cmbDataBits.SelectedItem = config.DataBits;
            cmbStopBits.SelectedItem = config.StopBits;
            cmbParity.SelectedItem = config.Parity;
            cmbEncodeRec.SelectedItem = config.EncodeRec;
            cmbEncodeSend.SelectedItem = config.EncodeSend;
 
            //激活打開按鈕
            this.btnOpen.Enabled = true;
        }
 
        private void btnOpen_Click(object sender, EventArgs e)
        {
            if (((Button)sender).Text == "打開串口")
            {
                //賦值給串口
                sp.PortName = cmbComList.SelectedItem.ToString();
                sp.Parity=(Parity)Enum.Parse(typeof(Parity),cmbParity.SelectedItem.ToString());
                sp.BaudRate = Convert.ToInt32(cmbBautRade.SelectedItem.ToString());
                sp.StopBits = (StopBits)Convert.ToInt32(cmbStopBits.SelectedItem.ToString());
                sp.DataBits = Convert.ToInt32(cmbDataBits.SelectedItem.ToString());
 
                try
                {
                    sp.Open();
 
                    //修改控制項狀態
                    this.btnOpen.Text = "關閉串口";
                    foreach (Control ctr in groupBox1.Controls)
                    {
                        //把下拉框全部禁用
                        ctr.Enabled = false;
                    }
 
                    //開啟新線程,監聽收取內容
                    Thread thread = new Thread(receive);
                    thread.Start();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
            else
            {
                if (this.btnAutoSend.Text == "停止發送")
                {
                    MessageBox.Show("當前定時發送中,請先停止定時發送任務.");
                    return;
                } 
                sp.Close();
 
                //修改控制項狀態
                this.btnOpen.Text = "打開串口";
                foreach (Control ctr in this.groupBox1.Controls)
                {
                    ctr.Enabled = true;
                }
            }
        }
 
        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            //窗體關閉時關閉埠
            sp.Close();
        }
 
        private void btnSend_Click(object sender, EventArgs e)
        {
            Send();
        }
 
        private void btnAutoSend_Click(object sender, EventArgs e)
        {
            if (this.btnAutoSend.Text == "定時發送")
            {
                //根據打開按鈕狀態初步檢查埠是否已經打開
                if (this.btnOpen.Text == "打開串口") return;
 
                System.Text.RegularExpressions.Regex reg1 = new System.Text.RegularExpressions.Regex(@"^[0-9]\d*$");
                if (reg1.IsMatch(txtTime.Text.ToString()))
                {
                    //激活Timer定時器
                    this.timer1.Interval = Convert.ToInt32(txtTime.Text.ToString());
                    this.timer1.Start();
 
                    //修改控制項狀態
                    this.btnAutoSend.Text = "停止發送";
                    this.btnSend.Enabled = false;
 
                }
                else
                {
                    MessageBox.Show("發送間隔應為正整數");
                    txtTime.Text = "1000";
                }
            }
            else
            {
                this.btnAutoSend.Text = "定時發送";
                this.btnSend.Enabled = true;
                this.timer1.Stop();
            }
        }
 
        private void Send()
        {
            if (sp.IsOpen)
            {
                //獲取位元組
                byte[] buffer = Encode();
                if (buffer.Length == 0) return;
 
                try
                {
                    sp.Write(buffer, 0, buffer.Length);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
 
                //添加發送歷史
                this.txtHistory.AppendText(string.Format("[{0}] {1} \r\n", DateTime.Now.ToString("HH:mm:ss.ff"), txtSend.Text));
                //統計發送位元組
                this.labSendCount.Text = (Convert.ToInt32(labSendCount.Text) + buffer.Length).ToString();
            }
            else
            {
                this.timer1.Stop();
                MessageBox.Show("串口尚未打開");
                this.btnAutoSend.Text = "定時發送";
            }
        }
 
        private void timer1_Tick(object sender, EventArgs e)
        {
            //定時發送
            Send();
        }
 
        //位元組反編碼
        private byte[] Encode()
        {
            byte[] buffer = null;
 
            switch (this.cmbEncodeSend.SelectedItem.ToString())
            {
                case "Unicode":
                    buffer = Encoding.Unicode.GetBytes(txtSend.Text); 
                    break;
                case "UTF-8":
                    buffer = Encoding.UTF8.GetBytes(txtSend.Text);
                    break;
                case "ASCII":
                    buffer = Encoding.ASCII.GetBytes(txtSend.Text);
                    break;
                case "Hex":
                    buffer = strToToHexByte(txtSend.Text);
                    break;
            }
 
            return buffer;
        }
        //編碼
        private string UnEncode(byte[] buffer)
        {
            string str = string.Empty;
 
            switch (this.cmbEncodeSend.SelectedItem.ToString())
            {
                case "Unicode":
                    str = new UnicodeEncoding().GetString(buffer);
                    break;
                case "UTF-8":
                    str = new UTF8Encoding().GetString(buffer);
                    break;
                case "ASCII":
                    str = new ASCIIEncoding().GetString(buffer);
                    break;
                case "Hex":
                    str = byteToHexStr(buffer);
                    break;
            }
 
            return str;
        }
        /// <summary>
        /// 位元組數組轉16進位字元串
        /// </summary>
        /// <param name="bytes"></param>
        /// <returns></returns>
        public static string byteToHexStr(byte[] bytes)
        {
            string returnStr = "";
            if (bytes != null)
            {
                for (int i = 0; i < bytes.Length; i++)
                {
                    returnStr += bytes[i].ToString("X2");
                }
            }
            return returnStr;
        }
        /// <summary>
        /// 字元串轉16進位位元組數組
        /// </summary>
        /// <param name="hexString"></param>
        /// <returns></returns>
        private static byte[] strToToHexByte(string hexString)
        {
            hexString = hexString.Replace(" ", "");
            if ((hexString.Length % 2) != 0)
                hexString += " ";
            byte[] returnBytes = new byte[hexString.Length / 2];
            for (int i = 0; i < returnBytes.Length; i++)
                returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
            return returnBytes;
        }
 
        private void receive()
        {
            //接收信息 先判斷是否為打開狀態
            while (sp.IsOpen)
            {
                if (sp.BytesToRead == 0) continue;
 
                //準備接收
                byte[] buffer = new byte[sp.BytesToRead];
                try
                {
                    //接受動作
                    sp.Read(buffer, 0, buffer.Length);
 
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
 
                //更新UI信息
                this.Invoke((Action)delegate
                {
                    this.txtRec.AppendText(UnEncode(buffer));
                    //是否自動換行
                    if(cbLine.Checked)
                        this.txtRec.AppendText("\r\n");
 
                    //接收統計信息
                    this.labRecCount.Text = (Convert.ToInt32(this.labRecCount.Text) + buffer.Length).ToString();
                });
            }
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            //清空發送歷史
            this.txtHistory.Clear();
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            //清空接收
            this.txtRec.Clear();
        }
 
        private void btnLoad_Click(object sender, EventArgs e)
        {
            //讀取xml文件 序列化對象
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "XML(*.xml)|";
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                string filePath = ofd.FileName;
                if (File.Exists(filePath))
                {
                    try
                    {
                        var mySerializer = new XmlSerializer(typeof(Config));
                        using (var sr = new StreamReader(new FileStream(filePath, FileMode.Open, FileAccess.Read)))
                        {
                            config = (Config)mySerializer.Deserialize(sr);
                        }
                        LoadConfig();
                    }
                    catch (Exception ee)
                    {
                        MessageBox.Show(ee.Message);
                    }
                }
                else
                {
                    MessageBox.Show("文件不存在");
                }
            }
        }
 
        private void btnSave_Click(object sender, EventArgs e)
        {
 
            FolderBrowserDialog fbd = new FolderBrowserDialog();            
            if (fbd.ShowDialog() == DialogResult.OK)
            {
                //給對象賦值並序列化保存
                config.PortName = cmbComList.SelectedItem.ToString();
                config.Parity = cmbParity.SelectedItem.ToString();
                config.BautRade = Convert.ToInt32(cmbBautRade.SelectedItem.ToString());
                config.StopBits = Convert.ToInt32(cmbStopBits.SelectedItem.ToString());
                config.DataBits = Convert.ToInt32(cmbDataBits.SelectedItem.ToString());
 
                XmlSerializer xmlFormat=new XmlSerializer(typeof(Config));
                string filePath = fbd.SelectedPath + "\\PortConfig.xml";
                using (Stream stream = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None))
                {
                    xmlFormat.Serialize(stream, config);
                }
                MessageBox.Show("成功保存到路徑:"+filePath);
            }
        }
 
        private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            System.Diagnostics.Process.Start("http://www.chengchenxu.com");  
        }
    }
}

 

 

軟體下載:

串口調試工具.rar

 

源碼工程文件:

串口調試工具.rar

 

虛擬埠軟體下載:

VirtualSerialPortDriver.rar

 

未實現的功能:

16進位校驗功能,即發送16進位格式的時候檢查輸入值是否為正確的16進位數字

接受文件的完整性校驗功能,有時候一條信息會分兩次接受完整

 

本文為博主原創,轉載請保留出處:
http://www.chengchenxu.com/Article/30/


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、導入方式:import time 二、時間戳的概念:指格林威治時間1970年01月01日00時00分00秒(北京時間1970年01月01日08時00分00秒)起至現在的總秒數。 三、常用函數: 1.time.loclatime([secs]) #返回時間元祖: print(time.loclat ...
  • 1. Django安裝 2. 創建項目 如需要中文,可以修改django支持中文環境,編輯settings.py文件,設定內容如下: 3. 配置資料庫 Django預設採用sqllite3資料庫作為數據持久存儲,實際工作中一般使用MySQL作為結構化數據存儲,在python2中使用python-My ...
  • //凱魯嘎吉 - 博客園 http://www.cnblogs.com/kailugaji/ 程式運行前的當前目錄: 程式運行結果: 當前目錄多了一個文件wrr.txt 打開該文件: 裡面已經有了剛剛輸入的內容: Hello world!I am RONGRONG WANG!My English n ...
  • Pandas用於數據處理: 使用示例: 1. 2.排序(預設升序) 3. ...
  • 說在前面:1.學習緣由及學習途徑: 在學了Python,c#(自認為未精通)之後,我決定學一下C++。 於是去網上找視頻教程,發現都不適合我這種有一定基礎的自學者,要麼是不完整的高級教程,要麼是零基礎的浪費時間。 於是向摯友購入一本二手《C++ primer plus》,在空餘時間翻一翻,自學。 2 ...
  • 前言 本博文主要講解的知識點如下: 校驗器 統一處理異常 RESTful 攔截器 Validation 在我們的Struts2中,我們是繼承ActionSupport來實現校驗的...它有兩種方式來實現校驗的功能 手寫代碼 XML配置 這兩種方式也是可以特定處理方法或者整個Action的 而Spri ...
  • //凱魯嘎吉 - 博客園 http://www.cnblogs.com/kailugaji/ 漢諾塔是由三根桿子A,B,C組成的。A桿上有n個(n>1)穿孔圓盤,盤的尺寸由下到上依次變小。要求按下列規則將所有圓盤移至C桿:每次只能移動一個圓盤;大盤不能疊在小盤上面。提示:可將圓盤臨時置於B桿,也可將 ...
  • 今天我們一起來看一下WPF窗體之間的交互-窗體之間的傳值。有兩個窗體,一個是父窗體,一個是子窗體。要將父窗體的文本框中的值傳遞給子窗體中的控制項。我們該怎麼實現? 接下來我們一起來實現窗體之間的傳值,在父窗體上我們放兩個控制項,一個文本框TxtMessage,另一個是按鈕BtnSend.子窗體上放一個文 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...