Unity串口通信的简单使用教程

已经很久没有更新博客了,因为工作忙的原因,也因为自己忙了一些其他的事情…不说了,这篇博客简单介绍一下串口通信的用法,简单,但是用处很大,可以使用Unity和一些硬件进行交互,言归正传,开始。
1.新建工程,打开Player Setting,将Configuration中的Api Compatibility level设置为.Net2.0,貌似.Net Subset不包含串口通信的功能,具体需查下Unity api。图一2.新建一个空物体,并且创建一个PortManager脚本,将此脚本挂在空物体上。
在这里插入图片描述3.打开PortManager,输入以下代码。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO.Ports;
using System;

public class PortManager : MonoBehaviour
{
	string getPortName;
	int baudRate = 9600;
	private Parity parity = Parity.None;
	private int dataBits = 8;
	private StopBits stopBits = StopBits.One;
	SerialPort sp = null;
	private string _data;
	private string testString;
	// Use this for initialization
	void Start ()
	{
		getPortName = "COM3";
		testString = "b";
		OpenPort(getPortName);
		StartCoroutine(DataReceiveFunction());
	}

	/// <summary>
	/// 串口信号控制
	/// </summary>
	private void PortSignalControl()
	{
		if (_data == System.Text.Encoding.ASCII.GetBytes(testString)[0].ToString())
		{
			Debug.Log("收到串口信号" + testString);
		}
	
	}
	//打开串口
	public void OpenPort(string DefaultPortName)
	{
		sp = new SerialPort(DefaultPortName, baudRate, parity, dataBits, stopBits);
		sp.ReadTimeout = 10;
		try
		{
			if (!sp.IsOpen)
			{
				sp.Open();
			}
		}
		catch (Exception ex)
		{
			Debug.Log(ex.Message);
		}
	}
	//关闭串口
	public void ClosePort()
	{
		try
		{
			sp.Close();
		}
		catch (Exception ex)
		{
			Debug.Log(ex.Message);
		}
	}
	IEnumerator DataReceiveFunction()
	{
		byte[] dataBytes = new byte[128];//存储长度
		int bytesToRead = 0;//记录获取的数据长度

		while (true)
		{
			if (sp != null && sp.IsOpen)
			{
				try
				{
					//通过read函数获取串口数据
					bytesToRead = sp.Read(dataBytes, 0, dataBytes.Length);
					_data = dataBytes[0].ToString();
					print(_data);
					PortSignalControl();
					//串口数据已经被存入dataBytes中
				}
				catch (Exception ex)
				{

				}
			}
			yield return new WaitForSeconds(Time.deltaTime);
		}
	}
	//发送一个字节
	public void SendSerialPortData(string data)
	{
	    if (sp.IsOpen)
	    {
	        sp.WriteLine(data);
	    }
	}
	/// <summary>
	/// 发送一个字符串
	/// </summary>
	public void SendString()
	{
		SendSerialPortData("a");
	}
	private void OnApplicationQuit()
	{
		ClosePort();
	}
	private void OnDisable()
	{
		ClosePort();
	}
}

4.在场景中添加一个按钮,将PortManager里的SendString方法拖到此按钮中。
在这里插入图片描述5.打开串口助手,进行如下设置,并且打开串口。
在这里插入图片描述6.在串口助手的发送缓冲区输入a,点击发送数据按钮。
在这里插入图片描述7.Unity已经打印出了数据,说明已经接收到了串口助手发来的数据。
在这里插入图片描述8.点击Unity场景里的按钮。
在这里插入图片描述9.串口数据已经得到了数据,如图所示。
在这里插入图片描述
10.小结:这个是最简单的串口调用Demo,基本写出了串口通信的基本方法,可以在此基础上写更加复杂的逻辑。

  • 20
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 35
    评论
串口是串行接口(serialport)的简称,也称为串行通信接口或COM接口。串口通信是指采用串行通信协议(serialcommunicaTIon)在一条信号线上将数据一个比特一个比特地逐位进行传输的通信模式。串口按电气标准及协议来划分,包括RS-232-C、RS-422、RS485等。串行通信在串行通信中,数据在1位宽的单条线路上进行传输,一个字节的数据要分为8次,由低位到高位按顺序一位一位的进行传送。串行通信的数据是逐位传输的,发送方发送的每一位都具有固定的时间间隔,这就要求接收方也要按照发送方同样的时间间隔来接收每一位。不仅如此,接收方还必须能够确定一个信息组的开始和结束。常用的两种基本串行通信方式包括同步通信和异步通信。1、串行同步通信同步通信(SYNC:synchronousdatacommunicaTIon)是指在约定的通信速率下,发送端和接收端的时钟信号频率和相位始终保持一致(同步),这样就保证了通信双方在发送和接收数据时具有完全一致的定时关系。同步通信把许多字符组成一个信息组(信息帧),每帧的开始用同步字符来指示,一次通信只传送一帧信息。在传输数据的同时还需要传输时钟信号,以便接收方可以用时针信号来确定每个信息位。同步通信的优点是传送信息的位数几乎不受限制,一次通信传输的数据有几十到几千个字节,通信效率较高。同步通信的缺点是要求在通信中始终保持精确的同步时钟,即发送时钟和接收时钟要严格的同步(常用的做法是两个设备使用同一个时钟源)。在后续的串口通信与编程中将只讨论异步通信方式,所以在这里就不对同步通信做过多的赘述了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 35
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

波波斯维奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值