作为一个有着伟大理想,崇高信念21青年,在我平时用着串口助手、计算器的时候。我总是寻思着,我能不能自己去实现做一个软件,能实现我日常想要做的功能,例如串口助手啦,图片助手啦,文件转换啦等等。

于是打算从0.5开始手搓一个大杂烩软件。

首先的工具我就想到了串口助手,那么本期我们就介绍如何使用C#制作串口助手。

相关库安装

首先,我们需要在NuGet包管理中,找到我们的关于端口的包

我们搜索这个包并且安装这个包,这样子我们就可以在C#中调用我们的端口类了。

页面布局

通常我们的串口助手最基本的数据接收和发送,打开和关闭串口以及选择端口设置波特率等等,所以我们需要若干个TextBox文本框,Label标签以及Button按钮来实现我们的基本功能最后还需要有一个下拉式的ComboBo来选择我们的串口

我们在左边的空间库中寻找我们需要的控件,放置到我们的设计器中。

基础编写


private void LoadAvailablePorts()
        {
            // 获取可用端口
            string[] ports = SerialPort.GetPortNames();

            // 将端口添加到ComboBox中
            COMChoose.Items.AddRange(ports);

            // 如果需要,默认选择第一个端口
            if (COMChoose.Items.Count > 0)
            {
                COMChoose.SelectedIndex = 0;
            }
        }

我们首先编写获取端口的代码,并且在FromLoad函数中调用这个代码,这样子我们就可以加载端口显示在下拉框中


CheckBit.SelectedIndex = 0;

我们在这些选项框中使用默认第一个数据。


private void Connect_Click(object sender, EventArgs e)
 {
        if (serialPort.IsOpen)
        {
        // 串口已经打开,关闭串口
        serialPort.Close();
        Connect.Text = "打开串口";
        // 启用控件
        COMChoose.Enabled = true;
        PortText.Enabled = true;
        DataBit.Enabled = true;
        StopBit.Enabled = true;
        CheckBit.Enabled = true;
      }
      else
      {
      // 串口未打开,尝试打开串口
      try
      {
      // 配置串口
      serialPort.PortName = COMChoose.SelectedItem.ToString();
      serialPort.BaudRate = int.Parse(PortText.Text); // 获取波特率
      serialPort.DataBits = int.Parse(DataBit.SelectedItem.ToString()); // 获取数据位

      // 设置停止位
      switch (StopBit.SelectedItem.ToString())
      {
      case "1":
             serialPort.StopBits = StopBits.One;
             break;
      case "1.5":
             serialPort.StopBits = StopBits.OnePointFive;
             break;
      case "2":
             serialPort.StopBits = StopBits.Two;
             break;
      default:
             serialPort.StopBits = StopBits.One;
             break;
     }

     // 设置校验位
     switch (CheckBit.SelectedItem.ToString())
     {
     case "None":
            serialPort.Parity = Parity.None;
            break;
     case "Odd":
            serialPort.Parity = Parity.Odd;
            break;
     case "Even":
            serialPort.Parity = Parity.Even;
            break;
      default:
            serialPort.Parity = Parity.None;
            break;
     }
     // 打开串口
     serialPort.Open();
     Connect.Text = "关闭串口";
     // 禁用控件
     COMChoose.Enabled = false;
     PortText.Enabled = false;
     DataBit.Enabled = false;
     StopBit.Enabled = false;
     CheckBit.Enabled = false;
     serialPort.DataReceived += DataReceivedHandler;
    }
    catch (Exception ex)
    {
       // 打开串口失败,显示错误消息
       MessageBox.Show("串口打开失败" + ex.Message);
    }
  }
}

我们在点击按钮的时候设置的代码是:点击按钮改变按钮的文本,并且配置按钮的各项数据,禁用/开启端口选择..等等的使用以及创建新的回调函数(DataReceivedHandler)在这个函数中编写我们收到的代码信息。


private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
  try
  {
  // 从串口读取数据
  string data = serialPort.ReadExisting();
  // 将数据追加到 Receive 文本框中
  UpdateReceiveTextBox(data);
  }
  catch (Exception ex)
  {
  MessageBox.Show("接收失败" + ex.Message);
  }
}

private void UpdateReceiveTextBox(string data)
{
  if (Receive.InvokeRequired)
  {
  // 如果不在 UI 线程上,通过 Invoke 在 UI 线程上更新文本框
  Receive.Invoke(new Action(UpdateReceiveTextBox), data);
  }
  else
  {
  // 在 UI 线程上更新文本框
  Receive.AppendText(data);
  }
}

 

我们在串口回调函数中简单的添加一些内容,我们将收到的串口打印到我们的TextBox上(UpdateReceiveTextBox这个函数也是我们自己定义的)作用是用来区分当前程序是不是在UI线程上,如果不在UI线程上,我们需要用另一种方式来更新我们的控件。

接收串口数据成功,我们也添加了时间戳的功能,用来为我们的代码接收添加时间。


 // 在 UI 线程上更新文本框
 if (TimeTik.Checked)
 {
  // 如果 TimeTik 被勾选,加上时间戳
  data = $"{DateTime.Now:HH:mm:ss} -> {data}";
 }
Receive.AppendText(data);

接着我们来编写发送部分的代码


private void TransBotton_Click(object sender, EventArgs e)
{
   try
   {
   // 获取要发送的文本
   string dataToSend = TransText.Text;
   // 判断是否勾选了 NewLine 复选框
         if (NewLine.Checked)
         {
         // 添加新行
         dataToSend += Environment.NewLine;  ‍‍       
  ‍ ‍ ‍‍‍‍‍     }‍‍‍ ‍   // 发送数据
    serialPort.Write(dataToSend);
    }
    catch (Exception ex)
    {
    MessageBox.Show("串口发送失败");
    }
}

其实这个东西运行起来还是有不少BUG的,需要我们不断的优化,感兴趣的朋友可以后台私信联系。

嘉立创PCB

还没有评论,抢个沙发!