Unity3d 与串口的通信程序的开发,软件硬件结合

来源:互联网 发布:淘宝商品不合格违规了 编辑:程序博客网 时间:2024/06/14 06:26

一、c#实现串口通信程序的开发

C#串口介绍以及简单串口通信程序设计实现

简单的串口通信工具,基于C#应用程序WinFrom实现

串口介绍

  串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。(至于再详细,自己百度)

串口应用:

  工业领域使用较多,比如:数据采集,设备控制等等,好多都是用串口通信来实现!你要是细心的话,你会发现,目前家用国网智能电能表就具备RS485通信总线(串行总线的一种)与RS232可以相互转化(当然一般,非专业的谁也不会闲的蛋疼,趴电表上瞎看,最多也就看看走了多少度电)

RS232 DB9介绍:

1.示意图

2.针脚介绍:

  1.  载波检测(DCD) 
  2.  接受数据(RXD) 
  3.  发出数据(TXD) 
  4.  数据终端准备好(DTR) 
  5.  信号地线(SG)
  6.  数据准备好(DSR)
  7.  请求发送(RTS)
  8.  清除发送(CTS)
  9.  振铃指示(RI)

3.实物图:

以下是一个usb转串口线:这个头就是一个公头,另一端是一个usb口

笨小孩串口工具运行图:

1.开启程序

2.发送一行字符串HelloBenXH,直接将针脚的发送和接收链接起来就可以测试了(针脚2 接受数据(RXD) 和3 发出数据(TXD))直接链接,

C#代码实现:采用SerialPort

1.实例化一个SerialPort

1 private SerialPort ComDevice = new SerialPort();

2.初始化参数绑定接收数据事件

 1 public void init() 2         { 3             btnSend.Enabled = false; 4             cbbComList.Items.AddRange(SerialPort.GetPortNames()); 5             if (cbbComList.Items.Count > 0) 6             { 7                 cbbComList.SelectedIndex = 0; 8             } 9             cbbBaudRate.SelectedIndex = 5;10             cbbDataBits.SelectedIndex = 0;11             cbbParity.SelectedIndex = 0; 12             cbbStopBits.SelectedIndex = 0;13             pictureBox1.BackgroundImage = Properties.Resources.red;14 15             ComDevice.DataReceived += new SerialDataReceivedEventHandler(Com_DataReceived);//绑定事件16             17         }

3.打开串口button事件

 1 /// <summary> 2         /// 打开串口 3         /// </summary> 4         /// <param name="sender"></param> 5         /// <param name="e"></param> 6         private void btnOpen_Click(object sender, EventArgs e) 7         { 8             if (cbbComList.Items.Count <= 0) 9             {10                 MessageBox.Show("没有发现串口,请检查线路!");11                 return;12             }13 14             if (ComDevice.IsOpen == false)15             {16                 ComDevice.PortName = cbbComList.SelectedItem.ToString();17                 ComDevice.BaudRate = Convert.ToInt32(cbbBaudRate.SelectedItem.ToString());18                 ComDevice.Parity = (Parity)Convert.ToInt32(cbbParity.SelectedIndex.ToString());19                 ComDevice.DataBits = Convert.ToInt32(cbbDataBits.SelectedItem.ToString());20                 ComDevice.StopBits = (StopBits)Convert.ToInt32(cbbStopBits.SelectedItem.ToString());21                 try22                 {23                     ComDevice.Open();24                     btnSend.Enabled = true;25                 }26                 catch (Exception ex)27                 {28                     MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);29                     return;30                 }31                 btnOpen.Text = "关闭串口";32                 pictureBox1.BackgroundImage = Properties.Resources.green;33             }34             else35             {36                 try37                 {38                     ComDevice.Close();39                     btnSend.Enabled = false;40                 }41                 catch (Exception ex)42                 {43                     MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);44                 }45                 btnOpen.Text = "打开串口";46                 pictureBox1.BackgroundImage = Properties.Resources.red;47             }48 49             cbbComList.Enabled = !ComDevice.IsOpen;50             cbbBaudRate.Enabled = !ComDevice.IsOpen;51             cbbParity.Enabled = !ComDevice.IsOpen;52             cbbDataBits.Enabled = !ComDevice.IsOpen;53             cbbStopBits.Enabled = !ComDevice.IsOpen;54         }

4.发送数据

 1 /// <summary> 2         /// 发送数据 3         /// </summary> 4         /// <param name="sender"></param> 5         /// <param name="data"></param> 6         public bool SendData(byte[] data) 7         { 8             if (ComDevice.IsOpen) 9             {10                 try11                 {12                     ComDevice.Write(data, 0, data.Length);//发送数据13                     return true;14                 }15                 catch (Exception ex)16                 {17                     MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);18                 }19             }20             else21             {22                 MessageBox.Show("串口未打开", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);23             }24             return false;25         }26 27         /// <summary>28         /// 发送数据button事件29         /// </summary>30         /// <param name="sender"></param>31         /// <param name="e"></param>32         private void btnSend_Click(object sender, EventArgs e)33         {34             byte[] sendData = null;35 36             if (rbtnSendHex.Checked)37             {38                 sendData = strToHexByte(txtSendData.Text.Trim());39             }40             else if (rbtnSendASCII.Checked)41             {42                 sendData = Encoding.ASCII.GetBytes(txtSendData.Text.Trim());43             }44             else if (rbtnSendUTF8.Checked)45             {46                 sendData = Encoding.UTF8.GetBytes(txtSendData.Text.Trim());47             }48             else if (rbtnSendUnicode.Checked)49             {50                 sendData = Encoding.Unicode.GetBytes(txtSendData.Text.Trim());51             }52             else53             {54                 sendData = Encoding.ASCII.GetBytes(txtSendData.Text.Trim());55             }56 57             if (this.SendData(sendData))//发送数据成功计数58             {59                 lblSendCount.Invoke(new MethodInvoker(delegate60                 {61                     lblSendCount.Text = (int.Parse(lblSendCount.Text) + txtSendData.Text.Length).ToString();62                 }));63             }64             else65             {66 67             }68 69         }70 71         /// <summary>72         /// 字符串转换16进制字节数组73         /// </summary>74         /// <param name="hexString"></param>75         /// <returns></returns>76         private byte[] strToHexByte(string hexString)77         {78             hexString = hexString.Replace(" ", "");79             if ((hexString.Length % 2) != 0)80                 hexString += " ";81             byte[] returnBytes = new byte[hexString.Length / 2];82             for (int i = 0; i < returnBytes.Length; i++)83                 returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2).Replace(" ",""), 16);84             return returnBytes;85         }

5.接收和数据输出

 1 /// <summary> 2         /// 接收数据 3         /// </summary> 4         /// <param name="sender"></param> 5         /// <param name="e"></param> 6         private void Com_DataReceived(object sender, SerialDataReceivedEventArgs e) 7         { 8             byte[] ReDatas = new byte[ComDevice.BytesToRead]; 9             ComDevice.Read(ReDatas, 0, ReDatas.Length);//读取数据10             this.AddData(ReDatas);//输出数据11         }12        13         /// <summary>14         /// 添加数据15         /// </summary>16         /// <param name="data">字节数组</param>17         public void AddData(byte[] data)18         {19             if (rbtnHex.Checked)20             {21                 StringBuilder sb = new StringBuilder();22                 for (int i = 0; i < data.Length; i++)23                 {24                     sb.AppendFormat("{0:x2}" + " ", data[i]);25                 }26                 AddContent(sb.ToString().ToUpper());27             }28             else if (rbtnASCII.Checked)29             {30                 AddContent(new ASCIIEncoding().GetString(data));31             }32             else if (rbtnUTF8.Checked)33             {34                 AddContent(new UTF8Encoding().GetString(data));35             }36             else if (rbtnUnicode.Checked)37             {38                 AddContent(new UnicodeEncoding().GetString(data));39             }40             else41             {}42           43             lblRevCount.Invoke(new MethodInvoker(delegate44             {45                 lblRevCount.Text = (int.Parse(lblRevCount.Text) + data.Length).ToString();46             }));47         }48 49 50         /// <summary>51         /// 输入到显示区域52         /// </summary>53         /// <param name="content"></param>54         private void AddContent(string content)55         {56             this.BeginInvoke(new MethodInvoker(delegate57             {58                 if(chkAutoLine.Checked && txtShowData.Text.Length>0)59                 {60                     txtShowData.AppendText("\r\n");61                 }62                 txtShowData.AppendText(content);63             }));64         }

6.清空数据区域事件

 1 /// <summary> 2         /// 清空接收区 3         /// </summary> 4         /// <param name="sender"></param> 5         /// <param name="e"></param> 6         private void btnClearRev_Click(object sender, EventArgs e) 7         { 8             txtShowData.Clear(); 9         }10 11         /// <summary>12         /// 清空发送区13         /// </summary>14         /// <param name="sender"></param>15         /// <param name="e"></param>16         private void btnClearSend_Click(object sender, EventArgs e)17         {18             txtSendData.Clear();19         }

 运行程序下载地址  BXHSerialPort.exe

源代码工程文件下载

OK 步入正题

二、Unity3d与串口通信程序的开发

这里写图片描述
先做一个简单的UI,用来控制串口设备的开关

代码就比较简单了

自定义端口API类

using System;//先要引入这个命名空间using System.IO.Ports;//这个是连接上的串口设备的定义好的参数,发送这个参数就能控制串口设备public enum PortsType{   //01、全开:PC发送'I';    //02、全关:PC发送'i';    I,i,   //03、第一路开:PC发送'A';   //04、第二路开:PC发送'B';   //05、第三路开:PC发送'C';   //06、第四路开:PC发送'D';   //07、第五路开:PC发送'E';   //08、第六路开:PC发送'F';   //09、第七路开:PC发送'G';   //10、第八路开:PC发送'H';   A,B,C,D,E,F,G,H,   //11、第一路关:PC发送'a';   //12、第二路关:PC发送'b';   //13、第三路关:PC发送'c';   //14、第四路关:PC发送'd';   //15、第五路关:PC发送'e';   //16、第六路关:PC发送'f';   //17、第七路关:PC发送'g';   //18、第八路关:PC发送'h';   a,b,c,d,e,f,g,h}public class PortsContol{    //第一个参数是端口的名字,一会说怎么看端口,第二个参数是波特率,这个是设备自身的参数    SerialPort sp = new SerialPort("COM3", 9600);//声明一个串口类    //这个是完整的参数,名别是 端口名、波特率、奇偶效验、数据位、流控制参数    //SerialPort sp1 = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.None);    //这个就是一个发送的API,其他程序就调用这个API    public void Send_Click(PortsType data)    {        sp.Open();        switch (data)        {            case PortsType.I:            //给端口发送数据                sp.WriteLine("I");                break;            case PortsType.i:                sp.WriteLine("i");                break;            case PortsType.A:                sp.WriteLine("A");                break;            case PortsType.B:                sp.WriteLine("B");                break;            case PortsType.C:                sp.WriteLine("C");                break;            case PortsType.D:                sp.WriteLine("D");                break;            case PortsType.E:                sp.WriteLine("E");                break;            case PortsType.F:                sp.WriteLine("F");                break;            case PortsType.G:                sp.WriteLine("G");                break;            case PortsType.H:                sp.WriteLine("H");                break;            case PortsType.a:                sp.WriteLine("a");                break;            case PortsType.b:                sp.WriteLine("b");                break;            case PortsType.c:                sp.WriteLine("c");                break;            case PortsType.d:                sp.WriteLine("d");                break;            case PortsType.e:                sp.WriteLine("e");                break;            case PortsType.f:                sp.WriteLine("f");                break;            case PortsType.g:                sp.WriteLine("g");                break;            case PortsType.h:                sp.WriteLine("h");                break;            default:                break;        }        sp.Close();    }}

这里写图片描述

这里写图片描述

Unity调用

using UnityEngine;using System.Collections;public class ButtonClick1 : MonoBehaviour{    //初始化自定义端口类    PortsContol pc = new PortsContol();    // Use this for initialization    void Start()    {    }    // Update is called once per frame    void Update()    {    }    //按钮"开"调用的函数    public void Open_Click()    {        //参数是自定义类中的枚举        pc.Send_Click(PortsType.I);    }    //按钮"关"调用的函数    public void Close_Click()    {        pc.Send_Click(PortsType.i);    }    //按钮"1开"调用的函数    public void OneOpen_Click()    {        pc.Send_Click(PortsType.A);    }    //按钮"1关"调用的函数    public void OneClose_Click()    {        pc.Send_Click(PortsType.a);    }}

脚本绑定在主摄像机上,按钮Button调用主摄像机上的函数
这里写图片描述

OK,这就行了,就可以用Unity3d控制串口程序了


阅读全文
0 0