简介
英创公司ESMARC系列工控主板支持8位数据/地址复用的精简ISA总线,通过精简ISA总线可以扩展更多网口,如ETA728和ETA528,本文将介绍如何使用经过扩展的多路网口。
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,网关等参数。
通过telnet或打开WINCE系统命令提示行,使用ipconfig也可以查看新增网络的参数(未插网线时IP为0.0.0.0)。
注意:在系统中有多个网络时,一定要注意各个网络不应同时设置到一个网段内,会影响系统路由。
代码控制
查询网络
#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查看其它指令的使用说明。
可以增加路由,减少路由,修改路由优先级等。
英创提供了文章内所述程序及源代码,有需要的客户可以联系英创工程师获得。
成都英创信息技术有限公司 028-8618 0660