Unity3d 与串口的通信程序的开发,软件硬件结合
来源:互联网 发布:淘宝商品不合格违规了 编辑:程序博客网 时间:2024/06/14 06:26
一、c#实现串口通信程序的开发
C#串口介绍以及简单串口通信程序设计实现
简单的串口通信工具,基于C#应用程序WinFrom实现
串口介绍
串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。(至于再详细,自己百度)
串口应用:
工业领域使用较多,比如:数据采集,设备控制等等,好多都是用串口通信来实现!你要是细心的话,你会发现,目前家用国网智能电能表就具备RS485通信总线(串行总线的一种)与RS232可以相互转化(当然一般,非专业的谁也不会闲的蛋疼,趴电表上瞎看,最多也就看看走了多少度电)
RS232 DB9介绍:
1.示意图
2.针脚介绍:
- 载波检测(DCD)
- 接受数据(RXD)
- 发出数据(TXD)
- 数据终端准备好(DTR)
- 信号地线(SG)
- 数据准备好(DSR)
- 请求发送(RTS)
- 清除发送(CTS)
- 振铃指示(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
- Unity3d 与串口的通信程序的开发,软件硬件结合
- Unity3D内部串口通信和Unity3D与Winform程序的串口通信的实现和异常问题
- Unity3D内部串口通信和Unity3D与Winform程序的串口通信的实现和异常问题
- “拿来主义”——怎样嗅探一个串口通信程序与硬件之间的通信(一)
- “拿来主义”——怎样嗅探一个串口通信程序与硬件之间的通信(二)
- “拿来主义”——怎样嗅探一个串口通信程序与硬件之间的通信(三)
- MSP430与GPRS模块的串口通信硬件流控制
- C++与硬件的结合
- 硬件与指令或叫程序的硬件结合品或叫商品的有货币流通存在的非软件商品的流通税更高
- 51单片机与PC串口通信程序及硬件电路图
- 51 单片机与PC 串口通信程序及硬件电路图
- sip与硬件phone结合的客户端开发
- Unity3D 串口通信 遇到的问题记录
- 地下电磁波仪串口通信软件的研制与应用
- 串口通信程序的编写
- 基于Nios II和eCos的串口通信程序开发
- 快速开发基于ComXYZ控件的串口通信程序
- TC串口通信程序的设计与实现
- eclipse一些使用方法
- 前端 遍历的text框JS取值的方法
- 第四章.-10 Python从入门到实践
- scada 遥控选择执行取消
- centos上目标检测(二)
- Unity3d 与串口的通信程序的开发,软件硬件结合
- initUndistortRectifyMap
- python -- 广度优先搜索
- 关于EasyUI Datagrid 数据网格渲染数据过慢
- 深入理解Spring--动手实现一个简单的SpringIOC容器-非注解版
- Spring学习总结(24)——Spring配置文件加载路径总结
- 函数表达式(2)
- ros tab补全问题
- Delcam PowerInspect 2014\