串口通信
串口通信是一种常见的数据传输方式,通过串行接口(串口)将数据以串行比特流的形式进行传输。在计算机和外部设备之间,串口通信通常是通过串行通信标准(如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) {//1
textBox1.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.把接收到的字节转成string
string 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);
}
}
}
}