<address id="fblfv"><form id="fblfv"></form></address>

    <noframes id="fblfv"><address id="fblfv"><nobr id="fblfv"></nobr></address>
    <span id="fblfv"></span>

         找回密碼
         注冊帳號

        掃一掃,訪問微社區

        Like Unity串口通信詳解,附源碼!

        20
        回復
        6411
        查看
        打印 上一主題 下一主題
        [ 復制鏈接 ]
        排名
        64951
        昨日變化

        5

        主題

        49

        帖子

        1021

        積分

        Rank: 9Rank: 9Rank: 9

        UID
        354297
        好友
        0
        蠻牛幣
        459
        威望
        0
        注冊時間
        2020-11-3
        在線時間
        962 小時
        最后登錄
        2021-8-18

        馬上注冊,結交更多好友,享用更多功能,讓你輕松玩轉社區。

        您需要 登錄 才可以下載或查看,沒有帳號?注冊帳號

        x
        【前言

        實習生第一份工作做的是街機游戲,看到自己開發游戲給很多小孩子玩,爺的青春也就結束了,因為這一片都是做街機、VR,所以會接觸到很多關于硬件設備的通信,到現在為止,還是挺喜歡這種基于硬件的游戲開發,做街機的時候,沒做多久,所以當初最遺憾的事情就是沒有學會串口通信,到現在為止,串口覺得也就是一個收發消息的集成類。

        懶的話可以直接下載使用,直接拖進Asset里,附上碼云鏈接::https://gitee.com/likeji/unity-serial-communication


        【對于剛接觸串口的同學們來說

        一定要了解串口的幾個屬性和串口接收助手的使用,串口的屬性在串口助手面板也有所體現,需要設置才能打開串口,完成連接。
        如果沒有串口設備想了解串口通信的話,可以使用串口模擬消息接收,相關鏈接:https://www.hd2y.net/archives/the-debugging-and-development-of-serial-communication

        以下我們都是通過實際開發串口通信來說明:
        串口的幾個屬性,一定要與之對應才能正確連接,一般來說,硬件沒有做特殊設置,只需要設置串口名,其他保持默認就行了





        串口接收助手下載鏈接:鏈接:https://pan.baidu.com/s/1aPfa7u_RKvfaGicMno3Vfg
        提取碼:ui2r

        在做項目時,先使用串口接收助手方便接收串口數據,這樣可以用現成的工具先檢測串口設備的收發信息的狀況,如果通信良好,則開始程序的編寫了。


        【串口通信的程序編寫,無碼何以平天下,Show Me Code~

        一.先展示一下我們的手柄(有兩個按鈕+前后左右的遙感功能)


        二.插上我們的串口設備之后,然后在我的電腦-屬性-設備管理器中查看當前插入的串口設備號(COM*),當前我的串口設備名是COM3



        三.開始編寫串口通信的類
        1.首先定義我們的設備的輸入按鈕,方便后面判斷輸入調用
        public enum KeyType { 圓形按鈕 方形按鈕 前 后 左 右 }//按鈕   
        public KeyType keyType;

        2.定義我們的串口屬性變量,建議串口屬性使用配置文件來管理方便適配不同的串口設備

        public string portName =\\\"COM3\\\";
        public int baudRate = 9600;
        public int dataBits = 8;
        public StopBits stopBits = StopBits.None;
        public Parity parity = Parity.None;


        3.Start里打開串口和開啟線程處理串口消息

        void Start()
        {
        OpenPort();//打開串口
        thread_reviceData = new Thread(new ThreadStart(DataReviceThread));
        thread_reviceData.Start();//開啟接收線程
        }


        4.打開串口和關閉串口的方法,關閉串口一般用于關閉程序之后調用
        void OpenPort()
        {
        print(\\\"打開串口\\\");
        try
        {
        serialPort = new SerialPort(portName baudRate parity dataBits stopBits);
        serialPort.Open();
        }
        catch (System.Exception ex)
        {
        print(\\\"串口打開異常:\\\"+ex);
        }
        }


        void OnApplicationQuit()
        {
        ClosePort();
        }


        void ClosePort()
        {
        print(\\\\\\\"關閉串口\\\\\\\");
        try
        {
        serialPort.Close();
        thread_reviceData.Abort();
        }
        catch (System.Exception ex)
        {
        print(\\\"串口關閉異常:\\\" + ex);
        }
        }


        5.發送消息到串口測試,OnGUI方法用作發送測試,不用時可以自行刪除OnGUI方法

        #region 發送數據
            public void WriteData(string dataStr)
            {
                if (sp.IsOpen)
                {
                    sp.Write(dataStr);
                }
            }
            void OnGUI()
            {
                message = GUILayout.TextField(message GUILayout.Width(200) GUILayout.Height(50));
                if (GUILayout.Button(\\\"發送輸入信息到串口對象\\\"GUILayout.Width(200)GUILayout.Height(50)))
                {
                    WriteData(message);
                }
                string test = \\\"AA BB 01 12345 01AB 0@ab 發送\\\";//測試字符串
                if (GUILayout.Button(\\\"發送默認信息到串口對象\\\" GUILayout.Width(200)GUILayout.Height(50)))
                {
                    WriteData(test);
                }
            }
            #endregion

        6.多線程接收串口消息方法并將解析的消息放入隊列池

        void DataReviceThread()
        {
        byte[] bytes_read = new byte[1024];
        int count = 0;
        while (serialPort != null && serialPort.IsOpen)
        {
        try
        {
        count = serialPort.Read(bytes_read 0 bytes_read.Length);//讀取消息并獲取字節數
        if (count == 0)
        continue;
        else
        {

        //===================else部分就是接收到的串口消息,關于解析也是在這個邏輯之下,由于每種協議的制定和解析各不相同,這里就留給讀者自行分析解析數據了
        //print(\\\"字節數量:\\\" + count);
        //if (count == 6)
        //{
        // StringBuilder stringBuilder = new StringBuilder();
        // for (int i = 0; i < count; i++)
        // {
        // stringBuilder.Append(Convert.ToString(bytes_read));
        // }
        // str_data = stringBuilder.ToString();
        // //print(str_data);
        // queue_data.Enqueue(str_data);//將接收的消息放入隊列
        //}
        }
        }
        catch (Exception ex)
        {
        print(\\\"串口讀取數據異常:\\\" + ex);
        }
        Thread.Sleep(10);
        }
        }//數據接收的多線程


                                   
                         圖文無關

        7.將解析的數據做處理,用bool來檢測我們的按鍵輸入,以便于我們轉換成輸入的方法
        public bool[] KeyClickState = new bool[6];//手柄按鈕點擊的狀態

        void Update()
        {
        if (queue_data.Count > 0)
        {
        queue_data.Dequeue();//清除第一條隊列
        switch (str_data)
        {
        case \\\"255142542515\\\"://圓形
        KeyClickState[0] = true;
        //print(\\\"圓形按鈕\\\");
        break;
        case \\\"255152542504\\\"://方形
        KeyClickState[1] = true;
        //print(\\\"方形按鈕\\\");
        break;
        case \\\"255182542479\\\"://前
        KeyClickState[2] = true;
        //print(\\\"前\\\");
        break;
        case\\\"255172542486\\\"://后
        KeyClickState[3] = true;
        //print(\\\"后\\\");
        break;
        case\\\"255162542497\\\"://左
        KeyClickState[4] = true;
        //print(\\\"左\\\");
        break;
        case\\\"255112542540\\\"://右
        KeyClickState[5] = true;
        //print(\\\"右\\\");
        break;
        default:
        break;
        }
        }
        else
        {
        for (int i = 0; i < KeyClickState.Length; i++)
        {
        KeyClickState = false;//重置所有的按鈕狀態
        }
        }
        }


        8.按下判定和任意鍵按鈕判定
        public bool InputKeyClickDown(KeyType keyType)
        {
        return KeyClickState[(int)keyType];
        }//如果按下按鈕,由于update刷新bool為false,所以只返回一次true



        public bool anyKeyDown()
        {
        count_key = Enum.GetNames(keyType.GetType()).Length;//獲取枚舉的長度
        for (int i = 0; i < count_key; i++)
        {
        if (KeyClickState)
        {
        return KeyClickState;
        }
        }
        return false;
        }//如果按下了任意的按鍵



        【調用測試
        void Update()
        {
        if(SerialPortManagr.Instance.InputKeyClickDown(KeyType.圓形按鈕))
        {
        print(\\\"點擊了圓形按鈕\\\");
        }


        if (SerialPortManagr.Instance.anyKeyDown())
        {
        foreach (KeyType type in Enum.GetValues(typeof(KeyType)))
        {
        if (SerialPortManagr.Instance.InputKeyClickDown(type))
        {
        print(\\\"點擊了\\\" + type);
        }
        }
        }
        }

        【最后想說


        這兩天發表蠻牛,從博客復制過來全是格式錯誤,搞到了一點多才差不多理清楚,身心俱疲,明早還要一早起來去出差,寫專欄不易,且行且珍惜,感謝看到最后的朋友,如果想要源碼記得看開頭的的前言部分,臨表涕零,不知所言!











        回復

        使用道具 舉報

        5熟悉之中
        558/1000
        排名
        64951
        昨日變化

        0

        主題

        67

        帖子

        558

        積分

        Rank: 5Rank: 5

        UID
        327914
        好友
        0
        蠻牛幣
        545
        威望
        0
        注冊時間
        2019-7-23
        在線時間
        489 小時
        最后登錄
        2021-9-15
        沙發
        2020-11-5 10:57:57 只看該作者
        感謝分享
        回復

        使用道具 舉報

        4四處流浪
        335/500
        排名
        48145
        昨日變化

        0

        主題

        56

        帖子

        335

        積分

        Rank: 4

        UID
        297600
        好友
        1
        蠻牛幣
        13
        威望
        0
        注冊時間
        2018-9-19
        在線時間
        275 小時
        最后登錄
        2021-9-2
        板凳
        2020-11-5 19:29:49 只看該作者
        感謝大佬分享
        回復

        使用道具 舉報

        7日久生情
        2680/5000
        排名
        4162
        昨日變化

        19

        主題

        491

        帖子

        2680

        積分

        Rank: 7Rank: 7Rank: 7Rank: 7

        UID
        18541
        好友
        8
        蠻牛幣
        1200
        威望
        0
        注冊時間
        2014-3-22
        在線時間
        1812 小時
        最后登錄
        2021-9-10
        地板
        2020-11-6 08:43:36 只看該作者
        感謝分享
        回復

        使用道具 舉報

        排名
        64951
        昨日變化

        5

        主題

        49

        帖子

        1021

        積分

        Rank: 9Rank: 9Rank: 9

        UID
        354297
        好友
        0
        蠻牛幣
        459
        威望
        0
        注冊時間
        2020-11-3
        在線時間
        962 小時
        最后登錄
        2021-8-18
        5#
        樓主 2020-11-6 14:15:51 只看該作者

        謝謝支持
        回復 支持 反對

        使用道具 舉報

        排名
        64951
        昨日變化

        5

        主題

        49

        帖子

        1021

        積分

        Rank: 9Rank: 9Rank: 9

        UID
        354297
        好友
        0
        蠻牛幣
        459
        威望
        0
        注冊時間
        2020-11-3
        在線時間
        962 小時
        最后登錄
        2021-8-18
        6#
        樓主 2020-11-10 11:25:51 只看該作者
        帖子的代碼里出現 \\\"\\\" 是由于字符串“”在網頁中發布引起的,暫時不好修改,對比代碼時注意一下!
        回復 支持 反對

        使用道具 舉報

        5熟悉之中
        564/1000
        排名
        9107
        昨日變化

        2

        主題

        174

        帖子

        564

        積分

        Rank: 5Rank: 5

        UID
        208862
        好友
        0
        蠻牛幣
        210
        威望
        0
        注冊時間
        2017-2-27
        在線時間
        270 小時
        最后登錄
        2021-6-19
        7#
        2020-11-17 21:03:43 只看該作者
        “到現在為止,還是挺喜歡這種基于硬件的游戲開發,做街機的時候,沒做多久,所以當初最遺憾的事情就是沒有學會串口通信,到現在為止,串口覺得也就是一個收發消息的集成類”
        回復 支持 反對

        使用道具 舉報

        5熟悉之中
        564/1000
        排名
        9107
        昨日變化

        2

        主題

        174

        帖子

        564

        積分

        Rank: 5Rank: 5

        UID
        208862
        好友
        0
        蠻牛幣
        210
        威望
        0
        注冊時間
        2017-2-27
        在線時間
        270 小時
        最后登錄
        2021-6-19
        8#
        2020-11-17 21:05:08 只看該作者

        “到現在為止,還是挺喜歡這種基于硬件的游戲開發,做街機的時候,沒做多久,所以當初最遺憾的事情就是沒有學會串口通信,到現在為止,串口覺得也就是一個收發消息的集成類”---------------------------所以,最后我想知道,你學會串口通信了嗎?串口只是一個收發消息的集成類嗎?
        回復 支持 反對

        使用道具 舉報

        排名
        64951
        昨日變化

        5

        主題

        49

        帖子

        1021

        積分

        Rank: 9Rank: 9Rank: 9

        UID
        354297
        好友
        0
        蠻牛幣
        459
        威望
        0
        注冊時間
        2020-11-3
        在線時間
        962 小時
        最后登錄
        2021-8-18
        9#
        樓主 2020-11-19 16:08:58 只看該作者
        eha123 發表于 2020-11-17 21:05
        “到現在為止,還是挺喜歡這種基于硬件的游戲開發,做街機的時候,沒做多久,所以當初最遺憾的事情就是沒 ...

        那你說說看,樂意請教
        回復 支持 反對

        使用道具 舉報

        排名
        64951
        昨日變化

        0

        主題

        8

        帖子

        66

        積分

        Rank: 2Rank: 2

        UID
        264079
        好友
        0
        蠻牛幣
        108
        威望
        0
        注冊時間
        2018-1-12
        在線時間
        56 小時
        最后登錄
        2021-9-10
        10#
        2020-12-11 14:42:25 只看該作者
        留個腳印
        回復

        使用道具 舉報

        3偶爾光臨
        286/300
        排名
        10109
        昨日變化

        0

        主題

        83

        帖子

        286

        積分

        Rank: 3Rank: 3Rank: 3

        UID
        191422
        好友
        0
        蠻牛幣
        506
        威望
        0
        注冊時間
        2016-12-12
        在線時間
        95 小時
        最后登錄
        2021-1-18
        11#
        2020-12-22 12:16:42 只看該作者
        感謝分享
        回復

        使用道具 舉報

        7日久生情
        2611/5000
        排名
        3595
        昨日變化

        0

        主題

        108

        帖子

        2611

        積分

        Rank: 7Rank: 7Rank: 7Rank: 7

        UID
        71644
        好友
        0
        蠻牛幣
        3188
        威望
        0
        注冊時間
        2015-1-28
        在線時間
        2087 小時
        最后登錄
        2021-9-15
        12#
        2020-12-29 16:55:09 只看該作者
        感謝分享?。?!
        回復

        使用道具 舉報

        7日久生情
        3272/5000
        排名
        48145
        昨日變化

        0

        主題

        1355

        帖子

        3272

        積分

        Rank: 7Rank: 7Rank: 7Rank: 7

        UID
        208145
        好友
        0
        蠻牛幣
        6993
        威望
        0
        注冊時間
        2017-6-23
        在線時間
        1913 小時
        最后登錄
        2021-9-15
        13#
        2021-1-6 17:54:16 只看該作者
        66666666666666
        回復

        使用道具 舉報

        3偶爾光臨
        249/300
        排名
        9485
        昨日變化

        0

        主題

        37

        帖子

        249

        積分

        Rank: 3Rank: 3Rank: 3

        UID
        179290
        好友
        0
        蠻牛幣
        3
        威望
        0
        注冊時間
        2016-10-29
        在線時間
        92 小時
        最后登錄
        2021-1-10
        14#
        2021-1-7 16:18:32 只看該作者
        寫得太好了  專業?。?!
        回復 支持 反對

        使用道具 舉報

        4四處流浪
        387/500
        排名
        5792
        昨日變化

        0

        主題

        51

        帖子

        387

        積分

        Rank: 4

        UID
        355858
        好友
        0
        蠻牛幣
        2345
        威望
        0
        注冊時間
        2021-1-12
        在線時間
        94 小時
        最后登錄
        2021-6-6
        15#
        2021-1-15 10:49:36 只看該作者
        感謝分享666666666
        回復 支持 反對

        使用道具 舉報

        您需要登錄后才可以回帖 登錄 | 注冊帳號

        本版積分規則

        關注游戲蠻牛公眾號送vip
        欧美野性肉体狂欢大派对