什么是串口呢
就是电脑的USB口,电脑和硬件间,通过USB,将数据传送到硬件
硬件也将数据通过USB线传送到电脑
从而完成电脑和硬件间的交互
串口表示
COM1 COM2 COM3等等
假如电脑中已经有了COM1,那插入一个新硬件时,就会自动成为COM2
(查看接入的串口 设备管理器->通用串行总线控制器)
当然,串口号是可以更改的,只要目标串口号没有被占用,就可以更改
(右键目标设备->属性->端口设置->高级->COM端口号(P))
串口和端口的区别
串口是电脑与硬件的通信渠道
端口是软件与软件的通信渠道。
IP定位到电脑,在IP后面跟上端口号,定位到该电脑的软件
如127.0.0.1:80
换一个端口号,连接的便是另一个软件了
串口通过串口号定位到硬件设备
更改串口号便更改了通信的硬件设备
串口通常用来做什么呢
软件通过串口,向硬件发送信息
如:软件发送信息给单片机,单片机接收到信息后控制灯带的变化
在Unity领域,一般是通过串口接受雷达的事件,从而完成体感交互的程序
不过雷达串口是不用手写的
而一些控制硬件交互的程序,是需要手写的串口通信的
串口通信是怎么通讯的呢
串口通信支持多种数据类型
如byte[],string
有了string,便可以传递json串,也就可以传递任何数据了
Unity怎么写串口通信呢
.net提供了相关的类,写起来也是相当方便的
这个类是Serialport
需要引入库:using System.IO.Ports;
注意事项
1.将Unity3D的切换成Api Compatibility Level改为 NET2.0(高版本Unity为.Net 4.x),否则Unity编写SerialPort类会报错
2.串口返回来的数据,不是在主线程的,所一需要将这些数据存储在一个队列中,然后在Update中检测队列中的数据
接下来,直接用下面代码的回调就可以了
登录后复制
using UnityEngine;
using System.Collections;
using System.IO.Ports;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Text;
public class SerialPortManager : MonoBehaviour
{
public string portName = "COM4";//串口号
public int baudRate = 9600;//波特率
public Parity parity = Parity.None;//效验位
public int dataBits = 8;//数据位
public StopBits stopBits = StopBits.One;//停止位
SerialPort sp = null;
Thread dataReceiveThread;
public List<byte> listReceive = new List<byte>();
char[] strchar = new char[100];//接收的字符信息转换为字符数组信息
string str;
void Start()
{
OpenPort();
dataReceiveThread = new Thread(new ThreadStart(DataReceiveFunction));
dataReceiveThread.Start();
}
public void OpenPort()
{
//创建串口
sp = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
sp.ReadTimeout = 400;
try
{
sp.Open();
}
catch (Exception ex)
{
Debug.Log(ex.Message);
}
}
void OnApplicationQuit()
{
ClosePort();
}
public void ClosePort()
{
try
{
sp.Close();
dataReceiveThread.Abort();
}
catch (Exception ex)
{
Debug.Log(ex.Message);
}
}
private void Update()
{
PrintData();
}
//打印数据
void PrintData()
{
for (int i = 0; i < listReceive.Count; i++)
{
strchar[i] = (char)(listReceive[i]);
str = new string(strchar);
}
Debug.Log(str);
}
//接收数据
void DataReceiveFunction()
{
byte[] buffer = new byte[1024];
int bytes = 0;
while (true)
{
if (sp != null && sp.IsOpen)
{
try
{
bytes = sp.Read(buffer, 0, buffer.Length);//接收字节
if (bytes == 0)
{
continue;
}
else
{
string strbytes = Encoding.Default.GetString(buffer);
//接受的数据
Debug.Log(strbytes);
}
}
catch (Exception ex)
{
if (ex.GetType() != typeof(ThreadAbortException))
{
}
}
}
Thread.Sleep(10);
}
}
//发送数据
public void WriteData(string dataStr)
{
if (sp.IsOpen)
{
sp.Write(dataStr);
}
}
}
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删