游戏蛮牛学习群(纯技术交流,不闲聊):539178957
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

问答求助

关注:547

当前位置:游戏蛮牛 技术专区 问答求助

_____________________________________________________________________________________________________________
问答求助版块规则:

  1、问题尽量描述清楚
      2、代码要放在代码块里
      3、附件最好放到云盘,然后把链接放到TXT文档里,上传TXT文档。【最好没有附件,你懂得】
      4、本版块回复不得无意义,如:顶、呵呵、不错......以及擦边!【真的会扣分的哦】严重者,封IP!
      5、问题得到解决,请选择最佳答案。
      6、若问题是你自己解决了,可以联系管理员,返还蛮牛币,写下你的答案,另有蛮牛币奖赏。
_____________________________________________________________________________________________________________
查看: 234|回复: 1

[其他] Unity串口通讯的问题 求解答

[复制链接]  [移动端链接]

3

主题

9

帖子

24

积分

Rank: 1

UID
260293
好友
0
蛮牛币
3
威望
0
注册时间
2017-12-19
在线时间
12 小时
最后登录
2018-5-7
发表于 2018-4-26 15:12:42 | 显示全部楼层 |阅读模式
5蛮牛币
与PLC通讯,就是Unity刚运行的时候,Write_aLine(0x010000);这一步可以运行
但是Byte[] cmd = new Byte[10];
cmd[0] = 0x24;
cmd[1] = 0x00;
cmd[2] = 0x04;
cmd[3] = 0x00;
cmd[4] = 0x00;
cmd[5] = 0x00;
cmd[6] = 0x00;
cmd[7] = 0x00;
cmd[8] = 0x03;
cmd[9] = 0x23;
sp.Write(cmd, 0, 10); 这一步的时候 出问题了  不知道是发不出去还是怎么的  理应发出这个数后 PLC收到会回馈给UNITY一个数 但是现在收不到。。。
求大佬给些建议...



[C#] 纯文本查看 复制代码
using UnityEngine;
using System.Collections;
using System.IO.Ports;
using System;
using System.Collections.Generic;
using System.Threading;
using UnityEngine.UI;

public class PLCzidong : MonoBehaviour
{

    //定义基本信息  
    public string portName = "COM8";
    public int baudRate = 9600;
    public Parity parity = Parity.None;
    public int dataBits = 8;
    public StopBits stopBits = StopBits.One;
 
    SerialPort sp = null;
    Thread dataReceiveThread;
    public string[] str_Unit = new string[10];
    public string str_Date = null;
    public static bool zidong;
    public bool peng2;

    void Start()
    {
        gunZiCollide.isPresentation = true;
    }

    void Update()
    {
        string str = "";
        for (int i = 0; i < 10; i++)
        {
            str += str_Unit[i];
        }

        FasongClick();
        if (dong_QiangB.Pengzhuang3 == true && peng2 == true)  //当AB枪碰撞进行下一步
        {
            zidong = false;
            dong_QiangB.Pengzhuang3 = false;
            Byte[] cmd = new Byte[10]; 
            cmd[0] = 0x24;
            cmd[1] = 0x00;
            cmd[2] = 0x04;
            cmd[3] = 0x00;
            cmd[4] = 0x00;
            cmd[5] = 0x00;
            cmd[6] = 0x00;
            cmd[7] = 0x00;
            cmd[8] = 0x03;
            cmd[9] = 0x23;
            sp.Write(cmd, 0, 10);      //这里有问题
            Debug.Log("daoci");
        }
        if (dong_QiangB.Bguiwei == true && peng2 == true)  //B枪归位 A枪也停止 切割完毕
        {
            GameObject.Find("qiege").SendMessageUpwards("GetData", "10000");
            dong_QiangB.Bguiwei = false;
            peng2 = false;
        }
    }

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

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

    void OnApplicationQuit()
    {
        ClosePort();
    }
    public void FasongClick()
    {
        string str_TheState = null;
        str_TheState = str_Unit[2] + str_Unit[1];

        for (; str_TheState.Length < 5; )
        {
            str_TheState = "0" + str_TheState;
        }
        if (zidong == true)
        {
            GameObject.Find("qiege").SendMessage("GetData", str_TheState);
        }
        GameObject.Find("Canvas/Jieshou").GetComponent<Text>().text = str_TheState;
    }
    public void KaishizidongClick()
    {
        zidong = true;
        OpenPort();
        dataReceiveThread = new Thread(new ThreadStart(DataReceiveFunction));
        dataReceiveThread.Start();
        Write_aLine(0x010000);
        peng2 = true;
    }
    public void StopzhuanjieClick()
    {
        zidong = false;
        Write_aLine(0x008000);
        ClosePort();
        GameObject.Find("qiege").SendMessage("GetData", "10000");
    }
    public void Write_aLine(Int64 SenData)//写入一行 发送字节数据
    {
        try
        {
            Byte[] Sendbyte = new Byte[10];
            Sendbyte[0] = 0x24;
            Sendbyte[1] = (Byte)SenData;                   //
            Sendbyte[2] = (Byte)(SenData >> 8);
            Sendbyte[3] = (Byte)(SenData >> 16);
            Sendbyte[4] = (Byte)(SenData >> 24);
            Sendbyte[5] = (Byte)(SenData >> 32);
            Sendbyte[6] = (Byte)(SenData >> 40);
            Sendbyte[7] = (Byte)(SenData >> 48);
            Sendbyte[8] = (Byte)(SenData >> 56);
            Sendbyte[9] = 0x23;
            sp.Write(Sendbyte, 0, 10);//写入10个字节数组,从偏移地址0开始
        }
        catch (Exception er)
        {
            Debug.Log(er.Message);
        }
    }

    void DataReceiveFunction()
    {
        string str_Date_temp = null;
        while (sp.IsOpen)
        {
            try
            {
                str_Unit[0] = Convert.ToString(sp.ReadByte(), 16);//读取输入缓冲区              
                if (str_Unit[0] == "24")//$
                {
                    for (int i = 1; i < 9; i++)
                    {

                        str_Unit[i] = Convert.ToString(sp.ReadByte(), 16);
                        if (str_Unit[i].Length < 2)
                            str_Unit[i] = "0" + str_Unit[i]; //补零                          
                    }
                    str_Unit[9] = Convert.ToString(sp.ReadByte(), 16);
                    if (str_Unit[9] == "23")//#
                    {
                        for (int i = 1; i < 9; i++)
                        {
                            str_Date_temp = str_Date_temp + str_Unit[i];
                        }

                        if (str_Date != str_Date_temp)
                        {
                            str_Date = str_Date_temp;
                        }
                        str_Date_temp = null;
                    }
                }
            }
            catch (Exception ex)
            {
                if (ex.GetType() != typeof(ThreadAbortException))
                {
                    Debug.Log(ex.Message);
                }
            }
        }
        //sp.DiscardInBuffer();    
        Thread.Sleep(10);
    }
}



回复

使用道具 举报

2初来乍到
104/150
排名
17121
昨日变化
6

0

主题

24

帖子

104

积分

Rank: 2Rank: 2

UID
206532
好友
0
蛮牛币
47
威望
0
注册时间
2017-2-14
在线时间
48 小时
最后登录
2018-6-14
发表于 2018-5-8 16:40:00 | 显示全部楼层
unity与PLC通信成功了吗

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表