zoukankan      html  css  js  c++  java
  • 【STM32 .Net MF开发板学习17】Wifi遥控智能小车

    恰好以前购买的一个PDAWifi功能,所以与其用PC通过Zigbee控制智能小车,不如用PDA来控制,这样更为方便,不过由于目前.NET MF开发板不直接支持Wifi功能,所以我们也只好间接控制了,也就是PDA控制PCPC通过Zigbee控制智能小车。

    对我们开发者来说,Wifi和普通的网线接口一样,都是Socket编程。我们只需用在PDA上构建一个简单的TCP Client端,在PC构建一个TCP Server端即可,PDA发送相关指令,PC接收后通过Zigbee转发给智能小车。

    PDA ===> WifiTCP/IP ===> PC ===> Zigbee(串口232/TTL) ===> 智能小车

    PC通过Zigbee控制智能小车,在我的上篇博文《Zigbee遥控智能小车》已有介绍,所以这里就略过不提了。

    我们先开发PDA上的程序(操作系统Windows Mobile 5.0),开发语言我们选择C#,相关代码如下:

    public frmMain()

        {

            InitializeComponent();

            Connect("192.168.1.2", 7722);

       }

        public void Connect(string server,int port)

        {

            sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            if (ipEndPoint != null) sock.Connect(GetEndPoint(server, port));

        }

        private void btnForward_Click(object sender, EventArgs e)

        {

            if (sock != null) sock.Send(new byte[] {48});

        }

        private void btnLeft_Click(object sender, EventArgs e)

        {

            if (sock != null) sock.Send(new byte[] { 49 });

        }

        private void btnRight_Click(object sender, EventArgs e)

        {

            if (sock != null) sock.Send(new byte[] { 50 });

        }

        private void btnBack_Click(object sender, EventArgs e)

        {

            if (sock != null) sock.Send(new byte[] { 51 });

        }

        private void btnStop_Click(object sender, EventArgs e)

        {

            if (sock != null) sock.Send(new byte[] { 52 });

    }

    编译运行后的效果图如下:

    完成PDA上的编程,我们改造一下《Zigbee遥控智能小车》中提到的PC Zigbee通信程序,我们把相关TCP服务代码加入其中,相关代码如下:

        listener = new TcpListener(IPAddress.Parse(ip),7722);

        listener.Start();

        Thread thread = new Thread(new ThreadStart(StartSocketListen));

        thread.IsBackground = true;

    thread.Start();

     

        private void StartSocketListen()

        {

            while (true)

            {

                try

                {

                    //当接收到一个客户端请求时,确认与客户端的连接

                    if (listener.Pending())

                    {

                        socket = listener.AcceptSocket();

                        //开辟线程(启动相关通信服务)

                        Thread threadServer = new Thread(new ThreadStart(ServiceRun));

                        threadServer.IsBackground = true;

                        threadServer.Start();

                    }

                }

                catch //(Exception ex)

                {

                    socket = null;

                }

                Thread.Sleep(200);

            }

        }

        private void ServiceRun()

        {

            //接收数据并存入buff数组中

            byte[] buff = new byte[1024];

            while (true)

            {

                if (socket != null)

                {

                    if (socket.Available > 0)

                    {

                        //接收数据

                        socket.Receive(buff, socket.Available, SocketFlags.None);

                        switch (buff[0])

                        {

                            case 48:

                                serial.Write("0");

                                serial.DiscardInBuffer();

                                break;

                            case 49:

                                serial.Write("1");

                                serial.DiscardInBuffer();

                                break;

                            case 50:

                                serial.Write("2");

                                serial.DiscardInBuffer();

                                break;

                            case 51:

                                serial.Write("3");

                                serial.DiscardInBuffer();

                                break;

                            case 52:

                                serial.Write("4");

                                serial.DiscardInBuffer();

                                break;

                        }

                    }

                }

                Thread.Sleep(100);

            }

     }

    运行PC程序,建好Zigbee通道,我们就可以用PDA来控制智能小车了。

    相关控制视频如下:

    http://video.sina.com.cn/v/b/40292055-1804832611.html

    1)、小车底盘

     http://item.taobao.com/item.htm?id=7218838776

    2)、四路直流电机驱动器

    http://item.taobao.com/item.htm?id=7218717808

    3)、.NET Micro Framework开发板

     http://item.taobao.com/item.htm?id=7117999726

       注:需要红牛开发板固件在 V1.0.0以上

    本文源码1http://www.sky-walker.com.cn/yefan/MFV40/SourceCode/PCZigbee_Socket.rar

    本文源码2http://www.sky-walker.com.cn/yefan/MFV40/SourceCode/PDASocket_wifi.rar

    MF快速参考: .NET Micro Framework 快速入门

    MF中文讨论组:http://space.cnblogs.com/group/MFSoft/

    微软官方论坛:MSDN微软中文技术论坛(.NET Micro Framework)

    开发板简明手册:http://blog.sina.com.cn/s/blog_6b938f630100kh0k.html

    【低价开发板】http://item.taobao.com/item.htm?id=7117999726

  • 相关阅读:
    (最短路)2017 计蒜之道 复赛 D. 百度地图导航
    13 树的应用-并查集
    12 二叉树-链式存储-二叉排序树(BST)
    11 二叉树-链式存储-先序遍历、中序遍历、后序遍历和层序遍历的非递归算法实现
    10 二叉树-链式存储-递归遍历
    9 线性表-队列-链式存储
    8 线性表-循环队列-顺序存储
    操作系统-页式虚拟存储器管理系统设计
    杂谈:Windows操作系统的介绍与对Win8操作系统市场反响冷淡原因的分析
    一学期积累下来的SQL语句写法的学习
  • 原文地址:https://www.cnblogs.com/yefanqiu/p/1867641.html
Copyright © 2011-2022 走看看