1.什么是串口及串口通信?
串口全称串行接口,是采用串行通信方式的扩展接口。
通俗的来说,例如我们电脑等设备用的USB接口类似,串口功能类似USB,都是用于数据传输的工具,也是一种非常通用的设备通信协议。
串口通信就是计算机和外设之间通过数据线相连按位传输数据,通过向串口发送的电信号可以控制终端器械以及设备。比如我们用电脑给单片机发送指令,就是USB转串口来控制单片机的方式。
如何理解串口,UART, RS232, RS485?:
https://www.zhihu.com/question/273655897/answer/370147444
2.创建模拟串口
一开始我们接触串口的时候,电脑不一定有现成的串口可以用,就要添加模拟串口来做接下来的工作。
在网上找到一个可用的模拟软件。
csdn下载:
https://download.youkuaiyun.com/download/Yyuanyuxin/12373033
百度云下载:
链接:https://pan.baidu.com/s/1kf1VEgdQ1ABT35230RNuhQ
提取码:l6mu
该软件有点小bug,有的显示不全,但是不影响操作。
操作步骤很简单。
下图可以看到新增了几个模拟的串口
3.使用c#下的SerialPort来简单进行通信
(1)连接
SerialPort sp=new SerialPort();
sp.PortName = "COM1";
sp.BaudRate = 115200;
sp.DataBits = 8;
sp.StopBits = (StopBits)1;
sp.ReadTimeout = 5;
sp.Open();
上面的属性:
属性 | 说明 |
---|---|
PortName | 串口名, 默认值COM1 |
BaudRate | 串行波特率bit/s ,默认值9600 |
DataBits | 每个字节的标准数据位长度,默认值8 |
StopBits | 每个字节的标准停止位数,用于表示单个包的最后一位,默认值One |
Parity | 奇偶校验检查协议,简单的检错方式,默认值None |
(2)关闭
sp.Close();
(3)发送
public void SendData()
{
try
{
sp.Encoding = EncodingType;
sp.Write(richTextBox1.Text));
}
catch (Exception e)
{
throw e;
}
}
(4)接收
绑定接收事件:
sp.DataReceived += new SerialDataReceivedEventHandler(DataReceived);
private void DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] buffer = new byte[sp.BytesToRead];
sp.Read(buffer, 0, buffer.Length);
string str = EncodingType.GetString(buffer);
this.Invoke(new EventHandler(delegate
{
richTextBox2.AppendText($"接收:{str}\n");
}));
}
4.使用帮助类来简化代码
帮助类:
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 串口操作
{
class PortCommunicationHelper
{
//创建串口对象
public SerialPort serialPort;
/// <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();
serialPort = new SerialPort();
serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceived);
}
/// <summary>
/// 发送数据
/// </summary>
/// <param name="sendData"></param>
public void SendData(string sendData)
{
try
{
serialPort.Encoding = EncodingType;
serialPort.Write(sendData);
}
catch (Exception e)
{
throw e;
}
}
/// <summary>
/// 打开串口口
/// </summary>
public void openPort(string name)
{
serialPort.PortName = name;
serialPort.BaudRate = 115200;
serialPort.DataBits = 8;
serialPort.StopBits = (StopBits)1;
serialPort.ReadTimeout = 5;
serialPort.Open();
}
/// <summary>
/// 关闭端口
/// </summary>
public void ClosePort()
{
try
{
serialPort.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[serialPort.BytesToRead];
serialPort.Read(buffer, 0, buffer.Length);
string str = EncodingType.GetString(buffer);
if (OnComReceiveDataHandler != null)
{
OnComReceiveDataHandler(str);
}
}
}
}
窗口显示及代码:
代码:
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 串口操作
{
public partial class Form1 : Form
{
private PortCommunicationHelper pchSend;
private PortCommunicationHelper pchReceive;
public Form1()
{
InitializeComponent();
pchSend = new PortCommunicationHelper();
pchReceive = new PortCommunicationHelper();
Init();
}
/// <summary>
/// 打开串口
/// </summary>
///
void Init()
{
try
{
pchSend.openPort("COM1");
pchReceive.openPort("COM2");
pchReceive.OnComReceiveDataHandler += new PortCommunicationHelper.ComReceiveDataHandler(ComReceiveData);
}
catch (Exception)
{
MessageBox.Show("串口通信异常");
throw;
}
}
/// <summary>
/// 接收到的数据,写入文本框内
/// </summary>
/// <param name="data">接受的数据</param>
private void ComReceiveData(string data)
{
this.Invoke(new EventHandler(delegate
{
richTextBox2.AppendText($"接收:{data}\n");
}));
}
private void button2_Click(object sender, EventArgs e)
{
pchSend.SendData(richTextBox1.Text);
}
}
}
源码下载:
https://download.youkuaiyun.com/download/Yyuanyuxin/12373328