• 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);
    }
    }

    }

  • 相关阅读:
    漫谈委托和事件
    CSS从今以后不用发愁
    分享我对领域驱动设计(DDD)的学习成果
    [转]使用CSS3实现树形控件
    Golang 常量
    牛客网做算法题时 golang 读取输入的方法
    Golang 占位符
    Golang 字符和字符串的区别
    Golang 基本数据类型
    Golang 输入
  • 原文地址:https://www.cnblogs.com/FLWL/p/3710720.html
Copyright © 2020-2023  润新知