C#实现简单串口通信助手

建立好一个form后,选择工具箱,在组件所属里找到SerialPort:
这里写图片描述
拖拽一个即可。

这时可以看到属性栏:
这里写图片描述
可以查看修改默认属性值。

这时就可以通过控件设计我们的界面啦:
这里写图片描述
我这里设计的很简单,包括串口设置、接收数据、发送数据。串口设置参数,我只包含了两个,我们经常改动的COM口和波特率,其他都使用默认值。
波特率通常使用的有固定几种,我们将可能用到的写到波特率绑定的combobox的Items集合属性中即可:
这里写图片描述

在初始构造函数中加入:

public Form1()
        {
            InitializeComponent();
            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;//设置该属性 为false
        }

防止后面出现异常,会提示线程间操作无效: 从不是创建控件的线程访问它。

先实现串口的自动扫描识别:

//我们在form载入时,扫描识别存在的串口。

private void Form1_Load(object sender, EventArgs e)
        {
            RegistryKey keyCom = Registry.LocalMachine.OpenSubKey("Hardware\\DeviceMap\\SerialComm");
            if (keyCom != null)
            {
                string[] sSubKeys = keyCom.GetValueNames();
                cmbPort.Items.Clear();
                foreach (string sName in sSubKeys)
                {
                    string sValue = (string)keyCom.GetValue(sName);
                    cmbPort.Items.Add(sValue);
                }
                if (cmbPort.Items.Count > 0)
                    cmbPort.SelectedIndex = 0;
            }
                cmbBaud.Text = "115200";
        }

串口打开实现:

         bool isOpened = false;//串口状态标志
        private void button1_Click(object sender, EventArgs e)
        {
            if (!isOpened)
            {
                serialPort.PortName = cmbPort.Text;
                serialPort.BaudRate = Convert.ToInt32(cmbBaud.Text, 10);
                try
                {
                    serialPort.Open();     //打开串口
                    button1.Text = "关闭串口";
                    cmbPort.Enabled = false;//关闭使能
                    cmbBaud.Enabled = false;
                    isOpened = true;
                    serialPort.DataReceived += new SerialDataReceivedEventHandler(post_DataReceived);//串口接收处理函数
                }
                catch
                {
                    MessageBox.Show("串口打开失败!");
                }
            }
            else
            {
                try
                {
                    serialPort.Close();     //关闭串口
                    button1.Text = "打开串口";
                    cmbPort.Enabled = true;//打开使能
                    cmbBaud.Enabled = true;
                    isOpened = false;
                }
                catch
                {
                    MessageBox.Show("串口关闭失败!");
                }
            }

        }

接收处理函数:

private void post_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            string str = serialPort.ReadExisting();//字符串方式读
            ReceiveTbox.Text = "";//先清除上一次的数据
            ReceiveTbox.Text += str;
        }

因为我们之前在打开串口时,加载了串口接收处理函数,所以,每次串口有数据,会自动调用接收处理函数。

数据发送:

 private void button2_Click(object sender, EventArgs e)
        {
            //发送数据
            if (serialPort.IsOpen)
            {//如果串口开启
                if (SendTbox.Text.Trim() != "")//如果框内不为空则
                {
                    serialPort.Write(SendTbox.Text.Trim());//写数据
                }
                else
                {
                    MessageBox.Show("发送框没有数据");
                }
            }
            else
            {
                MessageBox.Show("串口未打开");
            }
        }

通过串口写,即可发出。

扫描二维码关注公众号,回复: 2297855 查看本文章

测试:
可以使用Configure Virtual Serial Port Driver来虚拟串口,模拟通信。
我直接使用了串口调试经常使用的TTL转USB,自发自收来真实测试:
这里写图片描述
扫描到了串口:
这里写图片描述
发送我们的最熟悉的hello world:
这里写图片描述

源码Github:https://github.com/yuace/CSharp–SerialPort

猜你喜欢

转载自blog.csdn.net/qq_29377279/article/details/81146081