串口通信最重要的参数波特率,数据位,停止位,校验位。
波特率:
串口通信时的速率
数据位:
通信中实际数据位的参数。发送一个信息包实际的位数,通常为5、7、8位。
标准的ascii码0-127(7位)。扩展的ascii码是0-255(8位)。如果使用简单的文本,就可以使用7位的数据位。
停止位:
发送数据包的最后一位。一般值为1、1.5、2位。
停止位的作用可以表示传输的结束,并且提供计算机校正时钟同步的机会。停止位越多,不同时钟同步的容错程度越大,传输的速度也比较慢。
校验位(奇偶校验位)
检测错误的方式,奇(o)、偶(e)、无(n)
串口会设置发送数据的最后一位,用一个值确保传输的数据是奇数还是偶数,这样能让接收的数据知道一个位数的状态,有机会判断传输和接收的数据不同步的问题。
来看看简单代码实现:
1.逻辑和api使用
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace VSPD
{
class PortControlHelper
{
//创建串口对象
private SerialPort sp;
/// <summary>
/// 端口名称数组
/// </summary>
public string[] PortNameArr { get; set; }
/// <summary>
/// 串口通信开启状态
/// </summary>
//public bool PortState { get; set; } = false;
/// <summary>
/// 编码类型
/// </summary>
public Encoding EncodingType { get; set; } = Encoding.UTF8;
/// <summary>
/// 串口接收数据委托
/// </summary>
public delegate void ComReceiveDataHandler(string data);
public ComReceiveDataHandler OnComReceiveDataHandler = null;
public PortControlHelper()
{
PortNameArr = SerialPort.GetPortNames();
sp = new SerialPort();
sp.DataReceived += new SerialDataReceivedEventHandler(DataReceived);
}
/// <summary>
/// 发送数据
/// </summary>
/// <param name="sendData"></param>
public void SendData(string sendData)
{
try
{
sp.Encoding = EncodingType;
sp.Write(sendData);
}
catch (Exception e)
{
throw e;
}
}
/// <summary>
/// 打开窗口
/// </summary>
public void openPort(string name) {
//string portName, int boudRate = 115200, int dataBit = 8, int stopBit = 1, int timeout = 5000
sp.PortName = name;
sp.BaudRate = 115200;
sp.DataBits = 8;
sp.StopBits = (StopBits)1;
sp.ReadTimeout = 5;
sp.Open();
}
/// <summary>
/// 关闭端口
/// </summary>
public void ClosePort()
{
try
{
sp.Close();
//PortState = false;
}
catch (Exception e)
{
throw e;
}
}
/// <summary>
/// 接收数据回调用
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] buffer = new byte[sp.BytesToRead];
sp.Read(buffer, 0, buffer.Length);
string str = EncodingType.GetString(buffer);
if (OnComReceiveDataHandler != null)
{
OnComReceiveDataHandler(str);
}
}
}
}
2.窗口逻辑
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;
namespace VSPD
{
public partial class Form1 : Form
{
//创建串口接收输入对象
private PortControlHelper pchSend;
private PortControlHelper pchReceive;
public Form1()
{
InitializeComponent();
pchSend = new PortControlHelper();
pchReceive = new PortControlHelper();
VSPDopen();
}
/// <summary>
/// 打开串口
/// </summary>
///
void VSPDopen()
{
//pchSend.ClosePort();
//pchReceive.ClosePort();
try
{
pchSend.openPort("COM3");
pchReceive.openPort("COM4");
pchReceive.OnComReceiveDataHandler += new PortControlHelper.ComReceiveDataHandler(ComReceiveData);
}
catch (Exception)
{
label1.Text = "串口通信异常";
throw;
}
}
/// <summary>
/// 接收到的数据,写入文本框内
/// </summary>
/// <param name="data">接受的数据</param>
private void ComReceiveData(string data)
{
this.Invoke(new EventHandler(delegate
{
textBox2.AppendText($"接收:{data}\n");
}));
}
private void button1_Click(object sender, EventArgs e)
{
pchSend.SendData(textBox1.Text);
}
}
}
这样就实现了一个单向的串口发送信息的简单案例。
在使用的时候需要有串口,可以使用串口模拟工具,我把串口模拟工具和代码一起上传到我的github上提供下载和完善。
https://github.com/pm-WeiYu/net-- 中的 VSPD文件