51智能小车编程
最近在做智能小车,需要实现编写上位机控制智能小车行驶方向与运行速度。因此首先需要解决的问题就是需要考虑如何实现计算机与智能小车进行通信。所使用硬件设备主要包括51单片机开发板、ESP8266 WIFI无线模块。
ESP8266 WIFI模块
本文主要介绍上位机端开发,通过使用PC端开发软件实现电脑端创建TCP连接服务器,为下一步ESP8266作为TCP客户端实现客户端与服务器端通信。为测试服务器端与客户端通信,客户端使用网络调试助手模拟客户端测试TCP连接与通信情况。其中网络调试工具如下:
网络调试工具
PC端软件界面设计
本项目开发设计使用PC端实现对智能小车进行控制,主要设计实现功能包括小车实时信息显示,视频数据传输与小车行驶与方向控制,除此之外设置软件TCP连接相关信息。PC端软件界面设计如下所示:
智能小车PC端软件设计
PC端软件界面设计如上图所示,通信状态信息部分主要用于输出显示客户端与服务器端通信情况,服务器设置主要实现TCP服务器端设计,指令操作区主要用于控制小车方向与速度,视频显示区主要接收小车摄像头拍摄信息,小车信息主要用于显示实时小车信息,信息收发区主要实现PC端与小车进行文字信息发送。这篇文章主要介绍服务器设置及TCP连接功能实现。
Socket连接创建与测试
本例使用C#程序设计语言开发服务器端,通过使用Socket类创建TCP连接服务器端,由网络调试助手模拟客户端测试服务器与客户端连接及信息收发。
服务器设置及通信状态显示
信息收发功能区域
本文所介绍需要实现的两个基本功能如上图所示,部分核心代码描述如下:
1、创建通信端口
try{ socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); ip = "127.0.0.1"; port = 8080; this.listBox1.Items.Insert(listBox1.Items.Count, "创建通信接口成功!!! "+DateTime.Now.ToString());}catch(Exception ex){ MessageBox.Show(ex.ToString()); }
点击启动按钮将执行创建通信端口代码,在服务器信息显示端会显示端口创建成功提示信息,如下图所示:
创建通信端口
2、绑定端口并监听端口
private void button10_Click(object sender, EventArgs e) { socket.Bind(new IPEndPoint(IPAddress.Parse(ip), port)); this.listBox1.Items.Insert(listBox1.Items.Count, "绑定端口成功,正在监听!!! " + DateTime.Now.ToString()); socket.Listen(1); lThread = new Thread(listenClient); lThread.Start(); }private static void listenClient(){ while (true) { client = socket.Accept(); usocket = client; Thread recvThread = new Thread(recvData); recvThread.Start(client); Form1.MainForm.sendMsg(0,"客户端连接成功"); } }
以上代码实现端口监听,客户端通过使用TCP连接服务器端时会创建listenClient线程处理客户端连接,在listenClient中创建recvData处理数据的发送与接收。
客户端与服务器端连接成功
3、收发数据
private static void recvData(object client){ uclient = (Socket)client; while (true) { try { int recvCount = uclient.Receive(recv); if (recvCount == 0) { uclient.Shutdown(SocketShutdown.Both); uclient.Close(); return; } string recvData = Encoding.UTF8.GetString(recv, 0, recvCount); Form1.MainForm.sendMsg(1, recvData); } catch(Exception ex) { Form1.MainForm.sendMsg(0,ex.Message); } }}private void button2_Click(object sender, EventArgs e){ if(usocket!=null) { string str = this.sendBox.Text; string sendStr = str; byte[] bs = Encoding.UTF8.GetBytes(sendStr); try { usocket.Send(bs, bs.Length, 0); } catch (Exception ex) { Form1.MainForm.sendMsg(0, ex.Message); } } else { Form1.MainForm.sendMsg(0, "无法连接客户端"); } }
实现数据收发代码描述如上所示,最终显示效果如下图:
服务器端与客户端收发数据