关于unity使用串口的一些浅显了解
一、串口是什么?
串行接口(Serial port)又称“串口”,也称串行通信接口(通常指COM接口),是采用串行通信方式的扩展接口。常见的有一般电脑应用的RS-232(使用 25 针或 9 针连接器)和工业电脑应用的半双工RS-485与全双工RS-422。
以我的经历来看,比较多的接触到的连接方式有rs232线、rs485线、usb转串口。一般串口服务器提供rs232和rs485两种连接方式、如果电脑直连设备的话就用usb转串口。
二、上代码
1.引入命名空间
using System.IO.Ports;
常用方法:
Close:关闭端口连接,将IsOpen属性设置false,并释放内部Stream对象
GetPortNames:获取当前计算机的串行端口名称数组
Open:打开一个新的串行端口连接
Read:从SerialPort输入缓冲区中读取 (1)接收字符串(string):port.ReadLine() 数据接收可能错误,数据丢失,数据接收不到 (2)接收字节数组(byte[]):port.Read() 接收数据断层,会分两次接收完整数据 (3)接收单个字节(byte):port.ReadByte()
将接收到的数据进行组合
Write:将数据写入串行端口输出缓冲区
private string portName= "\\\\.\\COM54";
public int baudRate = 9600;
public Parity parity = Parity.None;
public int dataBits = 8;
public StopBits stopBits = StopBits.One;
SerialPort sp = null;
public void OpenPort()
{
sp = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
sp.ReadTimeout = 400;
try
{
if(!sp.IsOpen)
sp.Open();
}
catch (Exception ex)
{
Debug.Log(ex.Message);
}
}
public void ClosePort()
{
try
{
if(sp.IsOpen)
sp.Close();
}
catch (Exception ex)
{
Debug.Log(ex.Message);
}
}
void OnApplicationQuit()
{
ClosePort();
}
#region 发送数据
public void WriteData(byte data)
{
if (sp.IsOpen)
{
sp.Write(data,0,data.length);
}
}
#endregion
#region 接收数据
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);
if (bytes == 0)
{
continue;
}
else
{
string strbytes = Encoding.Default.GetString(buffer);
Debug.Log(strbytes);
}
}
catch (Exception ex)
{
if (ex.GetType() != typeof(ThreadAbortException))
{
}
}
}
Thread.Sleep(10);
}
#endregion
}
#endregion
2.注意事项
将Unity3D的API平台切换成.NET2.0,否则Unity编写SerialPort类会报错。 一般发送串口信息,使用byte数组的方式比较稳妥(个人认为)
还有就是一般以16进制形式发送比较稳妥(个人认为)
Byte[] temple = { 0xA5, 0x06, 0xFF, 0xA0, 0xFF, 0x00, 0x00, 0xEE, 0x5A };
或者
string _hex16String="a5 08 ff a1 01 01 01 00 ff ee 5a"
public byte[] Hex16StringToHex16Byte(string _hex16String)
{
_hex16String = _hex16String.Replace(" ", "");
if (_hex16String.Length / 2 == 0)
{
_hex16String += " ";
}
byte[] buffer = new byte[_hex16String.Length / 2];
for (int i = 0; i < buffer.Length; i++)
{
buffer[i] = Convert.ToByte((_hex16String.Substring(i * 2, 2)), 16);
}
return buffer;
}
总结
这里我总结的是,主要用于做过的控制rgb调色模块,串口继电器模块,拉力测试读取,如有偏颇请各位大佬指正。
|