unity3D和串口之间的通信,接收下位机数据和发送指令

using UnityEngine;
using
System.Collections;
using
System.IO.Ports;
using
System;
using
System.Collections.Generic;
using
System.Threading;

public class PortControl : MonoBehaviour
{
public GUIText gui;
public string portName = "COM2";
public int baudRate = 9600;
public
Parity parity = Parity.None;
public
int dataBits = 8;
public StopBits
stopBits = StopBits.One;

int[]
data = new int[6];//用于存储6位数据
SerialPort sp = null;
Thread
dataReceiveThread;

//发送
string message =
"";
//byte[] message=new
byte[8];
void Start()
{
OpenPort();
dataReceiveThread = new Thread(new
ThreadStart(DataReceiveFunction));
dataReceiveThread.Start();
}

void Update()
{
string
str = "";
for(int i=0;
i<data.Length; i++)
{
str +=
data[i].ToString() + " ";
}
gui.text
= str;

Debug.Log(str);
}

public void OpenPort()
{
sp = new SerialPort(portName, baudRate, parity,
dataBits, stopBits);
sp.ReadTimeout =
400;
try
{
sp.Open();
}
catch(Exception ex)
{
Debug.Log(ex.Message);
}
}

public void ClosePort()
{
try
{
sp.Close();
}
catch(Exception ex)
{
Debug.Log(ex.Message);
}
}

public void WriteData(string
dataStr)
{
if(sp.IsOpen)
{
sp.Write(dataStr);
}

}

void OnApplicationQuit()
{
ClosePort
();
}


void
DataReceiveFunction()
{
byte[]
buffer = new byte[128];
int bytes =
0;
int flag0 = 0xFF;
int flag1 = 0xAA;
int
index = 0;//用于记录此时的数据次序
while
(true)
{
if
(sp != null && sp.IsOpen)
{
try
{
bytes = sp.Read(buffer, 0,
buffer.Length);
for(int i=0;
i<bytes; i++)
{

if(buffer[i]==flag0 ||
buffer[i]==flag1)
{
index = 0;//次序归0
continue;
}
else
{
if(index>=data.Length) index =
data.Length-1;//理论上不应该会进入此判断,但是由于传输的误码,导致数据的丢失,使得标志位与数据个数出错
data[index] = buffer[i];//将数据存入data中
index++;
}

}
}
catch (Exception ex)
{
if (ex.GetType() !=
typeof(ThreadAbortException))
{
Debug.Log(ex.Message);
}
}
}
Thread.Sleep(10);
}
}

void OnGUI()
{
message =
GUILayout.TextField(message);
if(GUILayout.Button("Send Message"))
{
WriteData(message);
}
string by= "XX AA 03 31 20 51 00
00";
if
(GUILayout.Button("Send",GUILayout.Height(50),GUILayout.Width(100)))
{

WriteData(by);

}
}

}

时间: 2024-10-13 16:02:03

unity3D和串口之间的通信,接收下位机数据和发送指令的相关文章

下位机数据接收十六进制写入文件

项目:实现can总线传感器  QN1161 测试上位机 要求:需要将接收的到数据写入到文件中 格式: 时间 + CAN ID + 数据: 如: 2015/4/22 11:45:18 0xF5F4EB18 03 EC 0D 0B 00 02 00 00 一.写入文件(追加方式) /// <summary> /// 写入文件 /// </summary> public void WriteFile(string strInfo) { FileStream fs = new FileSt

C#做一个简单的进行串口通信的上位机

C#做一个简单的进行串口通信的上位机 1.上位机与下位机 上位机相当于一个软件系统,可以用于接收数据.控制数据.即可以对接收到的数据直接发送操控命令来操作数据.上位机可以接收下位机的信号.下位机是一个控制器,是直接控制设备获取设备状况的计算机.上位机发出的命令首先给下位机,下位机再根据此命令解释成相应时序信号直接控制相应设备.下位机不时读取设备状态数据(一般为模拟量),转换成数字信号反馈给上位机.上位机不可以单独使用,而下位机可以单独使用. 2.串口通信 串口相当于硬件类型的接口.比如无线传感节

python全栈开发 * 进程之间的通信,进程之间数据共享 * 180726

进程之间的通信(IPC)队列和管道一.队列 基于管道实现 管道 + 锁 数据安全(一).队列 队列遵循先进先出原则(FIFO) 多用于维护秩序,买票,秒杀 队列的所有方法: put()(给队列里添加数据),put_nowait(), get()(从队列中获取数据),get_nowait(), 相同点:有值的时候取值 区别:get()没有值时会阻塞 get_nowait() 没有值时会报错 full()(返回布尔值),empty()(返回bool值), qsize()(队列大小) 示例: from

多线程之多窗口卖票&amp;线程之间的通信

案例一:使用多线程完成三个窗口卖票(不能出现重复卖票以及负数票) 卖票程序SellTicket 这里使用Lock类中的方法实现加锁和释放锁! package cn.itcast.thread2; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class SellTicket implements Runnable { private int ticke

不同VLAN之间相互通信的两种方式

(单臂路由.三层交换) 试验环境:东郊二楼第三机房 试验设备:Catalyst 2950-24(SW3) Cisco 2611(R2) Catalyst 3750 SERIES (带两个SD接口,S8----SW-2L) 真机(PC5.PC6). 试验目的: 1.通过单臂路由实现不同VLAN之间的通信 2.通过三层交换路由功能实现不同VLAN之间的通信 网络拓扑图: 1.单臂路由实现不同VLAN互通试验网络拓扑图 2.三层交换实现不同VLAN互通实验网络拓扑图 实验步骤: 单臂路由实现不同VLA

12.PMAC上位机-中断通信(下位机通知上位机)

之前说过,上位机控制硬件都是通过发送指令进行的,这是单向的.那么反过来,下位机硬件给上位机发送指令怎么才能实现呢?对于PMAC来说,最常见的情况就是,当PMAC一次运动完成时通知当前PC程序运动已完成. 1.下位机通知上位机原理 如下图所示, PC给PMAC发送指令控制它做什么,当运动程序完成后中断通知上位机,在中断的同时发送一个标识P100表明完成的程序号,这个标明到底是1号轴运动完,还是是2号轴运动完.在PC端有一个中断回调函数,下位机发送中断后,会自动跳转到该函数中,中断函数接受中断,根据

TCP带外数据学习总结(概念,发送接收过程,数据到达检测,代码实现)

最近在学习<Linux高性能服务器编程> 这本书,书中零零散散的讲了TCP带外数据的一些知识,在这里把这些知识总结以下,方便自己,也方便他人. 本文主要分为以下四个方面总结,分别为 TCP带外数据的概念,如何发送和接收带外数据,怎么检测带外数据的到达,最后介绍相关函数以及代码实现. 第一部分: TCP带外数据的概念 有很多传输层此协议都具有带外数据(OUT Of Band) 的概念,其作用是迅速通告通信的另一方本段发生的重要事件.带外数据具有比普通数据更高的优先级,理论上应该被立即发送和立即接

【Android开发—智能家居系列】(四):UDP通信发送指令

思路回顾 [1]手机连接WIFI模块 [2]UDP通信对WIFI模块发送指令,以和WIFI模块保持连接状态 [3]UDP通信对WIFI模块发送指令,让其搜索可用的无线网,返回WIFI列表 [4]发送指令,让WIFI模块接入指定路由 [5]手机连接路由 [6]发送指令,获得WIFI模块的动态IP地址 UDP通信线程类 package com.jczb.smartlife.common; import java.io.IOException; import java.net.DatagramPack

【Unity3D技巧】在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信

作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 引子 在前面两篇文章: [Unity3D基础教程]给初学者看的Unity教程(四):通过制作Flappy Bird了解Native 2D中的RigidBody2D和Collider2D [Unity3D基础教程]给初学者看的Unity教程(三):通过制作Flappy Bird了解Native 2D中的Sprite,Animation 我们了解