Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1919794
  • 博文数量: 376
  • 博客积分: 2147
  • 博客等级: 大尉
  • 技术积分: 3642
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-06 10:47
文章分类

全部博文(376)

文章存档

2019年(3)

2017年(28)

2016年(15)

2015年(17)

2014年(182)

2013年(16)

2012年(115)

我的朋友

分类: 嵌入式

2014-06-28 18:17:18

原文地址:Z-Stack无线透明传输 作者:frankzfz

   无线数据传输,是指用无线信道替代有线连接进行数据传输。无线数据传输技术是当代通信技术领域的一个重要分支,近年来,随着科学技术的飞速发展,特别是在全球信息技术及其产业化的推动下,无线数据传输技术得到了迅猛的发展。
透明数据传输是指:上位机与模块进行信息交换的数据格式,没有像指令字头、结束符等数据包信息,只要上位机串口有数据输出,模块就把串口的数据以无线方式编码发送,当接收模块接收到发射模块发送的无线数据信号后进行解码,把解码后的数据按发送端的格式从串口输出。也就是说模块对使用者是开放的,透明的,实际上,在点对多点的组网通信中,我们完全可以将无线数据透明传输方式等同于有线连接的总线方式。不同点是无线连接方式存在较大延时。
   无线数据透明传输系统是指设计具有RS232RS485等标准接口的无线数据透明传输模块,用该模块替代串口连接线,多个模块互相通过无线协议实现数据传输,形成一个无线数据传输系统。
   在ZigBee无线数传替代串口连接线。PC通过RS 232串行接口发送数据给ZigBee无线数传模块,模块接收数据后通过射频收发器将数据转发给另一端的ZigBee无线数传模块,该模块通过射频收发器接收数据后直接发送到RS232串行接口供PC机接收。
#define SERIALAPP_MSG_RTRY_EVT       0x0001 //重发数据
#define SERIALAPP_RSP_RTRY_EVT       0x0002//重发响应信息
#define SERIALAPP_MSG_SEND_EVT       0x0004 //发送数据

#define SERIALAPP_MAX_CLUSTERS       2
#define SERIALAPP_CLUSTERID1         1    //数据传输
#define SERIALAPP_CLUSTERID2         2    //接收数据响应
将命令添加到命令列表
const cId_t SerialApp_ClusterList[SERIALAPP_MAX_CLUSTERS] =
{
  SERIALAPP_CLUSTERID1,
  SERIALAPP_CLUSTERID2
};
简单描述符定义
const SimpleDescriptionFormat_t SerialApp_SimpleDesc =
{
  SERIALAPP_ENDPOINT,    //  int   Endpoint; 端口号
  SERIALAPP_PROFID,    //uint16 AppProfId[2]; Profile ID
  SERIALAPP_DEVICEID,   //  uint16 AppDeviceId[2]; 设备ID
  SERIALAPP_DEVICE_VERSION,  //  int   AppDevVer:4; 版本号
  SERIALAPP_FLAGS,        //  int   AppFlags:4; 程序标识
  SERIALAPP_MAX_CLUSTERS,//byte AppNumInClusters; 输入命令数
  //  byte *pAppInClusterList; 输入命列表
(cId_t *)SerialApp_ClusterList, 
   SERIALAPP_MAX_CLUSTERS,   
//  byte *pAppOutClusterList; 输出命令列表       
(cId_t *)SerialApp_ClusterList   };
//端口描述符
const endPointDesc_t SerialApp_epDesc =
{
  SERIALAPP_ENDPOINT,  //端口号
 &SerialApp_TaskID, //任务ID
  (SimpleDescriptionFormat_t *)&SerialApp_SimpleDesc, //简单描述符
  noLatencyReqs
};
SerialApp的初始化函数
void SerialApp_Init( uint8 task_id )
{
  halUARTCfg_t uartConfig;  //串口配置信息
  SerialApp_MsgID = 0x00;
  SerialApp_SeqRx = 0xC3; //接收序列号
  SerialApp_TaskID = task_id;//任务ID
  SerialApp_DstAddr.endPoint = 0; //目的设端口
  SerialApp_DstAddr.addr.shortAddr = 0;//目的地址
  SerialApp_DstAddr.addrMode = (afAddrMode_t)AddrNotPresent;//目的地址模式
  SerialApp_RspDstAddr.endPoint = 0;
  SerialApp_RspDstAddr.addr.shortAddr = 0;
  SerialApp_RspDstAddr.addrMode = (afAddrMode_t)AddrNotPresent;
  afRegister( (endPointDesc_t *)&SerialApp_epDesc ); //注册端口描述符
  RegisterForKeys( task_id ); //注册按键事件
  uartConfig.configured    = TRUE;    // 2430 don't care.
  uartConfig.baudRate      = SERIAL_APP_BAUD; //波特率
  uartConfig.flowControl   = TRUE;     //流量控制
  uartConfig.flowControlThreshold = SERIAL_APP_THRESH; //流控阈值
  uartConfig.rx.maxBufSize = SERIAL_APP_RX_MAX; //最大接收量
  uartConfig.tx.maxBufSize = SERIAL_APP_TX_MAX; //最大发送量
  uartConfig.idleTimeout   = SERIAL_APP_IDLE;//2430 don't care.
  uartConfig.intEnable     = TRUE;   // 2430 don't care.
#if SERIAL_APP_LOOPBACK
  uartConfig.callBackFunc  = rxCB_Loopback; //接收回调函数
#else
  uartConfig.callBackFunc  = rxCB;
#endif
  HalUARTOpen (SERIAL_APP_PORT, &uartConfig); //打开串口
#if defined ( LCD_SUPPORTED )
  HalLcdWriteString( "SerialApp2", HAL_LCD_LINE_2 );
#endif
  //注册绑定相关的事件
  ZDO_RegisterForZDOMsg( SerialApp_TaskID, End_Device_Bind_rsp );
  ZDO_RegisterForZDOMsg( SerialApp_TaskID, Match_Desc_rsp );
}
typedef struct
{
  bool                configured;
  uint8               baudRate; //波特率  协议栈只有38400和115200两个波特率
//控制位,如果是1的话就说明是四线模式,0代表2线模式,默认的是4线模式
  bool                flowControl;
  uint16              flowControlThreshold;
  uint8               idleTimeout;
  halUARTBufControl_t rx;
  halUARTBufControl_t tx;
  bool                intEnable;
  uint32              rxChRvdTime;
  halUARTCBack_t      callBackFunc;
}halUARTCfg_t;
说明:如果你的板子是采用2线模式的话,必须得在SearilApp中的SerialWsn_Init( uint8 task_id )把uartConfig.flowControl=TURE改成FALSE
阅读(1025) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~