WinCE工控主板多网口使用方法

 2022-7-22 18:39:55     作者:杨阳    

简介


  英创公司ESMARC系列工控主板支持8位数据/地址复用的精简ISA总线,通过精简ISA总线可以扩展更多网口,如ETA728和ETA528,本文将介绍如何使用经过扩展的多路网口。


WinCE工控主板的多网口多串口扩展WinCE工控主板的多网口多串口扩展
ETA528:8路串口+2路网口扩展模块ETA728:2路网口扩展模块


加载驱动


  ESMARC WinCE系统中已经集成了扩展模块的驱动程序,在使用扩展模块之前需要通过系统自带的命令使能相应的驱动程序。具体操作方法是通过telnet命令登陆WinCE主板(或打开WinCE系统的命令提示行)后执行相应的命令,例如:

  >ETA728Set 2 ; 使能ETA728 两路网口扩展模块驱动

  >ETA728Set 1 ; 使能ETA728 一路网口扩展模块驱动

  >ETA728Set 0 ; 禁止ETA728驱动程序加载

  重启板子后生效。


新增网络查看及配置


  以ESM335X为例, 连接模块ETA728,并执行命令ETA728Set 2加载模块驱动后。进入控制面板->网络连接,可以看到板子多出了两个网络,DM9K3和DM9K4。可以查看及配置其网络IP,网关等参数。


WINCE工控主板多网口扩展使用方法.png


  通过telnet或打开WINCE系统命令提示行,使用ipconfig也可以查看新增网络的参数(未插网线时IP为0.0.0.0)。


WINCE工控主板多网口扩展使用方法.png


  注意:在系统中有多个网络时,一定要注意各个网络不应同时设置到一个网段内,会影响系统路由。


代码控制


  查询网络


#include <iphlpapi.h>
IP_ADAPTER_INFO AdapterInfo[8];
ULONG OutBufLen = sizeof(IP_ADAPTER_INFO);
GetAdaptersInfo(AdapterInfo, &OutBufLen); 
GetAdaptersInfo(AdapterInfo, &OutBufLen);   //调两次,可以百度下这个API


  板子所有网络的信息就存储在AdapterInfo结构体数组中了,其中包括,网络名,如:判断是否为ETA728扩展的第一个网络


if (strcmp(AdapterInfo[0].AdapterName, “DM9K3”) == 0)
{
  //第一个网络网口名为”DM9K3” 
}


  获得第二个网络的MAC

  BYTE *mac =  AdapterInfo[1].Address;


  获得第三个网络的IP

  BYTE *mac =  AdapterInfo[2].IpAddressList;


  修改IP

  

  参考光盘中提供的例程,以设置网络名为”DM9K3”的网口参数为例,代码如下。

#include "netip_api.h"
#include <iphlpapi.h>
 
NETWORK_ADPTS_NAME   AdaptersName;
NETWORK_ADPT_INFO AdptInfo;
DWORD             NewIPAddr;
DWORD             NewMask;
DWORD             NewGateWay;
DWORD             dwType;
int               i1;
 
   
StringToIPAddr(L"192.168.1.248", &NewIPAddr );
 
StringToIPAddr(L"255.255.255.0", &NewMask);
StringToIPAddr(L"192.168.1.1", &NewGateWay);
 
bRes = GetNetWorkAdaptersName( &AdaptersName );
 
memset ((char *)&AdptInfo, 0, sizeof(AdptInfo));
for(int i1=0; i1<AdaptersName.NumOfAdapters; i1++ )
{
    if (wcscmp(AdaptersName.szAdapterName[i1],L"DM9K3") == 0)
    {
        bRes = GetNetWorkAdapterInfo( AdaptersName.szAdapterName[i1], &AdptInfo );
        AdptInfo.IPAddr = NewIPAddr;
        AdptInfo.SubnetMask = NewMask;
        AdptInfo.Gateway = NewGateWay;
        SetNetWorkAdapterInfo( AdaptersName.szAdapterName[i1], &AdptInfo );
        break;
    }
}

  

  Socket调用


  参考光盘中网络例程,当系统只有一个网络时,可以设置socket的IP为0.0.0.0,即默认的网口进行通信。当系统中有多个网络时,需要指定的网口进行通信时,绑定端口时就需要设置该网口的IP,参考例程第3步。


  比如希望使用ETA728的第一个网口进行通信时,则需要先获得网口名为”DM9K3”的网络IP,绑定时绑定该IP。


WSADATA wsa;
//1.初始化socket资源
if (WSAStartup(MAKEWORD(1,1),&wsa) != 0)
{
	return -1;//代表失败
}

//2.创建套接字
if ((m_socketServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))<0)
{
	return -2;
}

//3.绑定端口
SOCKADDR_IN  serverAddr;
ZeroMemory((char *)&serverAddr,sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(m_dwPort);
//serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); //单网络时
serverAddr.sin_addr.s_addr = htonl(m_dwIP); //绑定指定网口IP
if (bind(m_socketServer, (struct sockaddr *)&serverAddr, sizeof(serverAddr))<0)
{
	return -3 ;
}

//4.设置为侦听套接字
if (listen(m_socketServer, 8)!=0)
{
	return -4;
}

//4.设置监听套接字通讯模式
//DWORD ul= 1;
//ioctlsocket(m_socketServer,FIONBIO,&ul);

//5.创建侦听通讯线程,在线程里,等待客户端连接请求
m_bListenThreadStop = FALSE;
m_hListenThread = CreateThread(NULL , 0, SocketListenThread, this, 0, NULL);
if (m_hListenThread == NULL)
{
	closesocket(m_socketServer);
	return -5; 
}


  通过绑定socket,可以实现应用程序同时在多个网络中进行通信的目的。


  路由设置


  在一个系统中有多个网络时,系统通过路由表决定网络数据经哪个网络的网口进行通信。当代码无法连通网络时,可以检查下是否是路由设置的问题。

  通过route print命令可以查看系统路由表。

  使用route help查看其它指令的使用说明。

  可以增加路由,减少路由,修改路由优先级等。


  英创提供了文章内所述程序及源代码,有需要的客户可以联系英创工程师获得。