目录
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,增加虚拟串口对,虚拟串口都是成对存在的
2.2然后打开虚拟串口调试工具窗口,这时已经出现我们刚刚创建的虚拟端口,我们这是需要确定,用Unity作为COM3,调试工具作为COM2进行通讯,因此这时,我们选择COM2,打开串口。波特率,数据为,停止位按照默认设置就好。
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界面设置
验证效果,这个时候,可以看到,在调试工具打开COM2和Unity运行了COM3,虚拟串口软件显示两个串口都已经被占用
发送接收消息,可以正常收发消息,这里数据接收不一样是因为发送的是16进制,而我没有处理收回来数据,显示为正常的字符串类型
到时,虚拟串口与Unity的通讯验证基本完毕了,也通过了测试,这时候,是可以删除掉虚拟串口的,因为连接硬件有实体串口。
删掉串口 点击这个删掉就好,如果不删除掉,他会与实体串口进行冲突,到时候实体串口就无法连接到电脑,所以必须删除掉
3准备下实体测试的环境,
3.1因为之前是走了弯路,装了STM32,下次直接装J-Link环境就好
按照教程安装
3.2安装USB串口驱动工具,也是按照教程进行安装
4硬件准备(我用的是百科荣创智能机器人开发平台),里面包含主控制板,拓展版,还要烧录器等等。接线必须按照以下接线方式
5烧录软件,一般烧录的软件是由单片机编程,编写出来的后缀为.hex的单片机程序
烧录的时候,然后插入下载口到usb口,2.0,3.0都可以,这时候烧录程序可以检测到实体端口COM3有出现的,这时候,按照烧录教程操作即可。
烧录完毕,屏幕一般会亮起来,然后屏幕左上角会出现一个红色的十字点,按照这个十字点,点一下,矫正屏幕,如果点击没有反应,那就拔掉电源,重新插上就可以点击了,然后校准后,屏幕白屏了
6,拔掉下载口,接上通讯口,这时,实体通讯口应该会出现在虚拟串口工具的显示板上
然后打开串口调试工具,打开COM3,打开串口,即可,这时,串口调试工具会出现接收到称重传感器持续输出的数据
接着在Unity中同样也是用COM3来进行监听,(注意,这里跟虚拟测试的时候不一样,虚拟用的是一对,实体串口和Unity检测用都是一个串口,这里要注意)
这时候,按压压力传感器,在unity就可以看到数据变化了。
验证通讯口是否连接,打开设备管理器,看奥这个端口这样显示,代表板子正常,如果来回拔插上电都没有出现,大概率就是板子有故障,或者接触不良,可以换一个板子测试下