第八节:基于Winform框架的串口助手小项目---完结优化《C#编程》

C# 实战串口助手完成! ----------------------------不竭余力,方能成长!-----------WHAPPY

源码:我会分享开源平台,可以艾特me!(2025/3/5)时间紧张任务中!

文章上所说的串口助手,工程文件资源-CSDN文库

完善功能

代码展示:

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(), "错误");
      }
  }

展示效果

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

相关推荐
Pocker_Spades_A1 分钟前
Python刷题:Python基础
开发语言·python
放氮气的蜗牛32 分钟前
C++从入门到精通系列教程之第十篇:异常处理与调试技巧
开发语言·jvm·c++
q567315231 小时前
用Go的resty库批量下载公开网站视频
开发语言·golang·音视频
Y雨何时停T1 小时前
深入理解 Java 虚拟机之垃圾收集
java·开发语言
愚润求学1 小时前
从零开始学C语言文件操作:理论与代码详解
c语言·开发语言·文件操作·语法
hamburgerDaddy11 小时前
golang 从零单排 (一) 安装环境
开发语言·后端·golang
caoruipeng1 小时前
Windows编程----进程的当前目录
c++·windows·c#
小画家~1 小时前
第本章:go 切片
开发语言·后端·golang
小画家~1 小时前
第五章:go 的数据类型 及go语言拼接字符串有哪些方式
开发语言·后端·golang
Luis Li 的猫猫2 小时前
基于Matlab的人脸识别的二维PCA
开发语言·人工智能·算法·matlab