第八节:基于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(), "错误");
      }
  }

展示效果

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

相关推荐
Python ml5 分钟前
Tomcat与纯 Java Socket 实现远程通信的区别
java·开发语言·tomcat
说码解字10 分钟前
ExoPlayer 如何实现音画同步
开发语言·学习·音视频
冼紫菜18 分钟前
如何在 CentOS 7 虚拟机上配置静态 IP 地址并保持重启后 SSH 连接
linux·开发语言·centos·ssh
陈奕昆27 分钟前
五、【LLaMA-Factory实战】模型部署与监控:从实验室到生产的全链路实践
开发语言·人工智能·python·llama·大模型微调
明月看潮生39 分钟前
青少年编程与数学 02-019 Rust 编程基础 10课题、函数、闭包和迭代器
开发语言·青少年编程·rust·编程与数学
明月看潮生42 分钟前
青少年编程与数学 02-019 Rust 编程基础 09课题、流程控制
开发语言·算法·青少年编程·rust·编程与数学
程序猿小三1 小时前
python uv的了解与使用
开发语言·python·uv
纯纯沙口1 小时前
Qt—多线程基础
开发语言·qt
yxc_inspire1 小时前
基于Qt的app开发第八天
开发语言·c++·qt
廖圣平1 小时前
美团核销 第三方接口供应商 (含接口文档)
开发语言·数据库·php