同学们好 本次教程带来unity的端口通信!
端口一般需要接入外设,比如arduino等单片机,通过端口像电脑传输数据。而unity想要获取硬件信息就要读取端口里的数据。
点开设备管理器可以看到当前连接的所有设备,也可以查看端口。我们一台电脑有多个端口,所以我们需要确定读取的是哪个端口。
本次教程涉及的软件 脚本均可在会员库- 公众号链接 - 端口 文件夹里获取!
加入会员即可免费下载并可永久免费更新公众号教程资源(关注公众号 小森游戏制作 获取会员)
我们需要先下载端口调试的工具 ,网上很多这里老师用的是德飞莱串口
可以看到我们如果要读取端口数据 需要指定端口号,波特率,校验位,数据位和停止位。新建脚本 定义这些变量:
public string portName = "COM3";//串口名
public int baudRate = 9600;//波特率
public Parity parity = Parity.None;//效验位
public int dataBits = 8;//数据位
public StopBits stopBits = StopBits.One;//停止位
并且定义一个serialport(需要引入IO.Port类库)
SerialPort sp = null;
然后初始化
/// <summary>
/// 初始化
/// </summary>
/// <param name="port"></param>
public void InitPort(string port)
{
portName = port;
OpenPort();
// StartCoroutine(DataReceiveFunction1());
dataReceiveThread = new Thread(new ThreadStart(DataReceiveFunction));
dataReceiveThread.Start();
}
如果你不知道目标端口 可以遍历获取 并且链接闲置的(这里默认第一个)
/// <summary>
/// 检索端口
/// </summary>
public void SearchPort()
{
List<string> ports = new List<string>();
bool con = false;
for (int i = 0; i < 5; i++)
{
try
{
SerialPort spa = new SerialPort("COM" + (i + 1));
spa.Open();
spa.Close();
ports.Add("COM" + (i + 1));
Debug.Log("COM" + (i + 1));
con = true;
}
catch (System.Exception)
{
continue;
}
}
Debug.Log(ports[0]);
if (con)
InitPort(ports[0]);
}
消息接收(这里定义了队列来存储消息 外部需要访问数据只需要队列出列就行)
public Queue<string> msgs = new Queue<string>();//消息队列
void DataReceiveFunction()
{
#region
byte[] buffer = new byte[1024];
int bytes = 0;
while (true)
{
if (sp != null && sp.IsOpen)
{
try
{
bytes = sp.Read(buffer, 0, buffer.Length);//接收字节
Debug.Log(bytes);
if (bytes == 0)
{
continue;
}
else
{
byte[] readdata = new byte[bytes];
Array.Copy(buffer, 0, readdata,0, bytes);
//string Utf8str = Encoding.UTF8.GetString(readdata);
// string ASCIIstr = Encoding.ASCII.GetString(readdata);
string Defaultstr = Encoding.Default.GetString(readdata);
//string Unicodestr = Encoding.Unicode.GetString(readdata);
// Debug.Log("Unicodestr:" + Unicodestr);
Debug.Log("Defaultstr:" + Defaultstr);
// Debug.Log("ASCIIstr:" + ASCIIstr);
// Debug.Log("Utf8str:" + Utf8str);
}
}
catch (Exception ex)
{
}
}
Thread.Sleep(100);
}
#endregion
}
#endregion
写入数据
public void WriteData(string dataStr)
{
if (sp.IsOpen)
{
sp.Write(dataStr);
}
}
那么到这里我们的脚本就做好了 挂载到空物体上既可以进行测试,。
如果我们没有实际硬件 那么就需要一个虚拟化工具来开启虚拟端口,这里小森老师用的是这个configurevirtualseralportdriver
该软件试用版可试用14天 如需破解只需要解压破解包吧下图的exe dll 替换掉安装位置的exe和dll(左侧拖到右侧替换)
打开之后是这样
我们点击添加端口就会添加一对 注意是一对 因为虚拟的或者实际的端口只能同时被一个进程访问 所以我们如果用一个端口就会只能收不能发 或者只能发不能收,所以这里添加的一对 我们其中一个用来发 另外一个用来接收即可。
比如我串口工具绑定com1 那么unity软件程序读取就绑定com2,然后运行unity 用工具向端口1发送数据 在unity端即可接收到消息:
不过需要注意的是 有时候数据会被拆开 所以建议大家发送的时候加上数据长度 解析的时候进行存储 到指定长度之后拼接处理
对接收修改如下:
public Queue<string> msgs = new Queue<string>();
StringBuilder sb = new StringBuilder();
int length = -1;
void DataReceiveFunction()
{
#region
byte[] buffer = new byte[1024];
int bytes = 0;
while (true)
{
if (sp != null && sp.IsOpen)
{
try
{
bytes = sp.Read(buffer, 0, buffer.Length);//接收字节
Debug.Log(bytes);
if (bytes == 0)
{
continue;
}
else
{
byte[] readdata = new byte[bytes];
Array.Copy(buffer, 0, readdata,0, bytes);
//string Utf8str = Encoding.UTF8.GetString(readdata);
// string ASCIIstr = Encoding.ASCII.GetString(readdata);
string Defaultstr = Encoding.Default.GetString(readdata);
//string Unicodestr = Encoding.Unicode.GetString(readdata);
if(length < 0)
{
length = int.Parse(Defaultstr[0].ToString ());
for (int i = 1; i < Defaultstr .Length ; i++)
{
sb.Append(Defaultstr[i]);
}
}else
{
for (int i = 0; i < Defaultstr.Length; i++)
{
sb.Append(Defaultstr[i]);
}
}
if(sb .Length == length)
{
Debug.Log("数据:" + sb.ToString());
msgs.Enqueue(sb.ToString());
sb.Clear();
length = -1;
}
}
}
catch (Exception ex)
{
}
}
Thread.Sleep(100);
}
#endregion
}
效果如下:不管有没有分开 数据都是正常接收处理了
好了 如上即为端口通信的全部内容,希望对同学们有所帮助!文章来源:https://www.toymoban.com/news/detail-759495.html
期待你的点赞 关注 收藏!!!文章来源地址https://www.toymoban.com/news/detail-759495.html
到了这里,关于unity串口通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!