每日一学26——Unity C# 串口

本文介绍了一个用于Unity的串口通信工具类,该类封装了串口的发送和接收功能,提供了方便的调用方式。通过使用System.IO.Ports命名空间下的SerialPort类,实现了串口的初始化、数据发送及接收,并附带了回调函数处理接收的数据。

学习来源:https://blog.youkuaiyun.com/q764424567/article/details/101053821/?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-2

朋友让帮忙写个串口的脚本,网上有很多自写的串口通信,比如这篇。估计是不知道有直接可以调用的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();
    }
}

这个别忘了选

Api Compatibility Level
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值