串口通信
串口通信是一种常见的数据传输方式,通过串行接口(串口)将数据以串行比特流的形式进行传输。在计算机和外部设备之间,串口通信通常是通过串行通信标准(如RS-232)来实现的。串口通信可以用于连接各种设备,如打印机、传感器、单片机等。
在串口通信中,数据按照位的顺序依次传输,一个字节(8位)的数据通常包括起始位、数据位、校验位和停止位。串口通信的优点包括连接简单、传输距离较远、可靠性高等特点,但传输速率一般较低。
串口调试助手(软件)
使用代码编写
1、使用代码编写串口通信
using System;
//支持串口通信的
using System.IO.Ports;
using System.Text;
using System.Windows.Forms;namespace _3.串口通信 {public partial class Form1 : Form {public Form1() {InitializeComponent();}//描述一个支持串口通信的对象,SerialPort属于.net里面封装号的一个类SerialPort sp;//声明一个委托public delegate void ShowMSGdele(string str);//2//声明委托对象ShowMSGdele showMSGdele;private void ShowMSG(string msg) {//1textBox1.Text += msg;}//建立串口的链接private void Form1_Load(object sender, EventArgs e) {//为委托赋值showMSGdele = ShowMSG;//为串口实例化sp = new SerialPort();//配置串口信息sp.PortName = "COM2";//设置波特率sp.BaudRate = 9600;//校验sp.Parity = Parity.None;//数据位sp.DataBits = 8;//停止位sp.StopBits = StopBits.One;//接收数据的事件,接收的逻辑是系统封装好的sp.DataReceived += Sp_DataReceived;//打开串口sp.Open();//plc中会提供串口连接数据}//接收数据的事件private void Sp_DataReceived(object sender, SerialDataReceivedEventArgs e) {//1.接收对方发送的字节数大小int size = sp.BytesToRead;//2.准备一个字节数组,用size初始化byte[] buffer = new byte[size];//3.读取数据//参数1:把读取的数放到字节数组中//参数2:从第几个字节开始读取//参数3:是buffer的长度sp.Read(buffer, 0, size);//4.把接收到的字节转成stringstring msg = Encoding.Default.GetString(buffer);//分线程不能刷新ui//textBox1.Text = msg;//MessageBox.Show(msg);textBox1.BeginInvoke(showMSGdele, msg);}//发送消息private void button1_Click(object sender, EventArgs e) {sp.Write(textBox2.Text);}}
}
2、使用winfrom控件编写串口通信
SerialPort
控件是Windows Forms中提供的串口通信控件,可以用于实现串口通信功能。
该控件有三个事件
1、DataRecived
:该事件是每次从SerialPort接收数据时触发的
2、ErrorReceived
:该事件是每次从SerialPort接收错误触发的
3、PinChanged
:该事件是每次SerialPort的pin更改时触发的
代码展示(注意要修改serialPort控件的PortName属性)
using System;
//引入命名空间
using System.IO.Ports;
using System.Text;
using System.Windows.Forms;namespace _4.组件串口通信 {public partial class Form1 : Form {public Form1() {InitializeComponent();}private void Form1_Load(object sender, EventArgs e) {//打开窗口的时候打开串口serialPort1.Open();}private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) {//获取接收缓冲区中数据的字节数int size = serialPort1.BytesToRead;byte[] buffer = new byte[size];serialPort1.Read(buffer, 0, size);string msg = Encoding.Default.GetString(buffer);textBox1.BeginInvoke(new Action<string>(str => {textBox1.Text += str;}), msg);}private void button1_Click(object sender, EventArgs e) {//判断组件是否正常运行if (serialPort1.IsOpen) {serialPort1.Write(textBox2.Text);}}}
}