Asistente de puerto serie de desarrollo C # (puede cambiar la velocidad en baudios, el número de puerto serie, puede realizar el envío y la recepción de datos y caracteres)

0. Prefacio

1. Realización del proyecto

1.1 Configurar el archivo Form1.cs [Diseño] (Diseñador)

En primer lugar, poner los siguientes Labelcontroles: ComboBox, RadioButton, Panel, Button, TextBox,,GroupBox
Inserte la descripción de la imagen aquí

Además, también debe agregar el control SerialPort.

1.1.1 El rol de agregar Panel

  • Panel es un contenedor de control La descripción oficial de la función del Panel es: Permite la agrupación de conjuntos de control.
  • En la figura anterior, use Panel para dividir los cuatro RadioButtons en dos grupos, de modo que se pueda realizar, en cada grupo solo se seleccionará un RadioButton.
  • Si el Panel no se utiliza para agrupar los cuatro RadioButtons, se seleccionará uno y solo uno de estos cuatro RadioButtons al mismo tiempo.

1.1.2 Agregar barra de desplazamiento a TextBox

El TextBox en estos dos lugares puede tener una gran cantidad de entrada o salida de datos.Cuando la cantidad de datos excede el rango visible, se necesita una barra de desplazamiento para expandir el rango de visualización.
Inserte la descripción de la imagen aquí
Haga clic en uno de los TextBoxes para agregar una barra de desplazamiento, y luego modifique ScrollBars en la barra de propiedades. Vertical significa agregar una barra de desplazamiento vertical, Horizontal significa agregar una barra de desplazamiento horizontal y Ambos significa agregar una barra de desplazamiento vertical y una barra de desplazamiento horizontal.
Inserte la descripción de la imagen aquí

1.1.3 Configurar comboBox_baud

Haga clic en el comboBox en la figura siguiente.
Inserte la descripción de la imagen aquí
Luego modifique la opción Elementos en su barra de propiedades:
Inserte la descripción de la imagen aquí

Rellene previamente la velocidad en baudios del conjunto.

Inserte la descripción de la imagen aquí

1.1.4 Circunstancias especiales

Si agrega un control, pero olvida el nombre del control, puede hacer clic en el control y obtenerlo del nombre en la barra de propiedades del control.
Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

1.2 Configurar el archivo Form1.cs

El código de Form1.cs es el siguiente

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;  //这个引用一定要加上

namespace SerialCommunicate
{
    
    
    public partial class Form1 : Form
    {
    
    
        public Form1()
        {
    
    
            InitializeComponent();
            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
    
    
            for (int i = 1; i < 20; i++)
            {
    
    
                comboBox_port.Items.Add("COM" + i.ToString()); //从1至19添加串口号
            }
            comboBox_port.Text = "COM1";//串口号多额默认值
            comboBox_baud.Text = "9600";//波特率默认值(其他波特率在属性的Items内添加)

            /*****************非常重要************************/

            serialPort1.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);//必须手动添加事件处理程序(接收串口数据)
        }

        private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)//串口数据接收事件
        {
    
    
            if (!radioButton_rxd_int.Checked)//如果接收模式为字符模式
            {
    
    
                string str = serialPort1.ReadExisting();//字符串方式读
                textBox_rxd.AppendText(str);//添加内容
            }
            else
            {
    
     //如果接收模式为数值接收
                byte data;
                data = (byte)serialPort1.ReadByte();//此处需要强制类型转换,将(int)类型数据转换为(byte类型数据,不必考虑是否会丢失数据
                string str = Convert.ToString(data, 16).ToUpper();//转换为大写十六进制字符串
                textBox_rxd.AppendText("0x" + (str.Length == 1 ? "0" + str : str) + " ");//空位补“0”   
                //上一句等同为:if(str.Length == 1)
                //                  str = "0" + str;
                //              else 
                //                  str = str;
                //              textBox_rxd.AppendText("0x" + str);
            }
        }
        private void button_open_port_Click(object sender, EventArgs e)
        {
    
    
            try
            {
    
    
                serialPort1.PortName = comboBox_port.Text;
                serialPort1.BaudRate = Convert.ToInt32(comboBox_baud.Text, 10);//十进制数据转换(波特率是字符型的,需要转换为十进制整形)
                serialPort1.Open();
                button_open_port.Enabled = false;//打开串口按钮不可用(“打开串口”按钮在刚打开软件时应该是可用的,需要将设计器内button_open_port属性中的Enabled设置为True)
                button_close_port.Enabled = true;//关闭串口(“关闭串口”按钮在刚打开软件时应该是不可用的,需要将设计器内button_close_port属性中的Enabled设置为False)
            }
            catch
            {
    
    
                MessageBox.Show("端口错误,请检查串口", "错误");
            }
        }

        private void button_close_port_Click(object sender, EventArgs e)
        {
    
    
            try
            {
    
    
                serialPort1.Close();//关闭串口
                button_open_port.Enabled = true;//打开串口按钮可用
                button_close_port.Enabled = false;//关闭串口按钮不可用
            }
            catch (Exception err)//一般情况下关闭串口不会出错,所以不需要加处理程序
            {
    
    

            }
        }

        private void button_empty_output_Click(object sender, EventArgs e)
        {
    
    
            textBox_rxd.Text = "";
        }

        private void button_launch_Click(object sender, EventArgs e)
        {
    
    
            byte[] Data = new byte[1];//作用同上集
            if (serialPort1.IsOpen)//判断串口是否打开,如果打开执行下一步操作
            {
    
    
                if (textBox_txd.Text != "")
                {
    
    
                    if (!radioButton_txd_int.Checked)//如果发送模式是字符模式
                    {
    
    
                        try
                        {
    
    
                            serialPort1.WriteLine(textBox_txd.Text);//写数据
                        }
                        catch (Exception err)
                        {
    
    
                            MessageBox.Show("串口数据写入错误", "错误");//出错提示
                            serialPort1.Close();
                            button_open_port.Enabled = true;//打开串口按钮可用
                            button_close_port.Enabled = false;//关闭串口按钮不可用
                        }
                    }
                    else
                    {
    
    
                        for (int i = 0; i < (textBox_txd.Text.Length - textBox_txd.Text.Length % 2) / 2; i++)//取余3运算作用是防止用户输入的字符为奇数个
                        {
    
    
                            Data[0] = Convert.ToByte(textBox_txd.Text.Substring(i * 2, 2), 16);
                            serialPort1.Write(Data, 0, 1);//循环发送(如果输入字符为0A0BB,则只发送0A,0B)
                        }
                        if (textBox_txd.Text.Length % 2 != 0)//剩下一位单独处理
                        {
    
    
                            Data[0] = Convert.ToByte(textBox_txd.Text.Substring(textBox_txd.Text.Length - 1, 1), 16);//单独发送B(0B)
                            serialPort1.Write(Data, 0, 1);//发送
                        }
                    }
                }
            }
        }

//下面这个事件是"串口自动检测"按钮按下后将会触发的时间。
//因为在本文中,代码更新了但是上位机的图片没更新。
//所以如果想要增加此功能的话,请自行在设计器中增加一个名为"button_auto_detect"的按钮控件。
        private void button_auto_detect_Click(object sender, EventArgs e)
        {
    
    
            bool comExistence = false; //有可用的串口标志位
            comboBox_port.Items.Clear(); //清除当前串口号中所有串口名称
            for (int i = 0; i < 19; i++)
            {
    
    
                try
                {
    
    
                    SerialPort sp = new SerialPort("COM" + (i + 1).ToString()); //串口实例化
                    sp.ReadBufferSize = 1024000; //设置接收缓存
                    sp.Open();
                    sp.Close();
                    comboBox_port.Items.Add("COM" + (i + 1).ToString());
                    comExistence = true;
                }
                catch (Exception)
                {
    
    
                    continue;
                }
                if (comExistence)
                {
    
    
                    comboBox_port.SelectedIndex = 0; //使ListBox显示第1个添加的索引
                    break; //找到一个可用的串口即可
                }
                else
                {
    
    
                    MessageBox.Show("没有找到可用串口!", "错误提示"); //显示具有指定文本和标题的消息框
                }
            }
        }
    }
}

2. Vista previa del asistente de puerto serie

Inserte la descripción de la imagen aquí

3. Prueba

3.1 Configurar par de puertos serie virtuales

Abra VSPD, configure un par de puertos serie de COM3 y COM4, ​​y luego haga clic en Agregar par.
Inserte la descripción de la imagen aquí
Obtenga un par de puertos serie virtual: COM3 y COM4.
Inserte la descripción de la imagen aquí
También puede ver el par de puertos serie virtual en el administrador de dispositivos.
Inserte la descripción de la imagen aquí

3.2 Configurar SSCOM

Abra SSCOM. Configure el número de puerto serie como COM4 y la velocidad en baudios en 9600.

Inserte la descripción de la imagen aquí

3.3 Configurar asistente de puerto serie

Abra el asistente de puerto serie, configure el número de puerto serie como COM3, la velocidad en baudios es 9600 y cambie el modo de envío y recepción a carácter (cambie el modo de envío y recepción al modo de caracteres solo para una visualización más intuitiva, y el modo numérico puede también funcionan normalmente).
Inserte la descripción de la imagen aquí

3.4 Iniciar experimento

Haga clic para abrir el puerto serie en SSCOM.
Inserte la descripción de la imagen aquí
Haga clic para abrir el puerto en el asistente de puerto serie.
Inserte la descripción de la imagen aquí
Ingrese 555 en el cuadro de entrada del asistente de puerto serie, y 555 se puede recibir en el cuadro de recepción de SSCOM.
Inserte la descripción de la imagen aquí

Ingrese 666 en el cuadro de entrada de SSCOM y podrá recibir 666 en el cuadro de recepción del asistente de puerto serie.
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/mahoon411/article/details/109346704
Recomendado
Clasificación