C# Serialport的发送和接管

前言:

上次博主为大家解说了串口控件Serialport的配置,本期解说一下Serialport的发送和接管,这个SerialPort串口通信的控件对上位机和单片机的通信提供了,很多的办法,能够不便大家应用,应用也很简略。

每日一遍,避免早恋:

1.SerialPort串口控件发送配置

1.1 拿着上篇文章的我的项目,我在那个我的项目根底下面的进行设置不会的童鞋能够看博主的上一篇文章,放个链接( https://juejin.cn/post/702183... ),咱们先要把界面设置好,发送框,接管框,发送按钮

1.2 咱们先来理解一下serialPort的发送它提供的几个接口:

public void Write(byte[] buffer, int offset, int count);    应用缓冲区中的数据将指定数量的字节写入串行端口。        // buffer:   蕴含要写入端口的数据的字节数组。        //   offset:    buffer 参数中从零开始的字节偏移量,从此处开始将字节复制到端口。        //   count:    要写入的字节数。public void Write(string text);    将指定的字符串写入串行端口。      text:  输入字符串。public void Write(char[] buffer, int offset, int count);    应用缓冲区中的数据将指定数量的字符写入串行端口。        //   buffer:   蕴含要写入端口的数据的字符数组。        //   offset:  buffer 参数中从零开始的字节偏移量,从此处开始将字节复制到端口。        //   count: 要写入的字符数。public void WriteLine(string text);        //     将指定的字符串和 System.IO.Ports.SerialPort.NewLine 值写入输入缓冲区。        //     text:   要写入输入缓冲区的字符串。
  1. 3双击发送按钮主动生成办法函数,写入咱们发送的办法:

1.4代码如下:能够间接用,前提是你的界面和博主的一样,留神界面的控件是不是和博主函数触发是对应的,不是要改界面的触发,具体参考上一篇文章。

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.IO.Ports;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace Serilport{    public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;        }        private void SearchAndAddSerialToComboBox(object sender, EventArgs e)        {            string Buffer;            comboBox1.Items.Clear();    //清初之前曾经扫描的记录            for (int i = 0; i < 20; i++)            {                try                {                    Buffer = "COM" + i.ToString(); //取得COM1-20                    serialPort1.PortName = Buffer;     //获取COM信息                    serialPort1.Open();                 //关上串口                    comboBox1.Items.Add(Buffer);                    comboBox1.Text = Buffer; //增加串口失去记录集                    serialPort1.Close();                 //敞开串口                }                catch { }            }        }        private void button4_Click(object sender, EventArgs e)        {            try            {                serialPort1.PortName = comboBox1.Text;                serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text, 10);                serialPort1.DataBits = Convert.ToInt32(comboBox3.Text, 10);                if (comboBox4.Text == "None") { serialPort1.Parity = Parity.None; }                else if (comboBox4.Text == "奇校验") { serialPort1.Parity = Parity.Odd; }                else if (comboBox4.Text == "偶校验") { serialPort1.Parity = Parity.Even; }                else if (comboBox4.Text == "Mark") { serialPort1.Parity = Parity.Mark; }                else if (comboBox4.Text == "空格校验") { serialPort1.Parity = Parity.Space; }                if (comboBox5.Text == "1")                {                    serialPort1.StopBits = StopBits.One;                }                else if (comboBox5.Text == "1.5")                {                    serialPort1.StopBits = StopBits.OnePointFive;                }                else if (comboBox5.Text == "1.5")                {                    serialPort1.StopBits = StopBits.Two;                }                //serialPort1.ReadTimeout(2000);                serialPort1.Open();                button2.Enabled = false;//关上串口按钮不可用                //button3.Enabled = true;//敞开串口            }            catch            {                MessageBox.Show("端口谬误,请查看串口", "谬误");            }        }        private void button1_Click(object sender, EventArgs e)        {            string str = textBox2.Text;//获取发送框的数据            byte[] Data = new byte[1];//作为发送的容器            if (serialPort1.IsOpen)//判断咱们的串口是不是关上了            {                for (int j = 0; j < str.Length; j++)//遍历咱们的发送语句,博主当初采纳一个一个的发送                {                    if (str[j] == ' ')//咱们的发送语句有空格隔开,咱们要遍历掉                    {                        continue;                    }                    else                    {                        try                        {                            Data[0] = Convert.ToByte(str.Substring(j, 2), 16);//substring是从j的地位取str字符串2个字节,16进制数                        }                        catch                        {                            MessageBox.Show("请核查输出的十六进制数据格式谬误");                        }                        try                        {                            serialPort1.Write(Data, 0, 1);//这个意思是发送,data数据,从0的地位开始,取一个值。                            j++;                        }                        catch                        {                            MessageBox.Show("端口发送失败,零碎将敞开以后串口谬误");                            serialPort1.Close();//敞开串口                        }                    }                }            }        }    }}

2.SarilPort 串口控件接管配置

2.1 在理解SerialPort 接管办法的接口

public int Read(char[] buffer, int offset, int count);      从 System.IO.Ports.SerialPort 输出缓冲区中读取一些字符,而后将这些字符写入字符数组中指定的偏移量处。         //  buffer: 将输出写入到其中的字节数组。        //   offset: 要写入字节的 buffer 中的偏移量。        //   count:  最多读取的字节数。 如果 count 大于输出缓冲区中的字节数,则读取较少的字节。public int Read(byte[] buffer, int offset, int count);     从 System.IO.Ports.SerialPort 输出缓冲区读取一些字节并将那些字节写入字节数组中指定的偏移量处。         // buffer: 将输出写入到其中的字节数组。        //   offset:要写入字节的 buffer 中的偏移量。        //   count:最多读取的字节数。 如果 count 大于输出缓冲区中的字节数,则读取较少的字节。public int ReadByte();     从 System.IO.Ports.SerialPort 输出缓冲区中同步读取一个字节。public int ReadChar();     从 System.IO.Ports.SerialPort 输出缓冲区中同步读取一个字符。public string ReadExisting();     在编码的根底上,读取 System.IO.Ports.SerialPort 对象的流和输出缓冲区中所有立刻可用的字节。public string ReadLine();     始终读取到输出缓冲区中的 System.IO.Ports.SerialPort.NewLine 值。public string ReadTo(string value);    始终读取到输出缓冲区中的指定 value 的字符串。     value: 批示读取操作进行地位的值。

2.2,依据截图创立接管函数,SerialPort主动接收数据

2.3 如果你想不应用循环,能够采取一次性读取进去数据,这样就不会那么麻烦,仔细阅读它本人的接口,找到适宜本人的接口,我把我的代码发给大家参考一下:

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)        {            byte data = 0;            int len = 0;            int bufsize = (int)serialPort1.BytesToRead;//获取缓存字节数            while (len < bufsize)//获取之后一个一个取            {                data = (byte)serialPort1.ReadByte();//获取串口的值                len++;                string str = Convert.ToString(data, 16).ToUpper();//获取之后咱们要在TextBox中输入                if (str.Length == 1)//如果咱们获取的值是一位咱们在后面补个0                {                    textBox1.AppendText(" 0" + str);                }                else                {                    textBox1.AppendText(" " + str);//两个值就在后面加一个空格分隔                 }            }              textBox1.AppendText(System.Environment.NewLine);//换行            serialPort1.DiscardInBuffer();//革除之前的缓存        }

3.展现一下,SerialPort的发送接管,博主这里刚好有一个单片机,给大家演示一下,如果对这个感兴趣,也能够采纳虚构串口,模仿一下玩一玩。

注:博主在运行的时候报一个线程的错 C# 异样:已引发: "线程间操作有效: 从不是创立控件“textBox1”的线程拜访它。" (System.InvalidOperationException),须要在Form1外面增加增加代码System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;禁止捕捉对谬误线程的调用。

总结:

博主只是简略的介绍了,C# SerialPort串口控件的发送和接管,并演示了一下,对这方面感兴趣的同学能够学一下,博主也只是初学者,因为最近在做一个我的项目所以才学习的,学C#的同学很少很少,心愿大家不喜勿喷,创作不易,点赞,关注,评论哦。