关于Unity怎么与人工智能交互平台硬件通讯(单片机嵌入式开发)

目录

 

1用到的工具

2验证Unity与虚拟串口之间的通讯

3准备下实体测试的环境,

4硬件准备(我用的是百科荣创智能机器人开发平台),里面包含主控制板,拓展版,还要烧录器等等。接线必须按照以下接线方式

5烧录软件,一般烧录的软件是由单片机编程,编写出来的后缀为.hex的单片机程序

烧录的时候,然后插入下载口到usb口,2.0,3.0都可以,这时候烧录程序可以检测到实体端口COM3有出现的,这时候,按照烧录教程操作即可。

6,拔掉下载口,接上通讯口,这时,实体通讯口应该会出现在虚拟串口工具的显示板上


 

1用到的工具

Virtual Serial Port Driver虚拟串口软件:这个在测试串口调试助手与Unity之间的通讯是否成功。

串口调试助手COMTransmit : 这个是调试虚拟串口与Unity验证的工具,实体串口出来之后就不需要了。

stm32 cube programmer:软件烧录工具,将32位单片机编译的软件烧录到单片机的工具,实际上我用的是J-Link,后面改成了用J-Link的驱动

JLink_Windows_V792f_x86_64:J-Link驱动环境,也可以作为烧录工具。(烧录教程:使用JLink J-Flash对STM32烧录固件简单说明_jlink烧录mcu供电_AhPhong的博客-CSDN博客

CP210x_Universal_Windows_Driver:USB串口驱动,主要是实体硬件与电脑连接时需要安装的驱动才能检测到实体驱动(安装教程windows11安装cp210x驱动-CSDN博客

 

2验证Unity与虚拟串口之间的通讯

2.1首先打开虚拟串口软件,点击AddPair,增加虚拟串口对,虚拟串口都是成对存在的

bec075edb54940e3a61f1444a2a8af99.png

4916796131d449579f594282f3635cd8.png

2.2然后打开虚拟串口调试工具窗口,这时已经出现我们刚刚创建的虚拟端口,我们这是需要确定,用Unity作为COM3,调试工具作为COM2进行通讯,因此这时,我们选择COM2,打开串口。波特率,数据为,停止位按照默认设置就好。

bdc3812e2d4846468e36ce576a3bfee9.png3476d777ef304c1a91b8e449ad3d3b2d.png

2.3在Unity实现数据发送,已经接收串口调试工具的数据。下面是代码演示,按照这样

SerialPortTest .cs

using UnityEngine;
using System.IO.Ports;
using System.Text;
using UnityEngine.UI;
using System;

public class SerialPortTest : MonoBehaviour
{
    private SerialPort sp = new SerialPort();   //串口初始化
    public Text m_TextSendDataPar;   //发送的内容
    public Text m_TextShowData;    ///接收到的内容显示

    // Use this for initialization
    void Start()
    {
        // 打开串口
        Init("COM3", 115200, Parity.None, 8, StopBits.One);   ///串口参数初始化

        // 启动协程处理接收数据
        StartCoroutine(DataReceivedCoroutine());     //异步接收消息,必须时异步才能接收,网上很多是直接订阅的,不能实现接收的
    }

    // 发送数据按钮
    public void Btn_SendData()
    {
        Data_Send(m_TextSendDataPar.text.ToString());     
    }

    // 初始化串口类
    public void Init(string _portName, int _baudRate, Parity _parity, int dataBits, StopBits _stopbits)
    {
        sp = new SerialPort(_portName, _baudRate, _parity, dataBits, _stopbits); // 绑定端口
        sp.Open();
    }

    // 接收数据的协程
    private System.Collections.IEnumerator DataReceivedCoroutine()
    {
       // Debug.Log("开始接收数据");
        while (true)
        {
            if (sp.IsOpen)
            {
                int count = sp.BytesToRead;
                if (count > 0)
                {
                    byte[] readBuffer = new byte[count];
                    try
                    {
                        sp.Read(readBuffer, 0, count);
                        DataProcessing(readBuffer); // 数据处理
                    }
                    catch (Exception ex)
                    {
                        Debug.Log(ex.Message);
                    }
                }
            }

            yield return null; // 等待一帧,进入下一次循环
        }
    }

    public void DataProcessing(byte[] data)
    {
        // 移除换行符和其他非数字字符
       // string cleanData = System.Text.RegularExpressions.Regex.Replace(Encoding.ASCII.GetString(data), @"\D", "");

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < data.Length; i++)
        {
            sb.AppendFormat("{0:x2}" + "", data[i]);
        }

        // 在主线程中更新文本组件
        UnityMainThreadDispatcher.Instance().Enqueue(() =>
        {
            m_TextShowData.text ="接收数据:"+ sb.ToString();
        });

        Debug.Log(sb.ToString());
    }

    // 发送数据
    public void Data_Send(string _parameter)
    {
        if (!sp.IsOpen)
        {
            Debug.Log("Serial port is not open.");
            return;
        }

        sp.WriteLine(_parameter);
    }
}

UnityMainThreadDispatcher.cs,,因为是异步接收的,必须跨线程操作处理接收到的数据

using UnityEngine;
using System.Collections.Generic;

public class UnityMainThreadDispatcher : MonoBehaviour
{
    private static bool applicationIsQuitting = false;  // 标志应用程序是否正在退出
    private static readonly object lockObject = new object();  // 用于线程同步的锁对象
    private static UnityMainThreadDispatcher instance = null;  // 单例实例
    private static List<System.Action> actionQueue = new List<System.Action>();  // 存储需要在主线程执行的操作的队列

    private void Awake()
    {
        instance = this;
    }

    private void OnDestroy()
    {
        applicationIsQuitting = true;
    }

    public static UnityMainThreadDispatcher Instance()
    {
        if (applicationIsQuitting)
        {
            return null;
        }

        lock (lockObject)
        {
            if (instance == null)
            {
                GameObject go = new GameObject("UnityMainThreadDispatcher");  // 创建一个游戏对象用于挂载脚本
                instance = go.AddComponent<UnityMainThreadDispatcher>();  // 给游戏对象添加UnityMainThreadDispatcher组件
                DontDestroyOnLoad(go);  // 防止加载新场景时销毁该游戏对象
            }
        }

        return instance;
    }

    public void Enqueue(System.Action action)
    {
        lock (actionQueue)
        {
            actionQueue.Add(action);  // 将操作添加到队列中
        }
    }

    private void Update()
    {
        lock (actionQueue)
        {
            for (int i = 0; i < actionQueue.Count; i++)
            {
                actionQueue[i].Invoke();  // 在主线程中执行队列中的操作
            }

            actionQueue.Clear();  // 清空队列
        }
    }
}

Unity界面设置 

c047fca3379745298945f0fc01784c6b.png

验证效果,这个时候,可以看到,在调试工具打开COM2和Unity运行了COM3,虚拟串口软件显示两个串口都已经被占用

2c0425b811694abe97c95f922223e230.png

发送接收消息,可以正常收发消息,这里数据接收不一样是因为发送的是16进制,而我没有处理收回来数据,显示为正常的字符串类型

e0a369adedd440418c38951eb1084657.png

到时,虚拟串口与Unity的通讯验证基本完毕了,也通过了测试,这时候,是可以删除掉虚拟串口的,因为连接硬件有实体串口。

 

删掉串口  点击这个删掉就好,如果不删除掉,他会与实体串口进行冲突,到时候实体串口就无法连接到电脑,所以必须删除掉

1d23a133e5cd4e0dbd0f281035dfb288.png

 

3准备下实体测试的环境,

3.1因为之前是走了弯路,装了STM32,下次直接装J-Link环境就好

按照教程安装

3.2安装USB串口驱动工具,也是按照教程进行安装

 

4硬件准备(我用的是百科荣创智能机器人开发平台),里面包含主控制板,拓展版,还要烧录器等等。接线必须按照以下接线方式

3fbf15ca48024c25a0034b577c908ab2.png

 

5烧录软件,一般烧录的软件是由单片机编程,编写出来的后缀为.hex的单片机程序

烧录的时候,然后插入下载口到usb口,2.0,3.0都可以,这时候烧录程序可以检测到实体端口COM3有出现的,这时候,按照烧录教程操作即可。

 

烧录完毕,屏幕一般会亮起来,然后屏幕左上角会出现一个红色的十字点,按照这个十字点,点一下,矫正屏幕,如果点击没有反应,那就拔掉电源,重新插上就可以点击了,然后校准后,屏幕白屏了

30574e317b8441f9a93debd649045f01.png

 

6,拔掉下载口,接上通讯口,这时,实体通讯口应该会出现在虚拟串口工具的显示板上

6136eea1c7294a53b407fefe5c847ca0.png

然后打开串口调试工具,打开COM3,打开串口,即可,这时,串口调试工具会出现接收到称重传感器持续输出的数据

接着在Unity中同样也是用COM3来进行监听,(注意,这里跟虚拟测试的时候不一样,虚拟用的是一对,实体串口和Unity检测用都是一个串口,这里要注意)

这时候,按压压力传感器,在unity就可以看到数据变化了。

 

验证通讯口是否连接,打开设备管理器,看奥这个端口这样显示,代表板子正常,如果来回拔插上电都没有出现,大概率就是板子有故障,或者接触不良,可以换一个板子测试下

de31add8db164876ad47858746a2c9c0.png

 

 

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一丁目赠我

谢谢你的打赏,感谢

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

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

打赏作者

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

抵扣说明:

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

余额充值