2024年1月7日发(作者:)
1. Zigbee基本通信实验
1.1 实验目的
了解实Zigbee的原理及在软件上如何方便使用;
掌握在Windows CE 6.0下进行UART编程的方法。
1.2 实验设备
硬件:EduKit-IV嵌入式教学实验平台、Mini270核心子板、Zigbee模块、PC 机;
软件:Windows 2000/NT/XP 以及Windows 平台下的VS2005开发环境。
1.3 实验内容
利用Microsoft Visual Studio 2005编写一个可运行于EduKit-IV型实验箱Windows CE 6.0操作系统上的应用程序;
学习和掌握EduKit-IV教学实验平台中通过UART与Zigbee模块通信,实现对Zigbee模块的配置和对等网模式下的通信。
1.4 实验原理
1.4.1 Zigbee起源
无线网络系统源自美国军方的“电子尘埃(eMote)”技术,是目前国内、外研究的热点技术之一。该系统基于IEEE802.15.4规范的无线技术,工作在2.4 GHz或868/928 MHz,用于个人区域网和对等网状网络。ZigBee是一种新兴的近距离、低复杂度、低功耗、低数据速率、低成本的无线网络技术。它是一种介于红外无线技术和蓝牙之间的技术提案。主要用于近距离无线连接。它依据802.15.4标准。在数千个微小的传感器之间相互协调实现通信。这些传感器只需要很少的能量,以接力的方式通过无线电波将数据从一个传感器传到另一个传感器,所以它们的通信效率非常高。相对于现有的各种无线通信技术,无线ZigBee网络技术将是近距离通信最低功耗和成本的技术。这一技术目前正向工业、民用方向推广和发展,市场前景广阔。包括国家863计划等项目都在进行相关
的研究工作。因此,本文介绍的基于ZigBee技术的嵌入式无线网络平台,这一无线网络平台可应用于工业控制、信息家电、安保系统、环境监测、港务运输、煤矿安全、农业自动化和医疗监护设备等许多行业和设备。具有广泛的适应性。并能弥补其他无线通信技术的不足,保证其安全性,降低服务成本。
1.4.2 ZigBee网络配置
1. 网络设备组成。
ZigBee网络设备主要包括网络协调器、全功能设备和精简功能设备3类。
网络协调器:
包含所有的网络消息,是3种设备类型中最复杂的一种,存储容量最大、计算能力最强。功能是发送网络信标、建立一个网络、管理网络节点、存储网络节点信息、寻找一对节点间的路由消息、不断地接收信息。
全功能设备:
全功能设备(Full-Function Device,FFD)可以担任网络协调者,形成网络,让其他的FFD或精简功能装置(RFD)联结。FFD具备控制器的功能,可提供信息双向传输。其设备特性有:附带由标准指定的全部IEEE 802.15.4功能和所有特征;更强的存储能力和计算能力可使其在空闲时起网络路由器作用;也能用作终端设备。
精简功能设备:
精简功能设备(Reduced-Function Device,RFD)只能传送信息给FFD或从FFD接收信息,其设备特性有:附带有限的功能来控制成本和复杂性;在网络中通常用作终端设备; RFD由于省掉了内存和其他电路,降低了ZigBee部件的成本,而简单的8位处理器和小协议栈也有助于降低成本。
2. 网络节点类型。
从网络配置上,ZigBee网络中有3种类型的节点:ZigBee协调点、ZigBee路由节点和ZigBee终端节点。
ZigBee协调点:
ZigBee协调点在IEEE 802.15.4中也称为PAN(Personal Area Network)协调点(ZigBee
Coordinator,ZC),在无线传感器网络中可以作为汇聚节点。ZigBee协调点必须是FFD,一个ZigBee网络只有一个ZigBee协调点,它往往比网络中其他节点的功能更强大,是整个网络的主控节点。它负责发起建立新的网络、设定网络参数、管理网络中的节点以及存储网络中节点信息等,网络形成后也可以执行路由器的功能。ZigBee协调点是3种类型ZigBee节点最为复杂的一种,一般由交流电源持续供电。
ZigBee路由节点:
ZigBee路由节点(ZigBee Router,ZR)也必须是FFD。ZigBee路由节点可以参与路由发现、消息转发,通过连接别的节点来扩展网络的覆盖范围等。此外,ZigBee路由节点还可以在它的个人操作空间(POS,Personal Operating Space)中充当普通协调点(IEEE 802.15.4称为协调点)。普通协调点与ZigBee协调点不同,它仍然受ZigBee协调点的控制。
ZigBee终端节点:
ZigBee终端节点(ZigBee EndDevice,ZE)可以是FFD或者RFD,它通过ZigBee协凋点或者ZigBee路由节点连接到网络,但不允许其他任何节点通过它加入网络,ZigBee终端节点能够以非常低的功率运行。
3. 网络工作模式。
ZigBee网络的工作模式可以分为信标(Beacon)和非信标(Non-beacon)2种模式,信标模式实现了网络中所有设备的同步工作和同步休眠,以达到最大限度的功耗节省,而非信标模式则只允许ZE进行周期性休眠,ZC和所有ZR设备必须长期处于工作状态。
信标模式下,ZC负责以一定的间隔时间(一般在15ms~4min)向网络广播信标帧,2个信标帧发送之间有16个相同的时槽,这些时槽分为网络休眠区和网络活动区2个部分,消息只能在网络活动区的各时槽内发送。
非信标模式下,ZigBee标准采用父节点为ZE子节点缓存数据,ZE主动向其父节点提取数据的机制,实现ZE的周期性(周期可设置)休眠。网络中所有父节点需为自己的ZE子节点缓存数据帧,所有ZE子节点的大多数时间都处于休眠模式,周期性的醒来与父节点握手以确认自己仍处于网络中,其从休眠模式转入数据传输模式一般只需要15ms。
1.4.3 ZigBee的网络拓扑结构
ZigBee主要采用了3种组网方式:星型网、网状网和簇状网。其中网络协调器相当于本试验中的中心节点,全功能设备相当于本试验中的路由节点,精简功能设备相当于本试验中的终端节点。
如图1所示在星型网中,一个功能强大的主器件位于网络的中心,作为网络协调者,其它的主器件或从器件分布在其覆盖范围内。由于网络协调者定义了整个网络的时分复用和多址接人方式,因此星型网的控制和同步都比较简单,通常用在设备薯莨比较少的场合。
图1 星型网
如图2所示,网状网是由主器件连接在一起形成的,网状网络拓扑结构的网络具有强大的功能,网络可以通过“多级跳”的方式来通信;该拓扑结构还可以组成极为复杂的网络;网络还具备自组织、自愈功能;
图2 网状网
星型网和网状网相结合则形成了簇状网,如图3所示。各个子网内部都以星型网连接。其主器件又以对等的方式连接在一起。信息流首先传到同一个子网内的主节点。通过网关节点达到更高层的子网,随后继续上传,直至到达中心采集设备。中心采集设备与普通的WPAN设备相比具有更强的处理能力。簇状网可以用于覆盖范围较大的区域,
图3 簇状网
在上述网络拓扑结构中,网络的形成和维护通过设备间的通信自动实现,不需要人32干预网络
的建立、扩展或者减小。ZigBee网络中的所有设备都被动态分配到IEEE地址。
1.4.4 SZ05-ZBEE嵌入式无线通信模块介绍
顺舟科技SZ05系列嵌入式无线通信模块,集成了符合ZIGBEE协议标准的射频收发器和微处理器,它具有通讯距离远、抗干扰能力强、组网灵活、性能可靠稳定等优点和特性;可实现点对点、一点对多点、多点对多点之间的设备间数据的透明传输;可组成星型、树型和蜂窝型网状网络结构。
SZ05系列无线通信模块数据接口为TTL电平收发接口。可以实现数据的广播方式发送、按照目标地址发送模式,除可实现一般的点对点数据通信功能外,还可实现多点之间的数据通讯,串口通信使用方法简单便利,可以大大简短模块的嵌入匹配时间进程。
SZ05系列无线通信模块分为中心协调器、路由器和终端节点,这三类设备具备不同的网络功能,中心协调器是网络的中心节点,负责网络的发起组织、网络维护和管理功能;路由器负责数据的路由中继转发,终端节点只进行本节点数据的发送和接收。中心协调器、路由器和终端节点这三种类型的设备在硬件结构上完全一致,只是设备嵌入软件不同,只需通过跳线设置或软件配置即可实现不同的设备功能。
表1描述了模块左侧引脚相应标识
表1 模块左侧引脚说明
引脚号
1
2
3
4
5
6
7
8
9
标识
GND
+5V
RX1/TTL
TX1/TTL
SGND
TX2/RS232
RX2/RS232
RESET
功能
电源地
电源正5V
TTL 电平输入
TTL 电平输出
串口RS232 信号地
串口RS232输出
串口RS232输入
系统保留
系统复位
备注
输入
TTL 电平输入
接用户系统输入RX
信号地
接用户232 输入
接用户232 输出
悬空
低电平复位
表2描述了模块右侧引脚相应标识
表2 模块右侧引脚说明
引脚号
1
2
3
标识
DATA
RUN
NET
功能
串口数据收发指示
系统运行指示
网络指示
备注
低电平点亮,数据收发即闪烁
低电平点亮,间隔1 秒闪烁
低电平点亮,中心节点建网成功点亮,从节点入网后点亮。
4 ALARM
系统告警指示 低电平点亮
5
9
SLEEP
CONFIG
低功耗
配置接口
低电平进入低功耗,高电平或悬空正常运行。
低电平有效,或加跳线帽,进入系统配置状态。
1.4.5 Zigbee模块配置
SZ05-ZBEE 无线通信模块复位后,CONFIG引脚进入低电平状态3 秒,系统进入配置状态;高电平或悬空状态则进入工作状态。配置接口是用于对本产品的某些参数进行配置的接口,串口信号为RS232配置如表3所示:
表3 配置模式时串口参数配置
串口参数
串口波特率
串口校验
数据位
停止位
配置值
38400
NONE
8
1
设备配置选项如下所示:
1. 通信信道CHANNEL设置如表4所示。
表4 通信信道参数配置
CHANNEL选项
4
9
E
F
G
配置说明
2.425GHZ
2.450GHZ
2.475GHZ
2.480GHZ
AUTO模式,自动选择最佳信道。
2.
网络类NET_TYPE设置如表5所示。
表5 网络类型参数配置
NET_TYPE选项
MESH
STAR
PEER
网络选项
网状网
星型网
对等网
配置说明
主从网络,网络中心必须有唯一的中心节点。
非主从网,无中心节点。
备注
在同一个网络中,网络类型必须设置相同。
3. 设备类型NODE_TYPE设置如表6所示。
表6 设备类型参数配置
NODE_TYPE选项
PAN_Coord
ROUTER
END_DEVICE
设备类型
中心节点
中继路由
终端设备
兼有终端设备功能
配置说明
4. 网络号NET_ID设置如表7所示。
表7 网络号参数配置
NET_ID选项选项
NET_ID
ID范围
00-FF
配置说明
同个网络中ID必须相同
5.
数据发送模式TX_TYPE设置如表8所示。
表8 数据发送模式参数配置
TX_TYPE选项
BROADCAST
MASTER—SLAVE
POINT—POINT
网络选项
广播模式
主从模式
点对点
无需目标地址。
配置说明 备注
目标地址为2 字节中心节点必需目标地址,非中心节点无需目标地址。
的MAC 地址,加在必需目标地址。
数据包前即可。
6. 设备地址MAC_ADDR设置如表9所示。
表9 设备地址参数配置
MAC_ADDR选项选项
MAC_ADDR
ID范围
0000-FFFF
配置说明 备注
中心节点为0000 同个网络不能有相同地址节点
7. 数据类型DATA_TYPE设置如表10所示。
表10 数据类型参数配置
DATA_TYPE选项
ASCII
HEX
数据类型
ASCII码
16进制
配置说明
只在按目标地址发送情况下设置,在广播发送情况下无须设置。
8. 数据位DATA_BIT设置如表11所示。
表11 数据位参数配置
DATA_TYPE 选项
7+1+1
8+0+1
8+1+1
数 据 类 型
7位数据+1位校验+1位停止
7位数据+无校验+1位停止
8 位数据+1位校验+1位停止
配 置 说 明
需要跟数据校验设置结合起来选择。
9. 波特率设置。
10. 数据校验DATA_PARITY设置如表12所示。
表12 数据校验参数配置
DATA_PARIT选项
NONE
EVEN
ODD
设备类型
无校验
偶校验
奇校验
配置说明
选择匹配的校验类型。
11. 串口超时TIME_OUT设置。
12. 数据源地址SRC_ADDR设置如表13所示。
表13 数据源地址是否输出参数配置
SRC_ADR 选项
NOT OUTPUT
HEX
ASCII
数据源地址
不输出源地址
16进制输出
ASCII输出
配 置 说 明
根据应用需要选择是否输出数据包源地址。
16 进制方式输出源地址格式:2 字节源地址+有效数据;
ASCII 方式输出源地址格式:4 字节源地址+有效数据。
1.4.6 数据发送格式说明
1. 数据发送模式如表14所示。
表14 数据发送模式表
模块类型
中心节点
发送模式
广播
主从或点对点
非中心节点 广播
主从
点对点
目标节点
网内所有非中心节点
目标地址的节点
网内所有非中心节点
中心节点
目标地址的节点
发送模式
数据直接发送
目标地址+数据
数据直接发送
数据直接发送
目标地址+数据
2. 数据发送帧格式如表15所示。
表15 数据发送帧格式
发送模式
数据直接发送
目标地址+数据
数据编码
16 进制目标地址
ASCII目标地址
数据帧格式
不需要做任何变动
2字节目标地址+数据
4字节目标地址+数据
1.4.7 硬件连接
图4 Zigbee与Min270之间的硬件连接
其中引脚11和10分别连到主板的地和电源;引脚12和13分别连接到主板Extern B1区的TXD和RXD;引脚9和18分别连接到主板Extern B1区的SP1TXD和SP1RXD。
1.5 实验步骤
1)准备实验环境。将mini270核心子板插到主板接口槽上,将实验平台上电运行。
2)按照基于《Xscale270 嵌入式Windows CE开发实验与实践》中所讲的将对应驱动ZGB添加到系统映像中。将此映像烧写到Min270中。
3)将两个Zigbee模块分别插到两个试验箱的Extern B区,打开主板电源,等待Windows CE 6.0系统运行起来。启动后,将Embest_(通过编译Embest_应用程序工程得到)通过SD卡拷贝到已经运行了Windows CE 6.0的EduKit-IV实验平台中运行(也可以通过同步软件ActiveSync将程序直接传送到实验平台)。双击运行,出现如下图界面:
图5 Embest_Zigbee应用程序初始界面
4)单击上图中的Open按钮,来打开对应串口驱动。若打开成功出现如图6所示界面。
图6 打开串口驱动成功后的界面
5)在单击Configure按钮进入配置界面,如图7所示。界面左边为默认配置选项,可以改变成自己希望的配置。
图7 Zigbee模块配置参数输入界面
6)在单击Apply按钮来提交配置参数,等待配置完成,如图8所示。配置完成后进入如图9所示界面。
图8 Zigbee模块配置等待界面
图9 Zigbee模块配置完成界面
7)依次配置网内的每个Zigbee模块,配置完成后,各模块之间就可以相互通信了。此出将各Zigbee模块都设置成对等网的终端设备。如下演示地址分别为0001和为0002的两个Zigbee模块之间的通信。
8)首先地址为0001的Zigbee模块给地址为0002的Zigbee模块发送3344。方法为在发送文本框中输入00023344,然后单击Send按钮,也就将数据发送出去了。如图10所示。
图10 Zigbee模块发送数据界面
9)在地址0001向0002数据后,0002会收到数据,如图11所示。
图11 Zigbee模块接收数据界面
10)在对等网模式下,当两个终端节点之间的距离在有效覆盖范围之外时,可以在他们之间加上若干个路由节点,使得他们之间形成一条通路。之后之两个终端节点就可以通过路由节点转发来相互通信。
1.6 参考程序
串口读数据线程函数:
这个函数负责不断读取试验箱上COM1中的数据。
//串口读线程函数
DWORD CSerial::ReadThreadFunc(LPVOID lparam)
{
CSerial *ceSeries = (CSerial *)lparam;
DWORD evtMask;
BYTE* readBuf = NULL;
DWORD actualReadLen = 0;
DWORD willReadLen;
DWORD dwReadErrors;
COMSTAT cmState;
//清空缓冲
ASSERT(ceSeries->m_hComm != INVALID_HANDLE_VALUE);
//清空串口
PurgeComm(ceSeries->m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR);
SetCommMask(ceSeries->m_hComm, EV_RXCHAR | EV_CTS | EV_DSR );
while(TRUE)
{
if(WaitCommEvent(ceSeries->m_hComm,&evtMask,0))
{
SetCommMask(ceSeries->m_hComm, EV_RXCHAR | EV_CTS | EV_DSR );
if(evtMask & EV_RXCHAR)
{
ClearCommError(ceSeries->m_hComm, &dwReadErrors, &cmState);
willReadLen = e;
if(willReadLen <= 0)
{
}
readBuf = new BYTE[willReadLen];
ReadFile(ceSeries->m_hComm, readBuf, willReadLen, &actualReadLen ,0);
if(actualReadLen>0)
{
((CEmbest_ZigbeeDlg
continue;
*)(ceSeries->m_pPortOwner))->response(readBuf,actualReadLen);
}
}
return 0;
}
if(WaitForSingleObject(ceSeries->m_hReadCloseEvent,500) == WAIT_OBJECT_0)
{
}
break;
}
}
delete[] readBuf;
Zigbee应用程序对所读到的串口数据的处理函数:
这个函数负责对从串口中读到的数据做进一步处理。其中cfgmode用来标志是否处于配置模式。
void CEmbest_ZigbeeDlg::response(BYTE* buf,int bufLen)
{
if(cfgmode==1) SetEvent(CFGEvent);
else
{
}
}
buf[bufLen]='0';
CString strShow (buf);
m_ReceiveData=m_ReceiveData+strShow;
GetDlgItem(IDC_EDIT6)->SetWindowText(m_ReceiveData);
获取配置参数函数:
这个函数负责将窗体配置界面上的用户输入参数转化为可以直接写到Zigbee模块的数据格式,并检查参数是否合乎要求。此函数最后有几个判断是用来检查用户输入的参数之间是否有冲突的,若有则提示用户重新输入。
int CEmbest_ZigbeeDlg::getconfig(void)
{
pComboBox=(CComboBox*)GetDlgItem(IDC_COMBO3);
select=pComboBox->GetCurSel();
temp0=select;
switch(select)
{
……
pComboBox=(CComboBox*)GetDlgItem(IDC_COMBO2);
select=pComboBox->GetCurSel();
temp1=select;
switch(select)
{
c……
}
CComboBox *pComboBox;
int select;
int length;
int temp0,temp1,temp2,temp3,temp4;
char *buffer=NULL;
int i;
pComboBox=(CComboBox*)GetDlgItem(IDC_COMBO1);
select=pComboBox->GetCurSel();
switch(select)
{
……
}
}
GetDlgItem(IDC_EDIT1)->GetWindowText(temp__id);
length=temp__gth();
buffer=(char*)(LPCTSTR)temp__id;
if(length!=2)
{
……
}
else
{
for(i=0;i<4;i=i+2)
{if(!(((buffer[i]>='0')&&(buffer[i]<='9'))||((buffer[i]>='a')&&(buffer[i]<='f'))||((buffer[i]>='A')&&(buffer[i]<='F'))))
GetDlgItem(IDC_EDIT2)->GetWindowText(temp__addr);
length=temp__gth();
buffer=(char *)(LPCTSTR)temp__addr;
if(length!=4)
{
……
}
else
{
for(i=0;i<8;i=i+2)
{
}
pComboBox=(CComboBox*)GetDlgItem(IDC_COMBO5);
select=pComboBox->GetCurSel();
temp2=select;
switch(select)
{
……
}
}
{
}
……;
if(!(((buffer[i]>='0')&&(buffer[i]<='9'))||((buffer[i]>='a')&&(buffer[i]<='f'))||((buffer[i]>='A')&&(buffer[i]<='F'))))
pComboBox=(CComboBox*)GetDlgItem(IDC_COMBO7);
select=pComboBox->GetCurSel();
switch(select)
{
{
……
}
}
}
……
pComboBox=(CComboBox*)GetDlgItem(IDC_COMBO8);
select=pComboBox->GetCurSel();
temp4=select;
switch(select)
{
}
……
pComboBox=(CComboBox*)GetDlgItem(IDC_COMBO9);
select=pComboBox->GetCurSel();
switch(select)
{
}
……
pComboBox=(CComboBox*)GetDlgItem(IDC_COMBO4);
select=pComboBox->GetCurSel();
temp3=select;
switch(select)
{
}
……
GetDlgItem(IDC_EDIT3)->GetWindowText(temp__out);
length=temp__gth();
}
buffer=(char*)(LPCTSTR)temp__out;
if(length!=2)
{
}
else
{
for(i=0;i<4;i=i+2)
{
AfxMessageBox(_T("time_out ERROR!"));
return 0;
if(!(((buffer[i]>='0')&&(buffer[i]<='9'))||((buffer[i]>='a')&&(buffer[i]<='f'))||((buffer[i]>='A')&&(buffer[i]<='F'))))
}
pComboBox=(CComboBox*)GetDlgItem(IDC_COMBO6);
select=pComboBox->GetCurSel();
switch(select)
{
}
{
}
AfxMessageBox(_T("time_out ERROR!"));
return 0;;
……
}
if(temp1==2&&temp2==1)
{
……
}
if(temp1==2&&temp0==0)
{
……
}
if((temp3==0&&temp4!=1)||(temp3!=0&&temp4==1))
{
……
}
if(temp0==0)
{
GetDlgItem(IDC_EDIT2)->SetWindowText(_T("0000"));
}
}
return 1;
写配置参数线程函数:
此函数用来将合乎要求的配置参数依次写入Zigbee模块。
DWORD CEmbest_ZigbeeDlg::writecfg(LPVOID lparam)
{
CEmbest_ZigbeeDlg* pDlg = (CEmbest_ZigbeeDlg*)lparam;
WaitForSingleObject(CFGEvent,INFINITE);
pDlg->m_(_T("SHUNCOM"));
pDlg->SendData();
WaitForSingleObject(CFGEvent,INFINITE);
if(change__addr)
{
}
if(change__type)
{
}
if(change__type)
pDlg->m_(_T("3"));
pDlg->SendData();
WaitForSingleObject(CFGEvent,INFINITE);
pDlg->m_(_type);
pDlg->SendData();
WaitForSingleObject(CFGEvent,INFINITE);
WaitForSingleObject(CFGEvent,INFINITE);
pDlg->m_(_T("1"));
pDlg->SendData();
while(1)
{
SuspendThread(hThread_config);
pDlg->m_(_T("1"));
pDlg->SendData();
WaitForSingleObject(CFGEvent,INFINITE);
pDlg->m_(temp__addr);
pDlg->SendData();
WaitForSingleObject(CFGEvent,INFINITE);
{
}
if(change__id)
{
}
if(change_l)
{
}
if(change__type)
{
}
if(change__type)
{
pDlg->m_(_T("8"));
pDlg->SendData();
pDlg->m_(_T("7"));
pDlg->SendData();
WaitForSingleObject(CFGEvent,INFINITE);
pDlg->m_(_type);
pDlg->SendData();
WaitForSingleObject(CFGEvent,INFINITE);
pDlg->m_(_T("6"));
pDlg->SendData();
WaitForSingleObject(CFGEvent,INFINITE);
pDlg->m_(l);
pDlg->SendData();
WaitForSingleObject(CFGEvent,INFINITE);
pDlg->m_(_T("5"));
pDlg->SendData();
WaitForSingleObject(CFGEvent,INFINITE);
pDlg->m_(_id);
pDlg->SendData();
WaitForSingleObject(CFGEvent,INFINITE);
pDlg->m_(_T("4"));
pDlg->SendData();
WaitForSingleObject(CFGEvent,INFINITE);
pDlg->m_(_type);
pDlg->SendData();
WaitForSingleObject(CFGEvent,INFINITE);
}
WaitForSingleObject(CFGEvent,INFINITE);
pDlg->m_(_type);
pDlg->SendData();
WaitForSingleObject(CFGEvent,INFINITE);
if(change__rate)
{
}
if(change_)
{
}
if(change__bit)
{
}
if(change__out)
{
pDlg->m_(_T("C"));
pDlg->SendData();
WaitForSingleObject(CFGEvent,INFINITE);
pDlg->m_(_out);
pDlg->SendData();
pDlg->m_(_T("B"));
pDlg->SendData();
WaitForSingleObject(CFGEvent,INFINITE);
pDlg->m_(_bit);
pDlg->SendData();
WaitForSingleObject(CFGEvent,INFINITE);
pDlg->m_(_T("A"));
pDlg->SendData();
WaitForSingleObject(CFGEvent,INFINITE);
pDlg->m_();
pDlg->SendData();
WaitForSingleObject(CFGEvent,INFINITE);
pDlg->m_(_T("9"));
pDlg->SendData();
WaitForSingleObject(CFGEvent,INFINITE);
pDlg->m_(_rate);
pDlg->SendData();
WaitForSingleObject(CFGEvent,INFINITE);
}
WaitForSingleObject(CFGEvent,INFINITE);
if(change__addr)
{
}
CloseHandle(CFGEvent);
Sleep(1000);
pDlg->cfgmode=0;
DeviceIoControl(m_hZGB,IOCTL_ZGB_CONFIGURE_HIGH,NULL,0,NULL,0,NULL,NULL);
DeviceIoControl(m_hZGB,IOCTL_ZGB_RESET,NULL,0,NULL,0,NULL,NULL);
CloseHandle (m_hZGB);
if(temp_m_nBaud!=38400||temp_m_cParity!=0||temp_m_nDatabits!=8)
{
}
pDlg->GetDlgItem(IDC_EDIT4)->SetWindowText(_T(" Configure
m_bOpenPort=FALSE;
pDlg->OpenAndClose();
pDlg->m_(_T("F"));
pDlg->SendData();
WaitForSingleObject(CFGEvent,INFINITE);
pDlg->m_(_addr);
pDlg->SendData();
WaitForSingleObject(CFGEvent,INFINITE);
end!"));
}
}
pDlg->GetDlgItem(IDC_BUTTON1)->SetWindowTextW(_T("Configure"));
pDlg->GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE);
1.7 练习题
以上实验只是介绍了在对等网模式下,两个终端节点之间的距离在对方的有效覆盖范围内时的通信。读者可以完成当它们之间的距离太远时,可以在它们之间加上若干个中继路由节点,来实现两个终端节点之间的通信。


发布评论