簡介
英創公司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??梢圆榭醇芭渲闷渚W絡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