<td id="mukkm"><td id="mukkm"></td></td>
  • <nav id="mukkm"></nav>
  • <nav id="mukkm"></nav>
     找回密碼
     注冊帳號

    掃一掃,訪問微社區

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

    25
    回復
    7897
    查看
    打印 上一主題 下一主題
    [ 復制鏈接 ]
    排名
    64954
    昨日變化

    5

    主題

    54

    帖子

    1191

    積分

    Rank: 9Rank: 9Rank: 9

    UID
    354297
    好友
    0
    蠻牛幣
    477
    威望
    0
    注冊時間
    2020-11-3
    在線時間
    1126 小時
    最后登錄
    2022-8-17

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

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

    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熟悉之中
    751/1000
    排名
    64954
    昨日變化

    0

    主題

    71

    帖子

    751

    積分

    Rank: 5Rank: 5

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

    使用道具 舉報

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

    0

    主題

    56

    帖子

    356

    積分

    Rank: 4

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

    使用道具 舉報

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

    19

    主題

    535

    帖子

    3209

    積分

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

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

    使用道具 舉報

    排名
    64954
    昨日變化

    5

    主題

    54

    帖子

    1191

    積分

    Rank: 9Rank: 9Rank: 9

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

    謝謝支持
    回復 支持 反對

    使用道具 舉報

    排名
    64954
    昨日變化

    5

    主題

    54

    帖子

    1191

    積分

    Rank: 9Rank: 9Rank: 9

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

    使用道具 舉報

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

    2

    主題

    176

    帖子

    568

    積分

    Rank: 5Rank: 5

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

    使用道具 舉報

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

    2

    主題

    176

    帖子

    568

    積分

    Rank: 5Rank: 5

    UID
    208862
    好友
    0
    蠻牛幣
    175
    威望
    0
    注冊時間
    2017-2-27
    在線時間
    272 小時
    最后登錄
    2022-1-26
    8#
    2020-11-17 21:05:08 只看該作者

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

    使用道具 舉報

    排名
    64954
    昨日變化

    5

    主題

    54

    帖子

    1191

    積分

    Rank: 9Rank: 9Rank: 9

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

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

    使用道具 舉報

    排名
    64954
    昨日變化

    0

    主題

    8

    帖子

    79

    積分

    Rank: 2Rank: 2

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

    使用道具 舉報

    4四處流浪
    349/500
    排名
    10109
    昨日變化

    0

    主題

    83

    帖子

    349

    積分

    Rank: 4

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

    使用道具 舉報

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

    0

    主題

    109

    帖子

    3909

    積分

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

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

    使用道具 舉報

    8常駐蠻牛
    5607/10000
    排名
    48145
    昨日變化

    0

    主題

    2144

    帖子

    5607

    積分

    Rank: 8Rank: 8

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

    使用道具 舉報

    3偶爾光臨
    252/300
    排名
    9486
    昨日變化

    0

    主題

    39

    帖子

    252

    積分

    Rank: 3Rank: 3Rank: 3

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

    使用道具 舉報

    4四處流浪
    444/500
    排名
    5793
    昨日變化

    0

    主題

    54

    帖子

    444

    積分

    Rank: 4

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

    使用道具 舉報

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

    本版積分規則

    關注游戲蠻牛公眾號送vip
    免费一级AA片毛片在线播放
    <td id="mukkm"><td id="mukkm"></td></td>
  • <nav id="mukkm"></nav>
  • <nav id="mukkm"></nav>