大家好、我正在使用 z-stack mesh、我想知道在 Generecapp.c 中实现 UART 读取代码的正确位置在哪里?
我希望在数据到达时读取 UART。
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
这样我不成功、您 是否会修改我的代码来实现这一目的?
/*********
*包括
*
#include "OSAL.h"
#include "stdio.h"
#include "AF.h"
#include "ZDUP.h"
#include "ZDObject.h"
#include "ZDProfile.h"
#include "stdio.h"
#include "GenericApp.h"
#include "DebugTrace.h"
#include "mac_low_level.h"
#include "string.h"
#if !Defined( WIN32 )|| Defined( ZBIT )
#include "onboard.h"
#endif
/* HAL *//
#include "hal_lcd.h"
#include "hal_led.h"
#include "hal_key.h"
#include "hal_UART.h"
#include "hal_adc.h"
/* RTOS */
#if defined (IAR_ARMCM3_LM)
#include "rtos_App.h"
#endif
//此列表应填充应用程序特定的群集 ID。
const CID_t GenericApp_ClusterList[GENERICAPP_MAX_CLUSTERS]=
{
GENERICAPP_clusterid
};
const SimpleDescriptionFormat_t GenericApp_SimpleDesc =
{
GENERICAPP_ENPOINT、 // int 端点;
GENERICAPP_PROFID、 // uint16 AppProfId[2];
GENERICAPP_DEVICEID、 // uint16 AppDeviceId[2];
GENERICAPP_DEVICE_VERSION、 // int AppDevVer:4;
GENERICAPP_FLAGS、 // int AppFlags:4;
GENERICAPP_MAX_CODERSICS、 // byte AppNumInClusters;
(CID_t *) GenericApp_ClusterList、 // byte *pAppInClusterList;
GENERICAPP_MAX_CODERSICS、 // byte AppNumInClusters;
(CID_t *) GenericApp_ClusterList // byte *pAppInClusterList;
};
//这是端点/接口描述。 这里对它进行了定义、但是
//在 GenericApp_Init()中填充。 另一种方法是填充
//在这里的结构中将其设置为"const"(在代码空间中)。 。
//在该示例应用中定义它的方式在 RAM 中定义。
endPointDesc_t GenericApp_epDesc;
//配置 UART
halUARTCfg_t uartConfig;
/*********
*局部变量
*
字节 GenericApp_TaskID; //用于内部任务/事件处理的任务 ID
//此变量将在何时接收
// GenericApp_Init()被调用。
devstats_t GenericApp_NWKState;
字节 GenericApp_TransID; //这是唯一的消息 ID (计数器)
afAddrType_t GenericApp_DstAddr;
afAddrType_t Tag_DstAddr;
//收到的消息数
静态 uint16 rxMsgCount;
字符 theMessageData[40];
//发送消息之间的时间间隔
静态 uint32 txMsgDelay = GENERICAPP_SEND_MSG_TIMEOUT;
/*********
*本地函数
*
静态空 GenericApp_ProcessZDOMsgs( zdoIncomingMsg_t *inMsg );
静态空 GenericApp_HandleKeys (字节移位、字节键);
静态空 GenericApp_MessageMSGCB (afIncomingMSGPacket_t *pckt);
静态空 GenericApp_SendTheMessage( void );
//static void GenericApp_ReadADC ( void );
/*********
*网络层回调
*
/*********
*公共函数
*
/*********
*@fn GenericApp_Init
*
*@ Generic App 任务的简要初始化函数。
* 这是在初始化期间调用的、应包含
* 任何特定于应用的初始化(例如硬件
* 初始化/设置、表初始化、加电
很 棒的酒店 )。
*
*@param task_id -由 OSAL 分配的 ID。 此 ID 应为
* 用于发送消息和设置计时器。
*
*@返回 无
*
void GenericApp_Init( uint8 task_id )
{
GenericApp_TaskID = task_id;
GenericApp_NWKSTATE = DEV_INIT;
GenericApp_TransID = 0;
macRadioSetTxPower (10);
/* UART 配置*/
uartConfig.Configured = true;
uartConfig.波特 率= HAL_UART_BR_115200;
uartConfig.FlowControl = false;
uartConfig.flowControlThreshold = 64;
uartConfig.Rx.maxBufSize = 128;
uartConfig.TX.maxBufSize = 128;
uartConfig.idleTimeout = 6;
uartConfig.intEnable = true;
uartConfig.callBackFunc =空;
HalUARTOpen (HAL_UART_PORT_0、uartConfig);
//HalUARTWrite (HAL_UART_PORT_0、"Hello World!"、12);
//GenericApp_ReadADC();
//注册 ZDO 初始化
// ZDO_RegisterForZDOMsg (GenericApp_TaskID、Device_annce);
//器件硬件初始化可以在此处或 main()(Zmain.c)中添加。
//如果硬件是特定于应用的,请将其添加到此处。
//如果硬件是设备的其他部分,则将其添加到 main()中。
// GenericApp_DstAddr.addrMode =(afAddrMode_t) AddrNotPresent;
// GenericApp_DstAddr.endpoint = 0;
// GenericApp_DstAddr.addr.shortAddr = 0;
GenericApp_DstAddr.addrMode = afAddr16位;
GenericApp_DstAddr.addr.shortAddr = 0x0000;//协调器
GenericApp_DstAddr.EndPoint = GENERICAPP_ENPOINT;
//填写端点描述。
GenericApp_epDesc.endpoint = GENERICAPP_ENPOINT;
GenericApp_epDesc.task_id =&GenericApp_TaskID;
GenericApp_epDesc.simpleDesc
=(SimpleDescriptionFormat_t *) GenericApp_SimpleDesc;
GenericApp_epDesc.latencyReq = noLatencyReq;
//向 AF 注册端点描述
afRegister (GenericApp_epDesc);
//注册所有关键事件-此应用程序将处理所有关键事件
RegisterForKeys ( GenericApp_TaskID );
ZDO_RegisterForZDOMsg( GenericApp_TaskID、End_Device_Bind_rsp );
ZDO_RegisterForZDOMsg( GenericApp_TaskID,match_DESC_rsp );
}
/*********
*@fn GenericApp_ProcessEvent
*
*@简要 介绍通用应用任务事件处理器。 此函数
调用*以处理任务的所有事件。 事件
* 包括计时器、消息和任何其他用户定义的事件。
*
*@param task_id - OSAL 分配的任务 ID。
*@参数 事件-要处理的事件。 这是位图和 CAN
* 包含多个事件。
*
*@返回 无
*
uint16 GenericApp_ProcessEvent( uint8 task_id,uint16事件)
{
afIncomingMSGPacket_t * MSGpkt;
afDataConfirm_t * afDataConfirm;
//数据确认消息字段
字节 sentEP;
ZStatus_t sentStatus;
字节 sentTransID; //这应与发送的值匹配
(void) task_id; //有意未引用的参数
if (事件和 SYS_EVENT_MSG)
{
MSGpkt=(afIncomingMSGPacket_t *) osal_msg_receive (GenericApp_TaskID);
while (MSGpktt)
{
switch ( MSGpkt->HDR.event )
{
案例 ZDO_CB_MSG:
GenericApp_ProcessZDOMsgs((zdoIncomingMsg_t *)MSGpkt);
中断;
大小写键_更改:
GenericApp_HandleKeys((((keyChange_t *)MSGpkt)-->状态(((keyChange_t *)MSGpkt)-->密钥);
中断;
案例 AF_DATA_CONFIRM_CMD:
//接收此消息是对发送的数据包的确认。
//状态为 ZStatus_t 类型[在 ZComDef.h]中定义]
//消息字段在 AF.h 中定义
afDataConfirm =(afDataConfirm_t *) MSGpkt;
sentEP = afDataConfirm->ender;
(空) sentEP; //此信息现在未使用
sentTransID = afDataConfirm->transID;
(空) sentTransID; //此信息现在未使用
sentStatus = afDataConfirm->HDR.status;
//收到确认时采取的操作。
if ( sentStatus != ZSuccessess )
{
//数据没有传送--做些什么
}
中断;
案例 AF_Incoming_MSG_CMD:
GenericApp_MessageMSGCB ( MSGpktt );
中断;
案例 ZDO_State_change:
GenericApp_NWkState =(devStates_t)(MSGpkt->HDR.status);
if ((GenericApp_NWKState =DEV_ZB_COord)||
(GenericApp_NWkState =DEV_router)||
(GenericApp_NWKState =DEV_END_DEVICE))
{
//开始定期发送“该”消息。
OSAL_START_timerEx (GenericApp_TaskID、
GENERICAPP_SEND_MSG_EVT、
txMsgDelay);
}
中断;
默认值:
中断;
}
//释放内存
OSAL_msg_dealloc((uint8 *)MSGpkt);
//下一步
MSGpkt=(afIncomingMSGPacket_t *) osal_msg_receive (GenericApp_TaskID);
}
//返回未处理的事件
返回(事件^ SYS_EVENT_MSG);
}
//发送消息输出-此事件由计时器生成
// (在 GenericApp_Init()中设置)。
if (事件和 GENERICAPP_SEND_MSG_EVT)
{
//发送“该”消息
//GenericApp_SendTheMessage();
//GenericApp_ReadADC();
//设置以再次发送消息
OSAL_START_timerEx (GenericApp_TaskID、
GENERICAPP_SEND_MSG_EVT、
txMsgDelay);
//返回未处理的事件
返回(事件^ GENERICAPP_SEND_MSG_EVT);
}
#if defined (IAR_ARMCM3_LM)
//接收来自 RTOS 队列的消息
if (事件和 GENERICAPP_RTOS_MSG_EVT)
{
//处理来自 RTOS 队列的消息
GenericApp_ProcessrtosMessage();
//返回未处理的事件
返回(事件^ GENERICAPP_RTOS_MSG_EVT);
}
#endif
//丢弃未知事件
返回0;
}
/*********
*事件生成函数
*
/*********
*@fn GenericApp_ProcessZDOMsgs()
*
*@ 简短的过程响应消息
*
*@param none
*
*@返回 无
*
静态空 GenericApp_ProcessZDOMsgs( zdoIncomingMsg_t *inMsg )
{
switch ( inMsg->clusterID )
{
Case End_Device_Bind_rsp:
if ( ZDO_ParseBindRsp( inMsg )=ZSuccessess )
{
//光 LED
// HalLedSet (HAL_LED_3、HAL_LED_MODE_ON);
}
中断;
}
}
/*********
*@fn GenericApp_HandleKeys
*
*@brief 会处理此设备的所有重要事件。
*
*@param shift -如果在 shift/alt 中、则为 true。
*@param keys -密钥事件的位字段。
*
*@返回 无
*
静态空 GenericApp_HandleKeys (uint8 shift、uint8 key)
{
zAddrType_t dstAddr;
if (键& HAL_KEY_SW_6)
{
// HalLedSet (HAL_LED_1、HAL_LED_MODE_ON);
//为强制端点启动终端设备绑定请求
dstAddr.addrMode = Addr16Bit;
dstAddr.addr.shortAddr = 0x0000;//协调器
ZDP_EndDeviceBindReq (&dstAddr、NLME_GetShortAddr ()、
GenericApp_epDesc.endpoint、
GENERICAPP_PROFID、
GENERICAPP_MAX_CLUSTERSICS、(CID_t *) GenericApp_ClusterList、
GENERICAPP_MAX_CLUSTERSICS、(CID_t *) GenericApp_ClusterList、
false );
}
if (keys & HAL_key_sw_7)
{
//GenericApp_SendTheMessage();
// HalLedSet (HAL_LED_1、HAL_LED_MODE_FLASH);
//NLME_GetShortAddr();
}
}
/*********
*本地函数
*
/*********
*@fn GenericApp_MessageMSGCB
*
*@简短 的数据消息处理器回调。 此函数处理
* 任何传入数据-可能来自其他设备。 基于
* 在群集 ID 上,执行预期的操作。
*
*@param none
*
*@返回 无
*
char * a、b[20];
int c;
uint8 lq;
uint16 e;
//char y;
int i=0;
char buf[10];
char buf2[10];
char buf3[10];
字符 buf4[10];
char main_buff [40];
char main_buff 测试[40];
//A=&b;
静态空 GenericApp_MessageMSGCB (afIncomingMSGPacket_t *pktt)
{
//inja pkt ra 布置8 biti ya 1 byti mifestim
//uint8 *ptr =(uint8*)&pkt;
交换机(pkt->clusterid)
{
案例 GENERICAPP_clusterid:
rxMsgCount += 1; //计算此消息
//闪烁 LED
//in ghesmat rooye UART pktt ra mifresti
//HalUARTWrite (HAL_UART_PORT_0、PTR、sizeof (afIncomingMSGPacket_t));
}
a=(char*) pkt->cmd.Data;
//b=*a;
C=pkt->RSSI;
lq=pkt->LinkQuality;
e=pkt->srcAddr.addr.shortAddr;
//y=e;
if (strcmp (a、"ping")=0){
//strcpy (b、"这是可以的。");
HalLedSet (HAL_LED_3、HAL_LED_MODE_BLINK);
//HalUARTWrite (HAL_UART_PORT_0、A、4);
//HalUARTWrite (HAL_UART_PORT_0,模板,10);
sprintf (buf、"LQi=%d"、LQ);
sprintf (buf2、"RSSI=%d"、c);
sprintf (buf3、"sho=%d"、e);
sprintf (buf4、"data=%d"、a);
对于(i=0;i<40;i++)
{
if (i<10)
main_buff [i]=buf[i];
否则、如果(i>=10&i<20)
main_buff[i]=buf2[i-10];
否则、如果(i>=20&i<30)
MAIN_buff [i]=buf3[I-20];
否则(i>=30&i<40)
main_bubuff [i]=buf4[i-30];
}
// sprintf (MessageData、"%d"、main_buff);
// HalUARTWrite (HAL_UART_PORT_0、buf、16);
// HalUARTWrite (HAL_UART_PORT_0、buf2、20);
// HalUARTWrite (HAL_UART_PORT_0、but3、30);
// HalUARTWrite (HAL_UART_PORT_0、buf4、15);
// HalUARTWrite (HAL_UART_PORT_0、MAIN_buff、40);
// strcpy (main_buff 测试、main_buff);
//strcpy (MessageData、main_buff);
对于(i=0;i<40;i++)
{
MessageData[i]=main_fbuff [i];
}
GenericApp_SendTheMessage();
// 结构 Alireza_Pack1
// {
// int C;
//////uint8 lq;
//// uint16 E;
// };
//struct Alireza_Pack1 Obj_Pack1;
//Obj_Pack1.C=c;
//Obj_Pack.LQ=LQ;
//Obj_Pack.E=e;
//INT8 * Ptr2 =(INT8*)&Obj_Pack1;
// HalUARTWrite (HAL_UART_PORT_0、Ptr2、1);
// GenericApp_SendTheMessage();
}
否则{;}
}
/*********
*@fn GenericApp_SendTheMessage
*
*@简短 发送"消息。
*
*
静态空 GenericApp_SendTheMessage( void )
{
//printf (MessageData、"adc=%d"、abbss);
if (AF_DataRequest (&GenericApp_DstAddr、&GenericApp_epDesc、
GENERICAPP_clusterid、
41、
(字节*) MessageData (&T)、
GenericApp_TransID (GenericApp_TransID)、
AF_DISAV_route、
AF_DEFAULT_RADIUS )== afStatus_Success )
{
//已成功请求发送。
//HalLedSet (HAL_LED_1、HAL_LED_MODE_BLINK);
//GenericApp_ReadADC();
}
其他
{
//请求发送时出错。
// HalLedSet (HAL_LED_1、HAL_LED_MODE_FLASH);
}
}
//uint16 adc_ain4=0;
//uint16 abss;
//uint16级别;
//uint16 last_level=0;
//static void GenericApp_ReadADC( void )
//{
// HalAdcSetReference (HAL_ADC_REF_125V);
// adc_ain4=HalAdcRead (HAL_adc_chn_AIN4、HAL_adc_resolution_10);
// abbss=adc_ain4;
// if (abbss<300){
// HalLedSet (HAL_LED_2、HAL_LED_MODE_OFF);
// 级别=1;
// }
// 否则(abbss>300 && abbss<400)
// {
// HalLedSet (HAL_LED_2、HAL_LED_MODE_ON);
// 级别=2;
// }
// 否则
// {
// HalLedSet (HAL_LED_2、HAL_LED_MODE_OFF);
// 级别=3;
// }
// if (level!= last_level)
// {
// strcpy (MessageData、"Alirezaa");
// GenericApp_SendTheMessage();
// }
// last_level=level;
//}