用C#写个串口助手

以下是用C#写的串口助手。该程序使用了Windows Forms和System.IO.Ports命名空间。

using System;
using System.IO.Ports;
using System.Windows.Forms;

namespace SerialAssistant {
    public partial class MainForm : Form {
        private SerialPort serialPort;

        public MainForm() {
            InitializeComponent();
            serialPort = new SerialPort();
        }

        private void MainForm_Load(object sender, EventArgs e) {
            baudRateComboBox.Items.AddRange(new object[] { "9600", "19200", "38400", "57600", "115200" });
            parityComboBox.Items.AddRange(Enum.GetNames(typeof(Parity)));
            dataBitsComboBox.Items.AddRange(new object[] { "5", "6", "7", "8" });
            stopBitsComboBox.Items.AddRange(Enum.GetNames(typeof(StopBits)));

            portNameComboBox.Items.AddRange(SerialPort.GetPortNames());
            if (portNameComboBox.Items.Count > 0) {
                portNameComboBox.SelectedIndex = 0;
            }
        }

        private void refreshButton_Click(object sender, EventArgs e) {
            portNameComboBox.Items.Clear();
            portNameComboBox.Items.AddRange(SerialPort.GetPortNames());
            if (portNameComboBox.Items.Count > 0) {
                portNameComboBox.SelectedIndex = 0;
            }
        }

        private void connectButton_Click(object sender, EventArgs e) {
            if (!serialPort.IsOpen) {
                try {
                    serialPort.PortName = portNameComboBox.SelectedItem.ToString();
                    serialPort.BaudRate = int.Parse(baudRateComboBox.SelectedItem.ToString());
                    serialPort.Parity = (Parity)Enum.Parse(typeof(Parity), parityComboBox.SelectedItem.ToString());
                    serialPort.DataBits = int.Parse(dataBitsComboBox.SelectedItem.ToString());
                    serialPort.StopBits = (StopBits)Enum.Parse(typeof(StopBits), stopBitsComboBox.SelectedItem.ToString());
                    serialPort.Open();
                    connectButton.Text = "断开";
                    sendButton.Enabled = true;
                } catch (Exception ex) {
                    MessageBox.Show(ex.Message);
                }
            } else {
                serialPort.Close();
                connectButton.Text = "连接";
                sendButton.Enabled = false;
            }
        }

        private void sendButton_Click(object sender, EventArgs e) {
            string text = sendTextBox.Text.Trim();
            if (!string.IsNullOrEmpty(text)) {
                try {
                    serialPort.WriteLine(text);
                    sendTextBox.Clear();
                } catch (Exception ex) {
                    MessageBox.Show(ex.Message);
                }
            }
        }

        private void MainForm_FormClosing(object sender, FormClosingEventArgs e) {
            if (serialPort.IsOpen) {
                serialPort.Close();
            }
        }

        private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) {
            string text = serialPort.ReadLine();
            this.Invoke(new Action(() => {
                receiveTextBox.AppendText(text);
            }));
        }
    }
}

在上面的代码中,我们创建了一个名为MainForm的Windows窗体,并在其中添加了以下控件:

  • 一个ComboBox控件用于选择串口号。

  • 一个ComboBox控件用于选择波特率。

  • 一个ComboBox控件用于选择奇偶校验位。

  • 一个ComboBox控件用于选择数据位。

  • 一个ComboBox控件用于选择停止位。

  • 一个Button控件用于刷新可用串口列表。

  • 一个Button控件用于连接/断开串口。

  • 一个TextBox控件用于输入要发送的数据。

  • 一个Button控件用于发送数据。

  • 一个TextBox控件用于显示接收到的数据。

在窗体加载时,我们将可用的波特率、奇偶校验位、数据位和停止位添加到相应的ComboBox控件中,并将可用的串口号添加到portNameComboBox控件中。如果有可用的串口,则默认选中第一个串口。

在连接按钮的Click事件处理程序中,我们首先检查串口是否已经打开。如果串口未打开,则使用选择的端口名称、波特率、奇偶校验位、数据位和停止位打开串口。如果串口已经打开,则关闭串口。

在发送按钮的Click事件处理程序中,我们从sendTextBox控件中获取要发送的文本。如果文本不为空,则向串口写入该文本,并清空sendTextBox控件。

在窗体关闭时,如果串口已经打开,则关闭串口。

最后,在serialPort_DataReceived事件处理程序中,我们从串口读取数据并将其追加到receiveTextBox控件中。由于该事件可能会在不同的线程上触发,因此我们需要在UI线程上执行操作,以避免跨线程访问错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值