當前位置: 妍妍網 > 碼農

基於.Net C# 通訊開發-串口偵錯助手

2024-02-08碼農

1、 概述

串口偵錯助手,廣泛套用於工控領域的數據監控、數據采集、數據分析等工作,可以幫助串口套用設計、開發、測試人員檢查所開發的串口套用軟硬體的數據收發狀況,提高開發的速度,成為您的串口套用的開發助手。
實全串口偵錯助手是綠色軟體,只有一個執行檔,適用於各版本Windows作業系統,基於C# .Net 4.0 框架開發。可以在一台PC上同時啟動多個串口偵錯助手(使用不同的COM口)。
典型套用場合:透過串口偵錯助手與自行開發的串口程式或者串口裝置進行通訊聯調。
支持多串口,自動監測列舉本地可用串口;自由設定串口號、波特率、校驗位、數據位和停止位等(支持自訂非標準波特率);
支持ASCII/Hex兩種模式的數據收發,發送和接收的數據可以UTF-8、16進制和AscII碼之間任意轉換;
支持間隔發送,迴圈發送,批次處理發送,輸入數據可以從外部檔匯入。

串口偵錯開發,一般分為讀取電腦連線串口資訊、選擇串口資訊進行連線、設定相關發送接收配置、發送命令或訊息,接收讀取返回結果。

2、串口開發主要程式碼

2.1、讀取電腦連線串口資訊

串口偵錯,首先需要程式讀取電腦連線串口資訊。

//讀取連線串口
string[] mPortNames = SerialPort.GetPortNames();
this.txtPortName.Items.Clear();
foreach (var item in mPortNames)
{
this.txtPortName.Items.Add(item);
}
this.txtParity.Items.Clear();
foreach (string item in Enum.GetNames(typeof(Parity)))
{
this.txtParity.Items.Add(item);
}
this.txtParity.DropDown> ComboBox style.DropDownList;
this.txtStopBits.Items.Clear();
foreach (string item in Enum.GetNames(typeof(StopBits)))
{
this.txtStopBits.Items.Add(item);
}
this.txtStopBits.DropDown> ComboBox style.DropDownList;
this.txtHandshake.Items.Clear();
foreach (string item in Enum.GetNames(typeof(Handshake)))
{
this.txtHandshake.Items.Add(item);
}
this.txtHandshake.DropDown style = ComboBox style.DropDownList;

2.2、選擇串口資訊進行連線

///<summary>
/// 獲取串口資訊
///</summary>
///<param name="setting"></param>
///<param name="fail"></param>
///<returns></returns>
publicstatic SerialPort GetSerialPort(SerialPortSet setting, outstring fail)
{
fail
= string.Empty;
try
{
_SerialPort
= new SerialPort();
_SerialPort.PortName
= setting.PortName;
_SerialPort.BaudRate
= setting.BaudRate.ToInt32();
_SerialPort.Parity
= (Parity)Enum.Parse(typeof(Parity), setting.Parity, true);
_SerialPort.DataBits
= setting.DataBits.ToInt32();
_SerialPort.StopBits
= (StopBits)Enum.Parse(typeof(StopBits), setting.StopBits, true);
_SerialPort.Handshake
= (Handshake)Enum.Parse(typeof(Handshake), setting.Handshake, true);return _SerialPort;
}
catch (Exception ex)
{
fail
= "開啟串口 異常:" + ex.Message;
returnnull;
}
}

2.3、選擇相關發送接收配置

支持UTF-8、ASCII、GB2312、16進制內容,收、發選擇;支持間隔發送,迴圈發送,批次處理發送,輸入數據可以從外部檔匯入。

2.4、發送命令或訊息

///<summary>
/// 發送命令或訊息
///</summary>
///<param name="content"></param>
privatevoid SendByte(string content)
{
try
{
if (this.ckbShowSend.Checked)
this.AppendText(content);byte[] buffer;
if (this.txtSendEncoding.Text.Length <= 0)
buffer
= Encoding.Default.GetBytes(this.txtContent.Text);
elseif (this.txtSendEncoding.Text == "16進制")
buffer
= this.HexToByte(this.txtContent.Text);
else
buffer
= Encoding.GetEncoding(this.txtSendEncoding.Text).GetBytes(this.txtContent.Text);
//向串口發送數據
this._SerialPort.Write(buffer, 0, buffer.Length);
}
catch (Exception ex)
{
WinMessageBox.Warning(
"發送失敗:" + ex.Message);
}
}

2.5、接收讀取返回結果

///<summary>
/// 接收讀取返回結果
///</summary>
///<param name="sender"></param>
///<param name="e"></param>
privatevoid SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] buffer = newbyte[this._SerialPort.ReadBufferSize];
int count = this._SerialPort.Read(buffer, 0, buffer.Length);
//string str = Encoding.Default.GetString(readBuffer).TrimEnd('\0');
if (this.txtEncoding.Text.Length <= 0)
this.AppendText(System.Text.Encoding.Default.GetString(buffer,0, count));
elseif (this.txtEncoding.Text == "16進制")
this.AppendText(this.ByteToHex(buffer,0,count));
else
this.AppendText(System.Text.Encoding.GetEncoding(this.txtEncoding.Text).GetString(buffer,0,count));
}

3、結語

至此介紹完畢,本計畫開源,源碼地址:https://gitee.com/ShiQuan25/SerialHelper

安裝包下載地址:https://gitee.com/ShiQuan25/SerialHelper/attach_files/1048876/download/ShiQuan.SerialHelper.zip

不當之處,歡迎指正!

作者:HengXiao

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連線。如有問題,可以信件:[email protected] QQ:896374871 聯系我,非常感謝。

https://www.cnblogs.com/henxiao25/p/16219156.html