找回密碼
 注冊帳號

掃一掃,訪問微社區

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

8
回復
640
查看
打印 上一主題 下一主題
[ 復制鏈接 ]
排名
64950
昨日變化

4

主題

19

帖子

221

積分

Rank: 9Rank: 9Rank: 9

UID
354297
好友
0
蠻牛幣
485
威望
0
注冊時間
2020-11-3
在線時間
196 小時
最后登錄
2020-11-27

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

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

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

【最后想說


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











回復

使用道具 舉報

3偶爾光臨
176/300
排名
64950
昨日變化

0

主題

29

帖子

176

積分

Rank: 3Rank: 3Rank: 3

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

使用道具 舉報

4四處流浪
331/500
排名
48147
昨日變化

0

主題

55

帖子

331

積分

Rank: 4

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

使用道具 舉報

7日久生情
1683/5000
排名
4167
昨日變化

19

主題

422

帖子

1683

積分

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

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

使用道具 舉報

排名
64950
昨日變化

4

主題

19

帖子

221

積分

Rank: 9Rank: 9Rank: 9

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

謝謝支持
回復 支持 反對

使用道具 舉報

排名
64950
昨日變化

4

主題

19

帖子

221

積分

Rank: 9Rank: 9Rank: 9

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

使用道具 舉報

4四處流浪
408/500
排名
9112
昨日變化

2

主題

163

帖子

408

積分

Rank: 4

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

使用道具 舉報

4四處流浪
408/500
排名
9112
昨日變化

2

主題

163

帖子

408

積分

Rank: 4

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

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

使用道具 舉報

排名
64950
昨日變化

4

主題

19

帖子

221

積分

Rank: 9Rank: 9Rank: 9

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

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

使用道具 舉報

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

本版積分規則

内蒙古麻将app 天天乐湖北棋牌作弊器 贵州快三一定牛预测 街机捕鱼安装 麻将棋牌下载 棋牌赚钱 白姐今晚开码 快三打对子技巧100准 大乐透杀红球100%杀号 北京麻将胡法图解 乐胡麻将3局赢微信红包 36棋牌手游免费下载 广东快乐10分研究 福建省体彩31选7号码预测 76人三巨头 闲来广东麻将app 联众血战麻将外挂