试验4无线串口对传试验Word文档下载推荐.docx
- 文档编号:18601031
- 上传时间:2022-12-29
- 格式:DOCX
- 页数:20
- 大小:365.58KB
试验4无线串口对传试验Word文档下载推荐.docx
《试验4无线串口对传试验Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《试验4无线串口对传试验Word文档下载推荐.docx(20页珍藏版)》请在冰豆网上搜索。
修改后的函数:
voidSerialApp_Init(uint8task_id)
{
halUARTCfg_tuartConfig;
SerialApp_TaskID=task_id;
SerialApp_RxSeq=0xC3;
afRegister((endPointDesc_t*)&
SerialApp_epDesc);
RegisterForKeys(task_id);
uartConfig.configured=TRUE;
//2x30don'
tcare-seeuartdriver.
uartConfig.baudRate=SERIAL_APP_BAUD;
//默认波特率38400
//uartConfig.flowControl=TRUE;
uartConfig.flowControl=FALSE;
//关闭流控制
uartConfig.flowControlThreshold=SERIAL_APP_THRESH;
uartConfig.rx.maxBufSize=SERIAL_APP_RX_SZ;
uartConfig.tx.maxBufSize=SERIAL_APP_TX_SZ;
uartConfig.idleTimeout=SERIAL_APP_IDLE;
uartConfig.intEnable=TRUE;
uartConfig.callBackFunc=SerialApp_CallBack;
HalUARTOpen(SERIAL_APP_PORT,&
uartConfig);
#ifdefined(LCD_SUPPORTED)
HalLcdWriteString("
SerialApp"
HAL_LCD_LINE_2);
#endif
ZDO_RegisterForZDOMsg(SerialApp_TaskID,End_Device_Bind_rsp);
ZDO_RegisterForZDOMsg(SerialApp_TaskID,Match_Desc_rsp);
}
(2)修改按键配置
同样,在第一个文件夹APP下面有个SerialAPP.C文件,打开它,找到HandleKeys(uint8shift,uint8keys)函数,修改if(keys&
HAL_KEY_SW_2)为if(keys&
HAL_KEY_SW_6)如下图:
这样的目的是使得程序响应得按键为底板上的K1键。
修改后代码如下:
voidSerialApp_HandleKeys(uint8shift,uint8keys)
zAddrType_ttxAddr;
if(shift)
{
if(keys&
HAL_KEY_SW_1)
}
HAL_KEY_SW_2)
HAL_KEY_SW_3)
HAL_KEY_SW_4)
else
//if(keys&
HAL_KEY_SW_2)//已经修改为K1
HAL_KEY_SW_6)//已经修改为K1
HalLedSet(HAL_LED_4,HAL_LED_MODE_OFF);
//InitiateanEndDeviceBindRequestforthemandatoryendpoint
txAddr.addrMode=Addr16Bit;
txAddr.addr.shortAddr=0x0000;
//Coordinator
ZDP_EndDeviceBindReq(&
txAddr,NLME_GetShortAddr(),
SerialApp_epDesc.endPoint,
SERIALAPP_PROFID,
SERIALAPP_MAX_CLUSTERS,(cId_t*)SerialApp_ClusterList,
FALSE);
//InitiateaMatchDescriptionRequest(ServiceDiscovery)
txAddr.addrMode=AddrBroadcast;
txAddr.addr.shortAddr=NWK_BROADCAST_SHORTADDR;
ZDP_MatchDescReq(&
txAddr,NWK_BROADCAST_SHORTADDR,
3.4程序下载
将CoordinatorEB工程下载到其中一个模块里,如下图,先选择Project–〉RebuildAll
编译没有错误,按下Debug,将代码加载进入模块。
写入程序后,无需运行,直接StopDebugging即可,断开仿真器电源,取下模块备用。
按照以上步骤,将EndDeviceEB工程写入另一个模块。
3.5对传试验
(1)红色主板通电,
(2)打开串口调试软件SSCOMV3.0,并按照下图配置:
端口号:
COM?
,这个是安装虚拟USB串口生成的串口号,如果您没有安装,请参考CC2530-Zigbee开发平台使用说明书V2.1(红色主板)
波特率:
38400
HEX发送:
关掉
HEX显示:
这样才能发送汉字
(3)用MiniUSB线将两个模块连接计算机,可以是不同的计算机,也可以是同一台计算机的不同USB口。
协调器:
红色指示灯D2闪烁一次后,主板的D3灯一直亮起
终端点:
红色指示灯D2闪烁一次后,等待邦定
然后再分别按下两个模块的S1键,间隔2s既可,此时两个模块的蓝灯也就是D1分别亮起,两个模块成功完成邦定,就可以进行串口对传了,如下图:
四、程序解析
本次试验的两个应用程序分别为协议栈的CoordinatorEB或EndDeviceEB两个工程,它们所使用的APP文件为同一个文件,即SerialApp.c,那么我们就以该文件为主,进行分析串口对传的过程。
4.1响应按键
主函数里的InitBoard(OB_COLD);
voidInitBoard(uint8level)
if(level==OB_COLD)
//Interruptsoff
osal_int_disable(INTS_ALL);
//TurnallLEDsoff
HalLedSet(HAL_LED_ALL,HAL_LED_MODE_OFF);
//CheckforBrown-Outreset
ChkReset();
else//!
OB_COLD
/*InitializeKeystuff*/
OnboardKeyIntEnable=HAL_KEY_INTERRUPT_DISABLE;
HalKeyConfig(OnboardKeyIntEnable,OnBoard_KeyCallback);
红色部分注册了OnBoard_KeyCallback作为按键响应函数,OnBoard_KeyCallback这个函数位于OnBoard.c文件里,
voidOnBoard_KeyCallback(uint8keys,uint8state)
uint8shift;
(void)state;
/*Getshiftkeystatus*/
//shift=((keys&
HAL_KEY_SW_6)?
true:
false);
shift=0;
//替换
if(OnBoard_SendKeys(keys,shift)!
=ZSuccess)
//ProcessSW1here
HAL_KEY_SW_1)//Switch1
//ProcessSW2here
HAL_KEY_SW_2)//Switch2
//ProcessSW3here
HAL_KEY_SW_3)//Switch3
//ProcessSW4here
HAL_KEY_SW_4)//Switch4
//ProcessSW5here
HAL_KEY_SW_5)//Switch5
//ProcessSW6here
HAL_KEY_SW_6)//Switch6
通过红色部分if(OnBoard_SendKeys(keys,shift)!
=ZSuccess),如果响应按键成功,则按键消息通过uint8OnBoard_SendKeys(uint8keys,uint8state)里面的
osal_msg_send(registeredKeysTaskID,(uint8*)msgPtr);
发送消息处理循环。
K1按下后,发起绑定请求。
通过SerialApp.c里面的voidSerialApp_HandleKeys(uint8shift,uint8keys)里面的按键处理函数,就实现了按下K1后,运行ZDP_EndDeviceBindReq();
等待其他节点应答,而如果有一个节点也按了K1键,同样发出了绑定请求,则本节点收到一个End_Device_Bind_rsp的信息,并在SerialApp_ProcessZDOMsgs函数中进行了处理,从而实现两个设备的相互邦定。
staticvoidSerialApp_ProcessZDOMsgs(zdoIncomingMsg_t*inMsg)
switch(inMsg->
clusterID)
caseEnd_Device_Bind_rsp:
if(ZDO_ParseBindRsp(inMsg)==ZSuccess)
//LightLED
HalLedSet(HAL_LED_4,HAL_LED_MODE_ON);
#ifdefined(BLINK_LEDS)
//FlashLEDtoshowfailure
HalLedSet(HAL_LED_4,HAL_LED_MODE_FLASH);
break;
caseMatch_Desc_rsp:
ZDO_ActiveEndpointRsp_t*pRsp=ZDO_ParseEPListRsp(inMsg);
if(pRsp)
if(pRsp->
status==ZSuccess&
&
pRsp->
cnt)
SerialApp_TxAddr.addrMode=(afAddrMode_t)Addr16Bit;
SerialApp_TxAddr.addr.shortAddr=pRsp->
nwkAddr;
//Takethefirstendpoint,Canbechangedtosearchthroughendpoints
SerialApp_TxAddr.endPoint=pRsp->
epList[0];
osal_mem_free(pRsp);
4.2消息处理
在SerialApp.c里有个串口对传的消息处理函数,这个消息处理函数,实现了按键消息处理、串口接收发送等消息处理。
UINT16SerialApp_ProcessEvent(uint8task_id,UINT16events)
(void)task_id;
//Intentionallyunreferencedparameter
if(events&
SYS_EVENT_MSG)
afIncomingMSGPacket_t*MSGpkt;
while((MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(SerialApp_TaskID)))
switch(MSGpkt->
hdr.event)
caseZDO_CB_MSG:
SerialApp_ProcessZDOMsgs((zdoIncomingMsg_t*)MSGpkt);
caseKEY_CHANGE:
//按键消息处理
SerialApp_HandleKeys(((keyChange_t*)MSGpkt)->
state,((keyChange_t*)MSGpkt)->
keys);
caseAF_INCOMING_MSG_CMD:
//空中收到的消息
SerialApp_ProcessMSGCmd(MSGpkt);
default:
osal_msg_deallocate((uint8*)MSGpkt);
return(events^SYS_EVENT_MSG);
SERIALAPP_SEND_EVT)//串口数据无线发送事件消息
SerialApp_Send();
return(events^SERIALAPP_SEND_EVT);
SERIALAPP_RESP_EVT)
SerialApp_Resp();
return(events^SERIALAPP_RESP_EVT);
return(0);
//Discardunknownevents.
4.3数据对传(串口—〉空中)
从主循环osal_start_system---〉Hal_ProcessPoll---〉HalUARTPoll()---〉HalUARTPollDMA()
这个HalUARTPollDMA函数里
if(evt&
(dmaCfg.uartCB!
=NULL))
dmaCfg.uartCB(HAL_UART_DMA-1,evt);
如果消息不为空,则dmaCfg.uartCB这个函数进行了调用
回到SerialApp_Init函数,注意:
此处将dmaCfg.uartCB这个函数注册成为SerialApp_CallBack,也就是说SerialApp_CallBack
函数每次循环中被调用一次,对串口的内容进行查询,如果DMA中接收到了数据,则调用
HalUARTRead,将DMA数据读至数据buffer并通过AF_DataRequest函数发送出去,注意:
送出去的
信息的CLUSTERID(信息簇ID)号为SERIALAPP_CLUSTERID1
4.4数据对传(空中—〉串口)
在4.2节消息处理里,SerialApp_ProcessEvent里有这样一个消息:
caseAF_INCOMING_MSG_CMD:
通过SerialApp_ProcessMSGCmd将收到的数据送到了串口
voidSerialApp_ProcessMSGCmd(afIncomingMSGPacket_t*pkt)
uint8stat;
uint8seqnb;
uint8delay;
switch(pkt->
clusterId)
//Amessagewithaserialdatablocktobetransmittedontheserialport.
caseSERIALAPP_CLUSTERID1:
//Storetheaddressforsendingandretrying.
osal_memcpy(&
SerialApp_RxAddr,&
(pkt->
srcAddr),sizeof(afAddrType_t));
seqnb=pkt->
cmd.Data[0];
//Keepmessageifnotarepeatpacket
if((seqnb>
SerialApp_RxSeq)||//Normal
((seqnb<
0x80)&
(SerialApp_RxSeq>
0x80)))//Wrap-around
//Transmitthedataontheserialport.
if(HalUARTWrite(SERIAL_APP_PORT,pkt->
cmd.Data+1,(pkt->
cmd.DataLength-1)))
//Savefornextincomingmessage
SerialApp_RxSeq=seqnb;
stat=OTA_SUCCESS;
stat=OTA_SER_BUSY;
stat=OTA_DUP_MSG;
//SelectapproproiateOTAflow-controldelay.
delay=(stat==OTA_SER_BUSY)?
SERIALAPP_NAK_DELAY:
SERIALAPP_ACK_DELAY;
//Build&
sendOTAresponsemessage.
SerialApp_RspBuf[0]=stat;
SerialApp_RspBuf[1]=seqnb;
SerialApp_RspBuf[2]=LO_UINT16(delay);
SerialApp_RspBuf[3]=HI_UINT16(delay);
osal_set_event(SerialApp_TaskID,SERIALAPP_RESP_EVT);
osal_stop_timerEx(SerialApp_TaskID,SERIALAPP_RESP_EVT);
//Aresponsetoareceivedserialdatablock.
caseSERIALAPP_CLUSTERID2:
if((pkt->
cmd.Data[1]==SerialApp_TxSeq)&
((pkt->
cmd.Data[0]==OTA_SUCCESS)||(pkt->
cmd.Data[0]==OTA_DUP_MSG)))
SerialApp_TxLen=0;
osal_stop_timerEx(SerialApp_TaskID,SERIALAPP_SEND
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 试验4 无线串口对传试验 试验 无线 串口
![提示](https://static.bdocx.com/images/bang_tan.gif)