联为C#6——串口通信、动态链接库dll

串口通信

串口通讯只支持一个字节一个字节传输,及byte传输,不支持汉字进行传输,一个汉字有两个字节,所以不能进行传输。com口是点对点传输。8bit表示一个字节,两个16进制数占一个字节,一个字节占两位
在这里插入图片描述

串口参数设置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

打开串口

在这里插入图片描述
在这里插入图片描述

接收数据

在这里插入图片描述
用委托进行显示
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

按16进制显示(将字节一个一个从 ASCII 转换为16进制)

在这里插入图片描述

发送数据

在这里插入图片描述
将字符串转换成16进制
在这里插入图片描述

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 serialPortTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private delegate void showTextRecv(string strRecv);
        private showTextRecv showMyText;

        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                string[] portlist = System.IO.Ports.SerialPort.GetPortNames();   //获取电脑上的所有端口号
                for (int i = 0; i < portlist.Length; i++)
                {
                    this.comboBox1.Items.Add(portlist[i]);        //循环添加端口号到combox中
                }

            }
            catch (Exception)
            {

                throw;
            }
           
            showMyText = new showTextRecv(runShowText);

        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.serialPort1.PortName = this.comboBox1.Text;    //将更改的com口随时赋值到serialport中
        }

        private void comboBox3_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (this.comboBox3.Text == "无校验")
            {
                this.serialPort1.Parity = Parity.None;
            }
            else if(this.comboBox3.Text == "奇校验")
            {
                this.serialPort1.Parity = Parity.Odd;
            }
            else if (this.comboBox3.Text == "偶校验")
            {
                this.serialPort1.Parity = Parity.Even;
            }
            else if (this.comboBox3.Text == "0校验")
            {
                this.serialPort1.Parity = Parity.Space;
            }
            else if (this.comboBox3.Text == "1校验")
            {
                this.serialPort1.Parity = Parity.Mark;
            }
        }

        private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text);
        }
        bool m_bOpen = false;
        private void button1_Click(object sender, EventArgs e)
        {
            m_bOpen = !m_bOpen;
            if (m_bOpen)
            {
                try
                {
                    this.serialPort1.Open();
                }
                catch (Exception em)
                {

                    MessageBox.Show(em.ToString());
                    m_bOpen = false;
                    return;
                }
                this.button1.Text = "关闭串口";
            }
            else
            {
                this.button1.Text = "打开串口";
            }
        }

        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            byte[] recvData = new byte[this.serialPort1.BytesToRead];   //以读取到的数据长度开辟一个接收空间
            this.serialPort1.Read(recvData, 0, recvData.Length);   //从第0位开始读到最后一位

        }
        private void runShowText(string strRecv)
        {
            this.textBox1.AppendText(strRecv + "\r\n");
        }

        #region  接收数据
        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            byte[] recvData = null;
            if (checkBox1.Checked)
            {
                StringBuilder strRecv = new StringBuilder();
                for (int i = 0; i < strRecv.Length; i++)
                {
                    strRecv.AppendFormat("{0:X2}" + " ", recvData[i]);     //将字节一个一个从ASCII转换为16进制

                }
                this.textBox1.Invoke(showMyText, strRecv.ToString());
            }
            else
            {
                string strRecv = System.Text.Encoding.Default.GetString(recvData);
                this.textBox1.Invoke(showMyText, strRecv);
            }
        }
        #endregion

        #region  发送数据
        private void button2_Click(object sender, EventArgs e)
        {
            byte[] sendData = null;
            if (checkBox2.Checked)
            {
                sendData = strToHexByte(this.textBox2.Text);
            }
            else
            {
                sendData = System.Text.Encoding.Default.GetBytes(this.textBox2.Text);
            }
            this.serialPort1.Write(sendData, 0, sendData.Length);
        }
        #endregion

        #region  将字符串转换为16进制
        private byte[] strToHexByte(string hexString)
        {
            hexString = hexString.Replace(" ", "");    //去掉空格
            if (hexString.Length % 2 != 0)
            {
                hexString += " ";
            }
            byte[] returnBytes = new byte[hexString.Length / 2];
            for (int i = 0; i < returnBytes.Length; i++)
            {
                returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2).Replace(" ", ""));
            }
            return returnBytes;
        }
        #endregion
    }
}

动态链接库dll

目标框架要保持一致
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值