第一次接触XBEE射频模块看着整篇的文档让人头大,不知从何下手在学习了该模块后做了总结,写此博客以供有需要的朋友借鉴。XBEE-PRO-SX通讯方式主要分两种,一种是透传方式还有种是AIP方式,透传使用起来比较简单,但API的功能更为强大,那么先用透传试下传输数据。
XBEE-PRO-SX×2、XBEE调试底板×2、天线×2、Micro-USB连接线×2
官网链接:https://www.digi.com/products/embedded-systems/digi-xbee/digi-xbee-tools/xctu 官网下载速度太慢准备了百度网盘:https://pan.baidu.com/s/1mvUzbomAurTPdJy5YeaPbQ 提取码:hl9f
添加模块 添加另一个同理
选择固件
注意.两个XBEE接上天线后距离不宜过近,以防损坏模块,官方推荐2m左右。实际我调试也就50cm左右,,,没那么长的USB线啊emmmm…
①、初始化设置目标MAC地址
unsigned char XBEE_Model_Set(void){ uint8_t date; while(UART_CheckFlag(UART1, UART_FlagRDRF)) //接收数据寄存器 空 0 date=UART_ReadDataReg(UART1); UART1->C2 |= UART_C2_TE_MASK; //发送使能 UART_SendWait(UART1,SetCommand,3); //使XBEE进入AT命令模式,里面用字符存的“+++” UART1->C2 |= UART_C2_RE_MASK; //接收使能 while(!UART_CheckFlag(UART1, UART_FlagRDRF)); //接收到数据 date=UART_ReadDataReg(UART1); if(date!=0x4f) return 1; //发送完数据后,顺序接收到 0x4f--->0x4B--->0x0D(接收到OK) while(!UART_CheckFlag(UART1, UART_FlagRDRF)); date=UART_ReadDataReg(UART1); if(date!=0x4B) return 1; while(!UART_CheckFlag(UART1, UART_FlagRDRF)); date=UART_ReadDataReg(UART1); if(date!=0x0D) return 1; UART_SendWait(UART1,SRUDH_CMD,sizeof(SRUDH_CMD)); //ATDH “char SRUDH_CMD[14]="ATDH00000000\r";” // \r为ASCII里的回车 while(!UART_CheckFlag(UART1, UART_FlagRDRF)); date=UART_ReadDataReg(UART1); if(date!=0x4f) return 1; while(!UART_CheckFlag(UART1, UART_FlagRDRF)); date=UART_ReadDataReg(UART1); if(date!=0x4B) return 1; while(!UART_CheckFlag(UART1, UART_FlagRDRF)); date=UART_ReadDataReg(UART1); if(date!=0x0D) return 1; UART_SendWait(UART1,SRUDL_CMD,sizeof(SRUDL_CMD)); //ATDL while(!UART_CheckFlag(UART1, UART_FlagRDRF)); date=UART_ReadDataReg(UART1); if(date!=0x4f) return 1; while(!UART_CheckFlag(UART1, UART_FlagRDRF)); date=UART_ReadDataReg(UART1); if(date!=0x4B) return 1; while(!UART_CheckFlag(UART1, UART_FlagRDRF)); date=UART_ReadDataReg(UART1); if(date!=0x0D) return 1; UART_SendWait(UART1,HP_CMD,sizeof(HP_CMD)); //ATHP 先导码,详见手册 while(!UART_CheckFlag(UART1, UART_FlagRDRF)); date=UART_ReadDataReg(UART1); if(date!=0x4f) return 1; while(!UART_CheckFlag(UART1, UART_FlagRDRF)); date=UART_ReadDataReg(UART1); if(date!=0x4B) return 1; while(!UART_CheckFlag(UART1, UART_FlagRDRF)); date=UART_ReadDataReg(UART1); if(date!=0x0D) return 1; UART_SendWait(UART1,WRCommandf,sizeof(WRCommandf)); //ATWR while(!UART_CheckFlag(UART1, UART_FlagRDRF)); date=UART_ReadDataReg(UART1); if(date!=0x4f) return 1; while(!UART_CheckFlag(UART1, UART_FlagRDRF)); date=UART_ReadDataReg(UART1); if(date!=0x4B) return 1; while(!UART_CheckFlag(UART1, UART_FlagRDRF)); date=UART_ReadDataReg(UART1); if(date!=0x0D) return 1; UART_SendWait(UART1,SetTimeCommandf,sizeof(SetTimeCommandf)); //ATCN,每次正确发送都会收到OK while(!UART_CheckFlag(UART1, UART_FlagRDRF)); date=UART_ReadDataReg(UART1); if(date!=0x4f) return 1; while(!UART_CheckFlag(UART1, UART_FlagRDRF)); date=UART_ReadDataReg(UART1); if(date!=0x4B) return 1; while(!UART_CheckFlag(UART1, UART_FlagRDRF)); date=UART_ReadDataReg(UART1); if(date!=0x0D) return 1; return 0; }②、发送数据 透传下只要把目标mac设定好,就可以直接发送数据
UART_SendWait(UART1,Xbee_Send,10); //将数据发送给XBEE链接:https://pan.baidu.com/s/1wb2yCmjweDLLAIPbOroUYQ 提取码:adkf
两个模块都这样设置
协议介绍
接收端的协议同理
不用AT指令设置目标地址,直接把目标地址包含在数组中就行
//1byte 帧 头 +2byte 字 节 长 度 +1byte Frame type+1byte Frame ID+8byte 目标 MAC+1byte options+数据字节8byte+1byte 和校验 uint8_t XBEE_Send_Data[23]={0x7E,0x00,0x13,0x00,0x00,0,0,0,0,0,0,0,0,0x00,0,0,0,0,0,0,0,0,0x00}; //bit5 //bit14 UART_SendWait(UART1,XBEE_Send_Data,23); //将数据发送给XBEE注.API模式也有AT协议,可以查询本机MAC等…
