Assistant de port série de développement C # (peut changer le débit en bauds, le numéro de port série, peut réaliser l'envoi et la réception de données et de caractères)

0. Préface

1. Réalisation du projet

1.1 Configurer le fichier Form1.cs [Design] (Designer)

Tout d' abord, mettre les suivants Labelcontrôles: ComboBox, RadioButton, Panel, Button, TextBox,,GroupBox
Insérez la description de l'image ici

En outre, vous devez également ajouter le contrôle SerialPort.

1.1.1 Le rôle de l'ajout de Panel

  • Panel est un contrôle de conteneur. La description officielle du rôle de Panel est: Permet le regroupement d'ensembles de contrôle.
  • Dans la figure ci-dessus, utilisez Panel pour diviser les quatre RadioButtons en deux groupes, afin que cela puisse être réalisé. Dans chaque groupe, un seul RadioButton sera sélectionné.
  • Si le Panel n'est pas utilisé pour regrouper les quatre RadioButtons, un et un seul de ces quatre RadioButtons sera sélectionné en même temps.

1.1.2 Ajouter une barre de défilement à TextBox

La zone de texte à ces deux emplacements peut contenir une grande quantité de données d'entrée ou de sortie. Lorsque la quantité de données dépasse la plage visible, une barre de défilement est nécessaire pour étendre la plage d'affichage.
Insérez la description de l'image ici
Cliquez sur l'une des zones de texte pour ajouter une barre de défilement, puis modifiez les barres de défilement dans la barre de propriétés. Vertical signifie ajouter une barre de défilement verticale, Horizontal signifie ajouter une barre de défilement horizontale et Les deux signifie ajouter à la fois une barre de défilement verticale et une barre de défilement horizontale.
Insérez la description de l'image ici

1.1.3 Configurer comboBox_baud

Cliquez sur la comboBox dans la figure ci-dessous.
Insérez la description de l'image ici
Modifiez ensuite l'option Items dans sa barre de propriétés:
Insérez la description de l'image ici

Préremplissez le débit en bauds dans l'ensemble.

Insérez la description de l'image ici

1.1.4 Circonstances particulières

Si vous ajoutez un contrôle, mais oubliez le nom du contrôle, vous pouvez cliquer sur le contrôle et l'obtenir à partir du nom dans la barre de propriétés du contrôle.
Insérez la description de l'image ici

Insérez la description de l'image ici

1.2 Configurer le fichier Form1.cs

Le code de Form1.cs est le suivant

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. Aperçu de l'assistant de port série

Insérez la description de l'image ici

3. Test

3.1 Configurer la paire de ports série virtuels

Ouvrez VSPD, configurez une paire de ports série COM3 et COM4, ​​puis cliquez sur Ajouter une paire.
Insérez la description de l'image ici
Obtenez une paire de ports série virtuels: COM3 et COM4.
Insérez la description de l'image ici
Vous pouvez également afficher la paire de ports série virtuels dans le gestionnaire de périphériques.
Insérez la description de l'image ici

3.2 Configurer SSCOM

Ouvrez SSCOM. Configurez le numéro de port série COM4 et le débit en bauds sur 9600.

Insérez la description de l'image ici

3.3 Configurer l'assistant de port série

Ouvrez l'assistant de port série, configurez le numéro de port série comme COM3, la vitesse de transmission est de 9600 et changez le mode d'envoi et de réception en mode caractère (changez le mode d'envoi et de réception en mode caractère uniquement pour un affichage plus intuitif, et le mode numérique peut fonctionnent également normalement).
Insérez la description de l'image ici

3.4 Commencer l'expérience

Cliquez pour ouvrir le port série dans SSCOM.
Insérez la description de l'image ici
Cliquez pour ouvrir le port dans l'assistant de port série.
Insérez la description de l'image ici
Entrez 555 dans la zone de saisie de l'assistant de port série et 555 peut être reçu dans la zone de réception de SSCOM.
Insérez la description de l'image ici

Entrez 666 dans la zone de saisie de SSCOM, et vous pouvez recevoir 666 dans la zone de réception de l'assistant de port série.
Insérez la description de l'image ici

Je suppose que tu aimes

Origine blog.csdn.net/mahoon411/article/details/109346704
conseillé
Classement