? ? ? ? 最近一直研究硬件,经常和各种开发板或单片机打交道,需要通过串口或者Tcp/Udp来发送和接收数据。Unity提供了一个SerialPort库可以进行串口通讯,但是在使用过程中发现会丢包或者粘包,令人头秃。
? ? ? ? 最近找到一位大佬自己封装的串口通讯的库。原本版本没有Hex发送和接收。略微改动,就有了现在的这一版。
代码如下:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
using UnityEngine.UI;
public class SerialTest : MonoBehaviour
{
/// <summary>
/// 串口端口号
/// </summary>
[SerializeField, Tooltip("串口端口号")]
private string PortName;
/// <summary>
/// 串口端口号
/// </summary>
[SerializeField, Tooltip("波特率")]
private int BaudRate;
/// <summary>
/// 串口类
/// </summary>
[SerializeField]
private MySerialPort myserial;
/// <summary>
/// 数据读取存储
/// </summary>
private byte[] buffers = new byte[1024];
/// <summary>
/// 存储串口读取数据
/// </summary>
private string str;
public Text _txt;
private void Start()
{
//初始化端口,端口号,位数,奇偶校验,停止位
myserial = new MySerialPort(PortName, BaudRate, Parity.None, StopBits.One);
//打开端口
myserial.Open();
}
private void FixedUpdate()
{
int readnum = myserial.Read(buffers);
//接收普通字符串 Encoding.UTF8 Encoding.GetEncoding("GB2312")
//str = System.Text.Encoding.ASCII.GetString(buffers);
//接收Hex十六进制字符
str = HexToStr(buffers);
//判空,当读取字符串不为0时执行
if (readnum != 0)
{
try
{
Debug.Log("串口接收消息为:" + str);
_txt.text += str + " \n";
str = "";
}
catch (Exception ex)
{
Debug.LogError(ex.GetType() + str);
}
}
}
public void SendHexMsg(string msg)
{
myserial.Write(StrToHex(msg));
}
public void SendMsg(String msg)
{
myserial.Write(Encoding.ASCII.GetBytes(msg));
}
private byte[] StrToHex(string strText)
{
strText = strText.Replace(" ", "");
byte[] bText = new byte[strText.Length / 2];
for (int i = 0; i < strText.Length / 2; i++)
{
bText[i] = Convert.ToByte(Convert.ToInt32(strText.Substring(i * 2, 2), 16));
}
return bText;
}
public string HexToStr(byte[] data)
{
StringBuilder sb = new StringBuilder(data.Length * 3);
foreach (byte b in data)
{
sb.Append(Convert.ToString(b, 16).PadLeft(2, '0'));
if (sb.Length == 18)//自己选择需要的长度 不然会有很多00000
break;
}
return sb.ToString();
}
/// <summary>
/// 退出程序时关闭串口
/// </summary>
private void OnApplicationQuit()
{
myserial.Close();
Debug.Log("[SerialPort] Close");
}
}
? ?Str测试截图
? ?Hex测试截图
?
????????这个代码中有HexToStr和StrToHex,需要的小伙伴也可以直接复制使用。需要Demo的童鞋可以去这里下载demo运行下载链接
附:串口调试需要串口调试助手,百度上有很多。随意下载,均可使用。
还有一种可在本机上进行串口测试的方法,使用虚拟串口工具,创建虚拟串口进行调试,可以加快开发速度。需要的童鞋自行下载
|