工控网首页
>

应用设计

>

串口WiFi在WinCE工控主板上的编程方法

串口WiFi在WinCE工控主板上的编程方法

  ETA6103工作时,对软件来说,完全当作串口来操作,发送AT指令建立互联网连接。配置信息、网络数据传输均通过一个串口传输。为方便用户编程,英创公司封装了一个CUartWifi类,提供了配置无线网络和建立TCP/UDP传输的公共函数,用户不用关心具体的AT指令即可进行开发。

使用说明

  参考例程uart_wifi,工程中添加Serial.h , Serial.cpp, ETA6103.h, ETA6103.cpp共4个文件。

  添加引用#include "ETA6103.h"

  即可创建类并使用CUartWifi myWifi;

WiFi连接管理

  参考例程APConnect,该例程简单展示如何进行AP连接的管理

  调用Open,AutoCfg方法初始化模块

  调用GetAPList方法查询附近的AP

  调用ConnectAP方法连接AP

  调用SetDefAP设置上电后默认连接的AP(不能在该AP无法连接时设置)

  调用DisconnectAP方法断开AP连接

  调用GetCurIP查询AP分配到的IP地址

UDP通信

  参考例程Udp。

  调用Open,AutoCfg方法初始化模块

  CUartWifi  m_ETA6103;

  m_ETA6103.Open();

  m_ETA6103.AutoCfg();

  调用ConnectUdp打开UDP连接,并创建线程用来等待消息接收

  ip = “192.168.201.248”;

  rport = 6000;

  lport = 5000;

  bRet = m_ETA6103.ConnectUdp(0, ip, rport, lport);

  m_hRecvThread = CreateThread(0, 0, RecvTread, this, 0, NULL);

  向远端发送数据

  char str[32] = “test udp”;

  len = strlen(str);

  bRet = m_ETA6103.SendMsg(0, str, len);

  接收线程处理

  DWORD CUdpDlg::RecvTread(LPVOID lparam)

  {

       CUdpDlg *pDlg = (CUdpDlg*)lparam;

       DWORD dwLen;

       char recvBuf[1024];

       while(!pDlg->m_bThreadStop)

       {      

           pDlg->m_ETA6103.WaitMsg();      //等待消息

           if (dwRet == WAIT_OBJECT_0)

           {

               pDlg->m_ETA6103.ReadMsg(0, recvBuf, 1023, &dwLen);

  //读数据

               while(dwLen>0)

               {

                   //处理代码

                   pDlg->m_ETA6103.ReadMsg(0, recvBuf, 1024, &dwLen);

                   //循环读直到读完buffer

               }  

           }

       }//while(!pDlg->m_bThreadStop)

       return 0;

  };

TCP客户端通信

  参考例程TcpClient。

  调用Open,AutoCfg方法初始化模块

  CUartWifi  m_ETA6103;

  m_ETA6103.Open();

  m_ETA6103.AutoCfg();

  调用ConnectUdp打开UDP连接,并创建线程用来等待消息接收

  ip = “192.168.201.248”;

  port = 6000;

  bRet = m_ETA6103. ConnectTcpServer (0, ip, port);

  m_hRecvThread = CreateThread(0, 0, RecvTread, this, 0, NULL);

  向远端发送数据

  char str[32] = “test tcpclient”;

  len = strlen(str);

  bRet = m_ETA6103.SendMsg(0, str, len);

  接收线程处理

  DWORD CUdpDlg::RecvTread(LPVOID lparam)

  {

       CUdpDlg *pDlg = (CUdpDlg*)lparam;

       DWORD dwLen;

       char recvBuf[1024];

       while(!pDlg->m_bThreadStop)

       {      

           pDlg->m_ETA6103.WaitMsg();      //等待消息

           if (dwRet == WAIT_OBJECT_0)

           {

               pDlg->m_ETA6103.ReadMsg(0, recvBuf, 1023, &dwLen);

  //读数据

               while(dwLen>0)

               {

                   //处理代码

                   pDlg->m_ETA6103.ReadMsg(0, recvBuf, 1024, &dwLen);

                   //循环读直到读完buffer

               }  

           }

       }//while(!pDlg->m_bThreadStop)

       return 0;

  };

  可以看到,TCP客户端的使用和UDP几乎一样,只是连接时调用的函数不一样

TCP服务端通信

  参考例程TcpClient。

  调用Open,AutoCfg方法初始化模块

  CUartWifi  m_ETA6103;

  m_ETA6103.Open();

  m_ETA6103.AutoCfg();

  调用CreateTcpServer打开服务端连接,并创建线程用来侦听客户端连接和数据接收

  port = 6000;

  bRet = m_ETA6103. CreateTcpServer(port);

  m_hRecvThread = CreateThread(0, 0, RecvTread, this, 0, NULL);

  向对应的客户端发送数据

  char str[32] = “test tcpserver”;

  int id = 1;     //向链接号为1的客户端发送信息

  len = strlen(str);

  bRet = m_ETA6103.SendMsg(id, str, len);

  接收线程处理

  在例程中,将客户端连接和消息接收,封装到同一个事件中,然后通过标记位判断事件的类型,客户可以根据需要,修改封装代码,改为各自事件分别处理,或者修改为多个线程来处理连接事件,和消息接收事件。

  DWORD CTcpServerDlg::RecvTread(LPVOID lparam)

  {

      CTcpServerDlg *pDlg = (CTcpServerDlg*)lparam;

      DWORD dwLen;

      char recvBuf[1024];

      DWORD dwRet;

      int len;

      int i;

      int n;

      while(!pDlg->m_bThreadStop)

      {      

          dwRet = pDlg->m_ETA6103.WaitMsg();

          if (dwRet == WAIT_OBJECT_0)

          {

              for(i=0; i<5; i++)

              {

                  if(pDlg->m_ETA6103.m_link[i].eventFlag & EVT_STAT)  //状态变化

                  {

                      if(pDlg->m_ETA6103.m_link[i].stat == 0)//close

                      {

                          //用户断开代码处理

                      }

                      else//connected

                      {

                          //用户连接代码处理

                      }

                  }

                  if(pDlg->m_ETA6103.m_link[i].eventFlag & EVT_RECV)  //数据接收

                  {

                      pDlg->m_ETA6103.ReadMsg(i, recvBuf, 1020, &dwLen);

                      while(dwLen>0)

                     {

                          //数据接收代码处理

                          pDlg->m_ETA6103.ReadMsg(0, recvBuf, 1024, &dwLen);

                      }

                  }

                  if(pDlg->m_ETA6103.m_link[i].eventFlag & EVT_ERR)   //错误事件

                  {

                      //错误事件代码处理

                  }

                  pDlg->m_ETA6103.m_link[i].eventFlag = 0;

              }      

          }

      }//while(!pDlg->m_bThreadStop)

      return 0;

  }

速度测试例程

  例程TestSpeed用于测试文件接收速度。通过SetCurUart可以设置波特率(最大460800,建议默认115200),用户可以选定最适合自己应用的配置。

  注意,在高速传输过程中,如果接收BUFFER收满来不及处理,将发生数据丢包。建议参考例程,在对应位置添加处理代码。

审核编辑(
王静
)
投诉建议

提交

查看更多评论
其他资讯

查看更多

Windows下STM32单片机eclipse编译环境搭建

Android Studio应用开发简介

WinCE工控主板WiFi解决方案

敬请关注成都英创微信公众号

WinCE工控主板通过PPI协议连接西门子PLC