朋友让帮忙写个串口的脚本,网上有很多自写的串口通信,比如这篇。估计是不知道有直接可以调用的API。在此整理成工具类方便以后调用(因本地没有串口硬件,未实测)。
调用方式:
using System.IO.Ports;
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
//生成对象并通过构造函数赋值
SerialPortEx serialPortEx = new SerialPortEx("COM1", 9600, Parity.None, 8, StopBits.One);
//调用发送数据
serialPortEx.SendData("ok", CallBack);
}
void CallBack(string data)
{
Debug.Log(data);
}
}
工具类:
using System.IO.Ports;
using System.Text;
using System;
public partial class SerialPortEx
{
//串口
private SerialPort SerialPort;
//回调
private Action<string> CallBack;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="portName">串口名,一般为COM1, COM2等</param>
/// <param name="baudRate">波特率,也就是串口通讯的速度,进行串口通讯的双方其波特率需要相同,如果用PC连接其他非PC系统,一般地,波特率由非PC系统决定。</param>
/// <param name="parity">奇偶校验</param>
/// <param name="dataBits">数据位</param>
/// <param name="stopbits">停止位</param>
public SerialPortEx(string portName, int baudRate, Parity parity, int dataBits, StopBits stopbits)
{
//绑定端口
SerialPort = new SerialPort(portName, baudRate, parity, dataBits, stopbits);
//订阅委托
SerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceived);
}
/// <summary>
/// 初始化串口参数
/// </summary>
/// <param name="portName">串口名,一般为COM1, COM2等</param>
/// <param name="baudRate">波特率,也就是串口通讯的速度,进行串口通讯的双方其波特率需要相同,如果用PC连接其他非PC系统,一般地,波特率由非PC系统决定。</param>
/// <param name="parity">奇偶校验</param>
/// <param name="dataBits">数据位</param>
/// <param name="stopbits">停止位</param>
public void InitSerialPort(string portName, int baudRate, Parity parity, int dataBits, StopBits stopbits)
{
//绑定端口
SerialPort = new SerialPort(portName, baudRate, parity, dataBits, stopbits);
//订阅委托
SerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceived);
}
/// <summary>
/// 串口回调
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] retrunData = new byte[SerialPort.BytesToRead];
//读取数据
SerialPort.Read(retrunData, 0, retrunData.Length);
//转string
string dataStr = ByteToString(retrunData);
//回调
CallBack(dataStr);
}
/// <summary>
/// Byte转String
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
private string ByteToString(byte[] data)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < data.Length; i++)
{
sb.AppendFormat("{0:x2}" + "", data[i]);
}
return sb.ToString();
}
/// <summary>
/// 发送串口数据
/// </summary>
/// <param name="portName">串口名,一般为COM1, COM2等</param>
/// <param name="baudRate">波特率,也就是串口通讯的速度,进行串口通讯的双方其波特率需要相同,如果用PC连接其他非PC系统,一般地,波特率由非PC系统决定。</param>
/// <param name="parity">奇偶校验</param>
/// <param name="dataBits">数据位</param>
/// <param name="data">发送数据</param>
/// <param name="callBack">回调函数,需有string参数</param>
public void SendData(string portName, int baudRate, Parity parity, int dataBits, StopBits stopbits, string data, Action<string> callBack)
{
InitSerialPort(portName, baudRate, parity, dataBits, stopbits);
CallBack = callBack;
SerialPort.Open();
SerialPort.WriteLine(data);
SerialPort.Close();
}
/// <summary>
/// 发送串口数据
/// </summary>
/// <param name="data">发送数据</param>
/// <param name="callBack">回调函数,需有string参数</param>
public void SendData(string data, Action<string> callBack)
{
CallBack = callBack;
SerialPort.Open();
SerialPort.WriteLine(data);
SerialPort.Close();
}
}
这个别忘了选

网友评论