C#串口助手实现两个串口相互通讯

目录

C#串口助手实现两个串口相互通讯

虚拟串口软件下载

软件界面

程序设计

自动扫描电脑串口

打开串口

串口接受

发送信息

关闭串口

发送中文

完整代码下载


C#串口助手实现两个串口相互通讯

该软件可以实现两个串口之间的相互收发信息,如果没有硬件设备,可以下载一个虚拟的串口软件

虚拟出一对串口进行调试

虚拟串口软件下载

直接下载一个VSPD

资源链接:https://pan.baidu.com/s/1V1Z5r6o6Iek507tzwwcP5A

提取码:mmor

1)点击vspd.exe进行安装:

2)vspd.exe安装成功之后,把该vspdctl.dll文件替换为vspd.exe安装目录下的同名文件,完成破解

3)运行桌面创建的vspd快捷方式即可

软件界面

用panel容器可以使得单选按钮分组

然后自己手动在设计界面添加波特率、停止位、校验位

添加内容完毕

还需要拖拽一个SerialPort助手到软件界面

程序设计

自动扫描电脑串口

先加一个命名空间引用

        //自动扫描可用串口并添加到串口号列表上
        private void ReflashPortToComboBox(SerialPort serialPort, ComboBox comboBox)
        {                                                               //将可用端口号添加到ComboBox
            if (!serialPort.IsOpen)//串口处于关闭状态
            {
                comboBox.Items.Clear();
                string[] str = SerialPort.GetPortNames();
                if (str == null)
                {
                    MessageBox.Show("本机没有串口!", "Error");
                    return;
                }
                //添加串口
                foreach (string s in str)
                {
                    comboBox.Items.Add(s);
                    Console.WriteLine(s);
                }
            }
            else
            {
                MessageBox.Show("串口处于打开状态不能刷新串口列表", "Error");
            }
        }

然后在窗口加载的时候调用该函数

        private void Form1_Load(object sender, EventArgs e)
        {
            //取消跨线程访问检查
            Control.CheckForIllegalCrossThreadCalls = false;
            //自动扫描可用串口
            ReflashPortToComboBox(serialPort1,comboBox1);
            comboBox1.SelectedIndex = 0;//串口号默认值
            comboBox2.SelectedIndex = 4;//波特率默认值9600
            comboBox3.SelectedIndex = 0;//停止位默认值1
            comboBox4.SelectedIndex = 0;//默认无校验位
            //手动注册端口接收事件
            serialPort1.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
        }

打开串口

 //打开串口按钮
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                serialPort1.PortName = comboBox1.Text;  //将端口绑定给sp类
                //设置波特率
                serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text, 10);//十进制数据转换
                switch (comboBox3.Text.Trim())            //停止位
                {
                    case "1":
                        serialPort1.StopBits = StopBits.One;
                        break;
                    case "2":
                        serialPort1.StopBits = StopBits.Two;
                        break;
                    default:
                        MessageBox.Show("Error:参数不正确!停止位", "Error");
                        break;
                }
                //设置校验位
                switch (comboBox4.Text.Trim())
                {
                    case "无":
                        serialPort1.Parity = Parity.None;
                        break;
                    case "奇校验":
                        serialPort1.Parity = Parity.Odd;
                        break;
                    case "偶校验":
                        serialPort1.Parity = Parity.Even;
                        break;
                    default:
                        MessageBox.Show("Error:参数不正确!校验位", "Error");
                        break;
                }

                serialPort1.Open();
                button1.Enabled = false;//打开串口按钮不可用
                button2.Enabled = true;//关闭串口
            }
            catch (Exception)
            {
                MessageBox.Show("端口错误,请检查串口", "错误");
            }
        }

串口接受

  //端口接受事件
        private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)//串口数据接收事件
        {
            if (!radioButton4.Checked)//如果接收模式为字符模式
            {
                string str = serialPort1.ReadExisting();//字符串方式读
                textBox2.AppendText(str);//接受显示框添加内容
            }
            else
            { //如果接收模式为数值接收
                byte data;
                data = (byte)serialPort1.ReadByte();//此处需要强制类型转换,将(int)类型数据转换为(byte类型数据,不必考虑是否会丢失数据
                string str = Convert.ToString(data, 16).ToUpper();//转换为大写十六进制字符串
                textBox2.AppendText("0x" + (str.Length == 1 ? "0" + str : str) + " ");//空位补“0”   
                //上一句等同为:if(str.Length == 1)
                //                  str = "0" + str;
                //              else 
                //                  str = str;
                //              textBox1.AppendText("0x" + str);
            }
        }

发送信息

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

关闭串口

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

            }
        }

发送中文

        public Form1()
        {
            InitializeComponent();
            serialPort1.Encoding = Encoding.GetEncoding("GB2312");   //串口编码引入GB2312编码(汉字编码)
        }

发送中文需要加一句上面的代码

完整代码下载

链接:https://pan.baidu.com/s/155Um2JoVwXyaDh_pcje4Lg 
提取码:06fo 
如果对你有帮助,就请点赞,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猪猪派对

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值