用的WEGASUN-M6语音识别模块,有两对串口,因其发出的都是十六进制字节,经过测试上一篇https://blog.csdn.net/weixin_44345862/article/details/97368139 “Unity3D与arduino串口通讯”中的readline方法(读字符串用的)在这里无法使用。所以串口交互代码也有所改变。
模块设置的控制词如下:
Unity3D元素,可实现前进,后退,左转,右转。两个模型可以同时覆上串口控制程序,但前面的cube受控正常,熊猫只绕某一个轴旋转,不受控。
代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO.Ports;
using System;
using System.Threading;
using System.Text;
public class Serialreadtest : MonoBehaviour
{
private SerialPort sp;
private Thread receiveThread; //用于接收消息的线程
private Thread sendThread; //用于发送消息的线程
public string portName = "COM6";//串口名
public int baudRate = 9600;//波特率
public Parity parity = Parity.None;//效验位
public int dataBits = 8;//数据位
public StopBits stopBits = StopBits.One;//停止位
byte inputvalue=0;
public float speed = 8;
void Start () {
OpenPort();
receiveThread = new Thread(ReceiveThreadfunction);
receiveThread.IsBackground = true;
receiveThread.Start();
}
// Update is called once per frame
void Update () {
Vector3 transformValue = new Vector3();//定义平移向量
transformValue = Vector3.left * 0;
int rotateValue = 1;
int state = 0;
// transform.animation.Play("walk");//播放角色行走动画
if (inputvalue == 0x03)
{
state = 3;
Debug.Log("go ahead ");
}
if (inputvalue == 0x04)
{
state = 4;
Debug.Log("go back ");
}
if (inputvalue == 0x05)
{
state = 5;
Debug.Log("turn left ");
}
if (inputvalue == 0x06)
{
state = 6;
Debug.Log("turn right ");
}
if (inputvalue == 0x07)
{
state = 7;
Debug.Log("stop ");
}
switch (state)
{
case 3://角色状态向前时,角色不断向前缓慢移动
transformValue = Vector3.forward * Time.deltaTime * speed;
break;
case 4://角色状态向后时。角色不断向后缓慢移动
transformValue = Vector3.back * Time.deltaTime * speed;
break;
case 5://角色状态向右时。角色不断向右缓慢移动
transformValue = Vector3.right * Time.deltaTime * speed;
break;
case 6://角色状态向左时,角色不断向左缓慢移动
transformValue = Vector3.left * Time.deltaTime * speed;
break;
case 7://角色状态向左时,角色不断向左缓慢移动
transformValue = Vector3.left * 0;
break;
}
// transform.Rotate(Vector3.up, rotateValue);//旋转角色
transform.Rotate(Vector3.left, rotateValue);//旋转角色
transform.Translate(transformValue, Space.World);//平移角色
}
#region 创建串口,并打开串口
public void OpenPort()
{
//创建串口
sp = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
sp.ReadTimeout = 400;
try
{
sp.Open();
}
catch (Exception ex)
{
Debug.Log(ex.Message);
}
}
#endregion
#region 程序退出时关闭串口
void OnApplicationQuit()
{
ClosePort();
}
public void ClosePort()
{
try
{
sp.Close();
receiveThread.Abort();
}
catch (Exception ex)
{
Debug.Log(ex.Message);
}
}
#endregion
private void ReceiveThreadfunction()
{
byte[] buffer = new byte[128];
int bytes = 0;
while (true)
{
if (this.sp != null && this.sp.IsOpen)
{
/* try
{
String strRec = sp.ReadLine(); //SerialPort读取数据有多种方法,我这里根据需要使用了ReadLine()
Debug.Log("Receive From Serial: " + strRec);
}
*/
try
{
bytes = sp.Read(buffer, 0, buffer.Length);
for (int i = 0; i < bytes; i++)
{
inputvalue = buffer[i];
Debug.Log("Receive From Serial: " + buffer[i]);
}
}
catch
{
//continue;
}
}
}
}
}