接收串口
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO.Ports;
using System;
using System.Threading;
using System.Text;
using UnityEngine.UI;
public class Arduino : MonoBehaviour
{
[Header("串口名")] public string portName;
[Header("波特率")] public int baudRate = 9600;
[Header("效验位")] public Parity parity = Parity.None;
[Header("数据位")] public int dataBits = 8;
[Header("停止位")] public StopBits stopBits = StopBits.One;
private SerialPort sp = null;
private Thread receiveThread; //用于接收消息的线程
private byte[] datasBytes;
int i = 0;
private string OneString;
private string OtherString;
public String strRec;
public bool isRec = false;
private void Awake()
{
Screen.fullScreen = false;
}
void Start()
{
//从配置文件获取串口名称
portName = IniReadInfo.instance.SerialPort;
switch (GetArduinoBoardPort(portName))
{
case "COM1":
OpenPort();
break;
case "COM2":
OpenPort();
break;
case "COM3":
OpenPort();
break;
case "COM4":
OpenPort();
break;
case "COM5":
OpenPort();
break;
case "COM6":
OpenPort();
break;
case "COM7":
OpenPort();
break;
default:
break;
}
}
void Update()
{
if (OneString == "1" && isRec == false)
{
isRec = true;
InvokeRepeating("CountDown", 1, 1);
UDPClient.instacne.SocketSend("0");
}
if (OneString == "0" && isRec == true)
{
CancelInvoke("CountDown");
isRec = false;
UDPClient.instacne.SocketSend("1");
}
// switch (OneString)
// {
// case "1":
// Titletext.text = "装置已触发";
// break;
// case "0":
// Titletext.text = "装置未触发";
// break;
// default:
// break;
// }
if (timer - countStartTime >= time)
{
timer = 0;
Debug.Log("五秒内摸了5次");
CancelInvoke("CountDown");
return;
}
}
void FixedUpdate()
{
//定期回收垃圾
if (Time.frameCount % 120 == 0)
{
System.GC.Collect();
}
}
#region 创建串口,并打开串口
public void OpenPort()
{
//创建串口
sp = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
// sp.ReadTimeout = 200;
if (!sp.IsOpen)
{
sp.Open();
}
receiveThread = new Thread(ReceiveThreadfunction);
receiveThread.IsBackground = true;
receiveThread.Start();
}
#endregion
#region 程序退出时关闭串口
void OnApplicationQuit()
{
ClosePort();
}
public void ClosePort()
{
if (sp != null && sp.IsOpen)
{
//关闭串口
sp.Close();
//将串口从内存中释放
sp.Dispose();
//关闭线程
receiveThread.Abort();
}
}
#endregion
/// <summary>
/// 接收串口数据
/// </summary>
private void ReceiveThreadfunction()
{
int bytesToRead = 0;
while (true)
{
if (this.sp != null && this.sp.IsOpen)
{
try
{
datasBytes = new byte[1024];
bytesToRead = sp.Read(datasBytes, 0, datasBytes.Length);
if (bytesToRead == 0)
{
continue;
}
else
{
strRec = Encoding.UTF8.GetString(datasBytes);
i++;
if (i == 1)
{
OneString = strRec[0].ToString();
}
else if (i == 2)
{
OtherString = OneString + strRec;
i = 0;
Debug.Log(OneString);
}
// this.sp.DiscardInBuffer();
}
/* strRec = sp.ReadLine(); */
// Debug.Log("Receive From Serial: " + strRec);
// Debug.Log(strRec);
}
catch (Exception e)
{
Debug.Log(e.Message);
}
}
Thread.Sleep(100);
}
}
private string GetArduinoBoardPort(string sArduinoBoardName)
{
string sArduinoBoardPort = "";
// 遍历所有端口
foreach (string item in SerialPort.GetPortNames())
{
if (item.Equals(sArduinoBoardName))
{
sArduinoBoardPort = item;
Debug.Log("找到当前单片机连接的端口: " + item);
}
}
return sArduinoBoardPort;
}
public float time = 2f; //倒计时总时间
float countStartTime = 0f;
int timer = 0;
void CountDown()
{
// isJishi = true;
timer++;
}
}
UDP发送
using UnityEngine;
using System.Collections;
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
public class UDPClient : MonoBehaviour
{
public static UDPClient instacne;
//服务端的消息
public string recvStr;
//要连接的服务端的Ip
public string UDPClientIP="";
public int SeverIPPort;
// string str = "1231456789";
Socket socket;
EndPoint serverEnd;
IPEndPoint ipEnd;
byte[] recvData = new byte[1024];
byte[] sendData = new byte[1024];
//消息长度
int recvLen = 0;
Thread connectThread;
private void Awake()
{
instacne = this;
}
void Start()
{
//从配置文件里获取
SeverIPPort=IniReadInfo.instance.ServerPort;
//从配置文件取地址
UDPClientIP = IniReadInfo.instance.ServerAdressIP;
UDPClientIP = UDPClientIP.Trim();
InitSocket();
}
void InitSocket()
{
ipEnd = new IPEndPoint(IPAddress.Parse(UDPClientIP), SeverIPPort);
socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
serverEnd = (EndPoint)sender;
print("等待连接");
SocketSend("666");
print("连接");
//开启一个线程连接
// connectThread = new Thread(new ThreadStart(SocketReceive));
// connectThread.Start();
}
public void SocketSend(string sendStr)
{
//清空
sendData = new byte[1024];
//数据转换
sendData = Encoding.UTF8.GetBytes(sendStr);
//发送给指定服务端
socket.SendTo(sendData, sendData.Length, SocketFlags.None, ipEnd);
// PhotoBoothController.instance.SendMessages = true;
//sendData = Encoding.UTF8.GetBytes("S");
发送给指定服务端
//socket.SendTo(sendData, sendData.Length, SocketFlags.None, ipEnd);
// SendMessages = false;
}
//接收服务器信息
void SocketReceive()
{
while (true)
{
recvData = new byte[1024];
try
{
recvLen = socket.ReceiveFrom(recvData, ref serverEnd);
}
catch (Exception e)
{
}
// print("信息来自: " + serverEnd.ToString());
if (recvLen > 0)
{
recvStr = Encoding.UTF8.GetString(recvData, 0, recvLen);
Debug.Log("得到服务端的消息:" + recvStr);
}
// print(recvStr);
}
}
//连接关闭
void SocketQuit()
{
//关闭线程
if (connectThread != null)
{
connectThread.Interrupt();
connectThread.Abort();
}
//最后关闭socket
if (socket != null)
socket.Close();
}
void OnApplicationQuit()
{
SocketQuit();
}
}