当前位置: 首页 > news >正文

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

展示效果

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

相关文章:

  • HTML 属性(详细易懂)
  • Manus全球首个通用Agent,Manus AI:Agent应用的ChatGPT时刻
  • Wpf-ReactiveUI-Usercontrol与主界面交互
  • 大语言模型学习--向量数据库基础知识
  • 本地运行Manus的替代方案:OpenManus的技术解析与实践指南
  • 【入门级篇】Dify安装+DeepSeek模型配置保姆级教程
  • 避免魔法值和多层if的关键:编程范式和设计模式
  • 关于优化B站关键词排名策略
  • FPGA学习篇——Verilog学习3(关键字+注释方法+程序基本框架)
  • VC++ 获取目的IP的路由
  • python导入语句的几点说明
  • OpenCV计算摄影学(14)实现对比度保留去色(Contrast Preserving Decolorization)的函数decolor()
  • TypeError: Cannot create property ‘xxx‘ on string ‘xxx‘
  • HTTP 与 HTTPS 协议:从基础到安全强化
  • C语言学习知识点总结(适合新手/考试复习)
  • 项目--高并发CPP内存池,低配版本
  • 【人工智能】Deepseek 与 Kimi 联袂:重塑 PPT 创作,开启智能演示新纪元
  • springBoot集成声明式和编程式事务的方式
  • Python基于Django的图书馆管理系统【附源码、文档说明】
  • RangeError: Invalid array length
  • 合肥外贸网站建设/推广赚钱的平台有哪些
  • 城阳网站建设电话/商业软文
  • b2b网站有那些/百度小程序对网站seo
  • 如何做视频网站旗下账号/深圳外贸seo
  • 天元建设集团有限公司标志源文件/网站搜索优化技巧
  • 网站模板带后台/百度客服平台