专栏首页Unity TechnologyJtro的技术分享:unity的串口通讯

Jtro的技术分享:unity的串口通讯

今天一天时间都在面向Google编程.这也蛮头疼的,哈哈

串行接口(串口)通常指COM接口,是采用串行通信方式的扩展接口。串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。特别适用于无网络通信。软硬件结合. 首先需要一块硬件开发同学的一块板子,里面刷好了他预制的"系统",然后给你一份测试说明:

然后你还需要一个串口测试工具,这个工具我会放在下方评论区 按照硬件开发同学约定好的,设置串口通讯工具的配置,点击"手动发送",即可看到返回的消息

到这里,确定这个串口通讯正常.

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

public class PortController : MonoBehaviour
{ 
    //public GUIText gui;
    //定义基本信息
    public string portName = "COM3";
    public int baudRate = 115200;
    public Parity parity = Parity.None;
    public int dataBits = 8;
    public StopBits stopBits = StopBits.One;

    public string[] data;//用于存储6位数据
    SerialPort sp = null;//串口控制
    Thread dataReceiveThread;
    //发送
    string message = "";

    string filename;
    //byte[] message=new byte[8];
    void Start()
    {

        filename = Application.dataPath + @"\StreamingAssets\配置文件.txt";
        portName = ReadALine(filename, 1);
        baudRate = int.Parse(ReadALine(filename, 3));


        OpenPort();//打开串口
        dataReceiveThread = new Thread(new ThreadStart(DataReceiveFunction));//数据接收线程
        dataReceiveThread.Start();

        WriteData(strToToHexByte("01 03 00 00 00 03 05 CB "));
    }

    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 WriteData(byte[] bys)
    {
        if (sp.IsOpen)
        {
            sp.Write(bys, 0, bys.Length);
            Debug.Log("发送完成");
        }
    }

    void OnApplicationQuit()
    {
        ClosePort();
    }

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

    //数据接收功能
    void DataReceiveFunction()
    {
        byte[] buffer = new byte[128];
        int bytes = 0;
        //定义协议
        //int flag0 = 0xFF;
        //int flag1 = 0xAA;
        int index = 0;//用于记录此时的数据次序
        while (true)
        {
            Thread.Sleep(100);
            if (sp != null && sp.IsOpen)
            {
                try
                {
                    bytes = sp.Read(buffer, 0, buffer.Length);
                    data = new string[bytes];
                    for (int i = 0; i < bytes; i++)
                    {
                        data[index] = buffer[i].ToString("X2");
                        index++;
                    }
                    Debug.Log(buffer[0]);
                    Debug.Log(data[0]);

                    //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)
                {
                    Debug.Log(ex.Message);
                    if (ex.GetType() != typeof(ThreadAbortException))
                    {
                    }
                }
            } 
        }
    }
    public string ReadALine(string FileName, int linenumber) // 参数1:打开的文件(路径+文件命),参数2:读取的行数
    {
        string[] strs = File.ReadAllLines(FileName);
        if (linenumber == 0)
        {
            return "0";
        }
        else
        {
            return strs[linenumber];
        }
    }
    private static byte[] strToToHexByte(string hexString)
    {
        hexString = hexString.Replace(" ", "");
        if ((hexString.Length % 2) != 0)
            hexString += " ";
        byte[] returnBytes = new byte[hexString.Length / 2];
        for (int i = 0; i < returnBytes.Length; i++)
            returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);   
        return returnBytes;
    }
    IEnumerator Wirte(byte[] bsy)
    {
        yield return new WaitForSeconds(0.5f);
        WriteData(bsy);
    }
}

注意,这里只是hex格式的数据文件,也就是16进制的格式,其他格式的用到了我在更新.

运行之后的结果:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Jtro的技术分享:游戏客户端与服务器(c#)通讯_异步Socket

    首先跟大家道个歉,上一个同步Socket文章里用的不是Markdown编写的,所以代码看起来不是很清爽,我用的鹅厂的浏览器,终于发现是浏览器的锅,图片拖不上去 ...

    LittleU
  • Jtro的技术分享:unity接入百度语音识别SDK

    首先,你要去百度申请一个百度的AI开放平台的账号:https://ai.baidu.com/?track=cp:aipinzhuan|pf:pc|pp:AIpi...

    LittleU
  • Jtro的技术分享:Unity解析json文件(分为json与jsonArray)

    JSON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度,

    LittleU
  • 策略模式及其与简单工厂模式的区别

    The strategy pattern(also known as the policy pattern) is a behavioural software...

    用户2434869
  • 《项目架构那点儿事》——工具类,你喜欢你就拿去

    【前言】众所周知,各式各样的Util类为我们提供了便利,也同时减少了我们对底层硬编码的时间,包括对字符串的操作,文件操作,反射的操作,泛型的操作,以及熟知 的分...

    I Tech You_我教你
  • 漫画:贼简单的题目,但百分之99%的人都不会

    为大家分享一道本应很简单的题目,但是却因增加了特殊条件,而大幅增加了难度。话不多说,直接看题。

    五分钟学算法
  • SpringBoot结合策略模式实战套路

    我们都知道设计模式好,可以让我们的代码更具可读性,扩展性,易于维护,但大部分程序猿一开始都学过至少一遍设计模式吧,实战中不知用到了几成。接下来让我介绍一个结合S...

    老梁
  • 漫画:贼简单的题目,但百分之99%的人都不会

    今天是小浩算法“365刷题计划”第53天。为大家分享一道本应很简单的题目,但是却因增加了特殊条件,而大幅增加了难度。话不多说,直接看题。

    程序员小浩
  • 如何比较?Comparable还是Comparator

    我家开了个小卖店,为了实现数字化管理,我准备写个后台程序来对所有货物进行管理。首先定义了这个实体类,这个类就是“货物”类,num指的是他的编号,s指他的名称或描...

    naget
  • 探索c#之不可变数据类型

    蘑菇先生

扫码关注云+社区

领取腾讯云代金券