C# 实战串口助手完成! ----------------------------不竭余力,方能成长!-----------WHAPPY
源码:我会分享开源平台,可以艾特me!(2025/3/5)时间紧张任务中!
完善功能

代码展示:
DTR功能
private void DTR_chb_CheckedChanged(object sender, EventArgs e)
{
if (DTR_chb.CheckState == CheckState.Checked)
{
serialPort1.DtrEnable = true;
}
else
{
serialPort1.DtrEnable = false;
}
}
RTS功能
private void RTS_chb_CheckedChanged(object sender, EventArgs e)
{
if (RTS_chb.CheckState == CheckState.Checked)
{
serialPort1.RtsEnable = true;
}
else
{
serialPort1.RtsEnable = false;
}
}
状态
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (isRxShow == false) return;
// 1,需要读取有效的数据 BytesToRead
byte[] dataTemp = new byte[serialPort1.BytesToRead];
serialPort1.Read(dataTemp, 0, dataTemp.Length);
reciveBuffer.AddRange(dataTemp);
reciveCount += dataTemp.Length;
this.Invoke(new EventHandler(delegate
{
// 显示接收数据的长度
Receive_count_tssl.Text = reciveCount.ToString();
if (startData_chb.Checked == false)
{
if (!Receive_Hex_chb.Checked)
{
// 2, 编码格式的选择
string str = Encoding.GetEncoding("gb2312").GetString(dataTemp);
// 3,0x00 -> \0 结束 不会显示
str = str.Replace("\0", "\\0");
Receive_rtb.AppendText(str);
// recive_rtb.AppendText(Encoding.GetEncoding("gb2312").GetString(dataTemp).Replace("\0", "\\0"));
}
else
{
// 十六进制是选中的状态下
Receive_rtb.AppendText(Transform.ToHexString(dataTemp, " "));
}
}
else
{
// 解析数据 queue
foreach (byte item in dataTemp)
{
// 入列
bufferQueue.Enqueue(item);
}
// 解析获取帧头
if (isHeadRecive == false)
{
foreach (byte item in bufferQueue.ToArray())
{
if (item != 0x7f)
{
// 出列
bufferQueue.Dequeue();
Console.WriteLine("not 0x7f, Dequeue !!");
}
else
{
// get 0x7f from bufferQueue
isHeadRecive = true;
Console.WriteLine("0x7f is recived !!");
break;
}
}
}
if (isHeadRecive == true)
{
// 判断有数据帧长度
if (bufferQueue.Count >= 2)
{
Console.WriteLine(DateTime.Now.ToLongTimeString());
Console.WriteLine($"show the data in bufferQueue{Transform.ToHexString(bufferQueue.ToArray())}");
Console.WriteLine($"frame lenth ={String.Format("{0:X2}", bufferQueue.ToArray()[1])}");
frameLenth = bufferQueue.ToArray()[1];
// 一帧完整的数据长度判断,不代表数据是正确的
if (bufferQueue.Count >= 1 + 1 + frameLenth + 2)
{
byte[] frameBuffer = new byte[1 + 1 + frameLenth + 2];
Array.Copy(bufferQueue.ToArray(), 0, frameBuffer, 0, frameBuffer.Length);
if (crc_chech(frameBuffer))
{
Console.WriteLine("frame is check ok,pick it");
data_txb.Text = Transform.ToHexString(frameBuffer);
data1_txb.Text = String.Format("{0:X2}", frameBuffer[2]);
data2_txb.Text = String.Format("{0:X2}", frameBuffer[3]);
data3_txb.Text = String.Format("{0:X2}", frameBuffer[4]);
data4_txb.Text = String.Format("{0:X2}", frameBuffer[5]);
}
else
{
// 无效数据
Console.WriteLine("bad frame, drop it");
}
for (int i = 0; i < 1 + 1 + frameLenth + 2; i++)
{
bufferQueue.Dequeue();
}
isHeadRecive = false;
}
}
//接续接收数据
}
}
}));
}
清空计数
private void Clear_count_tssl_Click(object sender, EventArgs e)
{
// 清空发送区
sendBuffer.Clear();
sendCount = 0;
Send_count_tssl.Text = "0";
// 清空接收区
reciveBuffer.Clear();
Receive_rtb.Text = "";
Receive_count_tssl.Text = "0";
}
选择路径
private void Select_path_btn_Click(object sender, EventArgs e)
{
FolderBrowserDialog fbDialog = new FolderBrowserDialog();
if (fbDialog.ShowDialog() == DialogResult.OK)
{
Receive_Text_tbx.Text = fbDialog.SelectedPath;
}
}
保存数据
private void Save_data_btn_Click(object sender, EventArgs e)
{
if (Receive_rtb.Text == "")
{
return;
}
string fileName = Receive_Text_tbx.Text + "\\" + DateTime.Now.ToString("yyyyMMddhhmmss") + ".txt";
StreamWriter sw = new StreamWriter(fileName);
sw.Write(Receive_rtb.Text);
sw.Flush();
sw.Close();
MessageBox.Show("保存成功!");
}
打开文件
private void Open_File_btn_Click(object sender, EventArgs e)
{
OpenFileDialog ofDialog = new OpenFileDialog();
ofDialog.Title = "请选择文件";
ofDialog.Filter = "文本文件(*.txt)|*.txt";
ofDialog.RestoreDirectory = true;
if (ofDialog.ShowDialog() == DialogResult.OK)
{
string fileName = ofDialog.FileName;
// string select
Send_File_btn.Text = fileName;
StreamReader sr = new StreamReader(fileName, Encoding.GetEncoding("gb2312"));
strRead = sr.ReadToEnd();
Send_rtb.Text = strRead;
sr.Close();
}
}
发送文件
private void Send_File_btn_Click(object sender, EventArgs e)
{
if (strRead == "")
{
MessageBox.Show("请先选择文件!");
return;
}
try
{
byte[] data = Encoding.GetEncoding("gb2312").GetBytes(strRead);
sendCount += data.Length;
Send_count_tssl.Text = sendCount.ToString();
int pagenum = data.Length / 4096;
int remaind = data.Length % 4096;
for (int i = 0; i < pagenum; i++)
{
serialPort1.Write(data, (i * 4096), 4096);
Thread.Sleep(10);
}
if (remaind > 0)
{
serialPort1.Write(data, (pagenum * 4096), remaind);
}
}
catch (Exception ex)
{
MessageBox.Show("发送数据失败" + ex.Message.ToString(), "错误");
}
}
展示效果

完结! 源码已经开源!!!!!!!