如何建立cc2430串口与上位机通信的任务

ZIGBEE中SerialApp_ProcessEvent分析 在ZIGBEE中消息处理是在SerialApp_ProcessEvent中,分析一下代码UINT16 SerialApp_ProcessEvent( uint8 task_id, UINT16 events ) { (void)task_id; if ( events & SYS_EVENT_MSG ) { afIncomingMSGPacket_t *MSG 阅读详情
作者: 吴家华  引文地址: http://nireus.uueasy.com/read-htm-tid-12.html
在一些工业测控领域会用到串口与上位机进行通信,以获取实时的数据和控制信息。那么上位机和串口是如何进行通信的呢?本文是基于z-stack-1.4.3-1.2.1的Utilities/SerialApp的例子。

OSAL_SerialApp.c是应用于操作系统的接口,先不用看,首先看应用程序SerialApp.c里的外部函数: extern void SerialApp_Init( byte task_id );
extern UINT16 SerialApp_ProcessEvent( byte task_id, UINT16 events );系统主函数就是调用这两个函数来实现串口功能的。按照TI的编程风格,后面带init(initial)的一定是初始化函数,完成应用的一些变量的初始化和一些功能的配置。后面带ProcessEvent则是进程的扫描函数。

        串口应用执行的流程:串口接收到数据包或者其他应用程序有串口发送请求 对串口的task对应的event置位-> SerialApp_ProcessEvent( uint8 task_id, UINT16 events )轮训事件 ->SerialApp_ProcessMSGCmd,SerialApp_ProcessZDOMsgs,SerialApp_HandleKey, 这三个函数完成相应函数功能具体调用。
void
SerialApp_Init( uint8 task_id )
{
halUARTCfg_t uartConfig;
SerialApp_MsgID = 0x00;
SerialApp_SeqRx = 0xC3;
SerialApp_TaskID = task_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 );
}
串口任务的初始化函数,完成功能:初始化TaskID,注册endpoint,对串口进行设置,打开串口。注册设备对象消息。

在来看看UINT16 SerialApp_ProcessEvent( uint8 task_id, UINT16 events )串口进程轮询函数。
{
  if ( events & SYS_EVENT_MSG )
{
afIncomingMSGPacket_t *MSGpkt;

    while ( (MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive(
SerialApp_TaskID )) )
{
switch ( MSGpkt->hdr.event )
{
case ZDO_CB_MSG://zdo层接收到消息
SerialApp_ProcessZDOMsgs( (zdoIncomingMsg_t *)MSGpkt );
break;

case KEY_CHANGE:
SerialApp_HandleKeys( ((keyChange_t *)MSGpkt)->state,
((keyChange_t *)MSGpkt)->keys );
break;

case AF_INCOMING_MSG_CMD//接收到命令,然后执行                            这里就要说说了,zigbee协议信息的传递有两种方式:消息和命令,消息长度不限,命令的大小则严格规定

          SerialApp_ProcessMSGCmd( MSGpkt );://执行进来消息命令的回调函数
break;

default:
break;
}

      osal_msg_deallocate( (uint8 *)MSGpkt );  // Release the memory.
}

    // Return unprocessed events
return ( events ^ SYS_EVENT_MSG );
}//
系统消息事件
  if ( events & SERIALAPP_MSG_SEND_EVT )
{
SerialApp_SendData( otaBuf, otaLen );

    return ( events ^ SERIALAPP_MSG_SEND_EVT );
}//串口发送请求,这里是指串口通过CC2430发送到灵位一个无线设备

  if ( events & SERIALAPP_MSG_RTRY_EVT )
{
if ( --rtryCnt )
{
AF_DataRequest( &SerialApp_DstAddr,
(endPointDesc_t *)&SerialApp_epDesc,
SERIALAPP_CLUSTERID1, otaLen, otaBuf,
&SerialApp_MsgID, 0, AF_DEFAULT_RADIUS );
osal_start_timerEx( SerialApp_TaskID, SERIALAPP_MSG_RTRY_EVT,
SERIALAPP_MSG_RTRY_TIMEOUT );
}
else
{
FREE_OTABUF();
}

    return ( events ^ SERIALAPP_MSG_RTRY_EVT );
}//重发事件,这里搞了很长时间才搞明白是什么意思,如果callback返回没有发送成功的话,cc2430就会重发信息,rtryCnt是重发的次数。

  if ( events & SERIALAPP_RSP_RTRY_EVT )
{
afStatus_t stat = AF_DataRequest( &SerialApp_RspDstAddr,
(endPointDesc_t *)&SerialApp_epDesc,
SERIALAPP_CLUSTERID2,
SERIAL_APP_RSP_CNT, rspBuf,
&SerialApp_MsgID, 0, AF_DEFAULT_RADIUS );

    if ( stat != afStatus_SUCCESS )
{
osal_start_timerEx( SerialApp_TaskID, SERIALAPP_RSP_RTRY_EVT,
SERIALAPP_RSP_RTRY_TIMEOUT );
}

    return ( events ^ SERIALAPP_RSP_RTRY_EVT );
}//回应重发事件,说实在的这个协议栈搞这么多冬冬挺烦人的,这也是为了防止阻塞丢包嘛!~

#if SERIAL_APP_LOOPBACK
if ( events & SERIALAPP_TX_RTRY_EVT )
{
if ( rxLen )
{
if ( !HalUARTWrite( SERIAL_APP_PORT, rxBuf, rxLen ) )
{
osal_start_timerEx( SerialApp_TaskID, SERIALAPP_TX_RTRY_EVT,
SERIALAPP_TX_RTRY_TIMEOUT );
}
else
{
rxLen = 0;
}
}
return ( events ^ SERIALAPP_TX_RTRY_EVT );
}
#endif
return ( 0 );  // Discard unknown events.
}

由上面的程序可以看出,在串口Task中定义了五个事件: SYS_EVENT_MSG, SERIALAPP_MSG_SEND_EVT,SERIALAPP_MSG_RTRY_EVT,SERIALAPP_RSP_RTRY_EVT,SERIALAPP_TX_RTRY_EVT,其中, SYS_EVENT_MSG是系统时间,每个任务中都有,它是完成系统任务之间信息的交换。
SERIALAPP_MSG_SEND_EVT  //数据发送
SERIALAPP_MSG_RTRY_EVT //数据重发
SERIALAPP_RSP_RTRY_EVT //回应重发



框架程序读懂了,接下来就是实现我的串口功能了。我要实现的串口功能很简单,协调器,也就是采集器采集到的数据通过串口传给上位机,上位机的指令通过串口传给采集器,然后采集器再发给目标终端。

现在要把串口任务加到我们的工程里面去了。
怎么加进去呢?首先,把SerialApp。c和SerialApp。h加到工程的souce文件夹里面,然后
分三步:第一,把初始化函数SerialApp_Init(),加入到osalInitTasks( void )里面,操作系统的初始化进程
osalInitTasks( void )
{
uint8 taskID = 0;
tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);
osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt));
macTaskInit( taskID++ );
nwk_init( taskID++ );
Hal_Init( taskID++ );
#if defined( MT_TASK )
MT_TaskInit( taskID++ );
#endif
APS_Init( taskID++ );
ZDApp_Init( taskID++ );
SAPI_Init( taskID++);
SerialApp_Init(taskID);
}在这里操作系统会分配任务ID
第二步,把串口轮询函数SerialApp_ProcessEvent()的函数名,加入任务数组
const pTaskEventHandlerFn tasksArr[] = {
macEventLoop,
nwk_event_loop,
Hal_ProcessEvent,
#if defined( MT_TASK )
MT_ProcessEvent,
#endif
APS_event_loop,
ZDApp_event_loop,
SAPI_ProcessEvent,
SerialApp_ProcessEvent
};
第三步:修改执行程序
在修改执行程序时,首先我们要定义好自己的事件,和相应数据、命令、数据结构。再定义相应的功能实现函数。
先定义事件1.、coordinater接收到传感器数据事件,要上传给上位机
事件二2、coordinator接收到上位机发送来的命令
基于CC2430的串口无线模块的设计 1 引言随着现代科技的飞速发展,无线通信技术成为人们日益关注的问题之一。在工业系统控制中。短距离无线通信技术应用也越来越广泛。水阻试验是内燃机车恒功率负载试验的主要方式之一,本文论述了在对内燃机车智能化水阻试验系统数据采集部分的改进中,将原来的有线数据采集改为无线数据采集传输方式的无线模块设计。2 总体设计无线模块的基本电路图如图1所示,主要由电源、复位电路、串口连接电路和无线收发电路 阅读详情

相关推荐

TI CC2430开发套件实战:从SmartRF®04EB评估板到射频测试与在线仿真

在嵌入式系统与物联网开发中,无线通信技术是实现设备互联的核心。其原理基于特定的射频协议与硬件设计,通过调制解调、信道编码等技术在空间中传输数据。掌握无线开发技术对于构建稳定、低功耗的传感网络具有重要价值,广泛应用于智能家居、工业自动化等领域。本文聚焦于德州仪器(TI)的经典低功耗无线SoC平台,深入解析其官方开发套件。内容涵盖评估板的架构设计、电源管理、外设接口等硬件细节,并重点介绍了利用套件进行射频性能测试(如输出功率与接收灵敏度测量)的实践方法。此外,文章还探讨了如何将评估板配置为在线仿真器(ICE),

weixin_30236595的博客 356

【转】如何建立cc2430串口与上位机通信的任务

<br />作者:吴家华  引文地址:http://nireus.uueasy.com/read-htm-tid-12.html 在一些工业测控领域会用到串口与上位机进行通信,以获取实时的数据和控制信息。那么上位机和串口是如何进行通信的呢?本文是基于z-stack-1.4.3-1.2.1的Utilities/SerialApp的例子。<br /><br />OSAL_SerialApp.c是应用于操作系统的接口,先不用看,首先看应用程序SerialApp.c里的外部函数:extern void S

ygz20036的专栏 1877

Zigbee无线网络在线心电监测系统

在我国,随着计算机网络和通信技术的不断发展,基于固定电话网、卫星电话以及Internet等远程心电监护系统相继出现,在目前的情况下,无线通信网络在传输方面已经具有很高的可靠性,使得基于无线网络的心电监护也成为可能,在这些心电监护系统中,有些设备具有远程通信功能,但由于采用较为昂贵的元器件,成本较高,有些则是采用即时模式把采集到的心电数据直接传输出去,无法进行长时间的跟踪检查,在监护的实时性、准确性

liqingkk的专栏 1265

c语言uart串口通信编程s3c2410为例

#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <termios.h> //#include "gpio.h" //#define LED1 0x31 //#define LED2 0x32 //#define LED3 0x33 //#define LEDOFF 0x34 //#define LEDON 0x35 .

focus on security 1439

简单的上位机串口通信编程教程

简单的上位机串口通信编程教程

STM32单片机和ZigBee的协调器基本通信协议

利用ZigBee终端挂接传感器,协调器接收传感器信息数据再发送至STM32单片机

zigbee 协调器与终端通信问题

zigbee  协调器与终端的通信机制是, 终端一定时间轮询问协调器  是否有该终端的数据,协调器发现有,就会将数据发给该终端,  那么问题来了,  协调器在哪里 处理的这个  数据请求的呢? 这个在MAC层处理,用户不需要关心。

amen315的博客 1万+

如何实现PC机与CC2430之间的串口通信

在无线传感网络中,CC2430需要将采集到的数据发送给上位机(即PC)处理,同时上位机需要向CC2430发送控制信息。这一切都离不开两者之间的信息传递。这一节,我们就来学习如何实现PC机与CC2430之间的串口通信。

基于CC2430/31的Zigbee实践(7)—Zstack1.4.3实现协调器和路由器之间串口通信

define symbols :CC2430DB、HAL_UART 一、初始化UART    在ZMain中的HalDriverInit()函数根据HAL_UART预定于变量 初始化UART。HalUARTInit()初始化UART 0 。在Hal_board_cfg.h中使能UART0: #define HAL_UART_0_ENABLE  TRUE #define HAL_UART_1_ENABLE  FALSE 在HalUARTInit()中如果没有使能HAL_UART_DM

保福寺计算机 的专栏 3850

机器学习-02 模型的评估与选择

2.1 误差与过拟合 我们将学习器对样本的实际预测结果与样本的真实值之间的差异成为:误差(error)。定义: 在训练集上的误差称为训练误差(training error)或经验误差(empirical error)。 在测试集上的误差称为测试误差(test error)。 学习器在所有新样本上的误差称为泛化误差(generalization error)。 显然,我们希望得到的是在新样本上表现得很好的学习器,即泛化误差小的学习器。因此,我们应该让学习器尽可能地从训练集中学出普适性的“一般特征”,这

一个小白 1704

蓝牙抓包实战:用nrf52840和Wireshark解析广播包与SCAN_RSP的完整流程

本文提供了一份完整的蓝牙抓包实战指南,详细介绍了如何使用nRF52840 Dongle和Wireshark捕获并解析蓝牙广播包与SCAN_RSP。内容涵盖环境搭建、广播事件分析、数据包结构拆解以及常见连接问题的调试技巧,旨在帮助开发者和物联网工程师深入理解BLE底层通信,提升硬件调试能力。

weixin_29279153的博客 495

Zigbee之旅(五):几个重要的CC2430基础实验——串口通信

Zigbee之旅(五):几个重要的CC2430基础实验——串口通信 一、承上启下   在无线传感网络中,CC2430需要将采集到的数据发送给上位机(即PC)处理,同时上位机需要向CC2430发送控制信息。这一切都离不开两者之间的信息传递。这一节,我们就来学习如何实现PC机与CC2430之间的串口通信。   CC2430包括2个串行通信接口USART0与USART1,...

weixin_30306905的博客 1147

VS2022下C# WPF项目一键打包成独立exe的完整指南

本文提供了一份在Visual Studio 2022中将C# WPF项目一键打包成独立可执行exe文件的完整指南。通过配置项目属性、启用单文件发布和自包含模式,开发者无需依赖第三方工具,即可生成可在未安装.NET运行时的电脑上直接运行的独立程序,极大简化了桌面应用的分发流程。

weixin_28831399的博客 670

基于ZigBee 的多点温度采集系统设计与实现

摘要:针对广阔空间环境温度采集系统对功耗及成本的要求,设计了基于无线传感网络技术的多点温度采集系统.以CC2430 为主控芯片,选用DS18B20 作为温度采集节点的传感器,基于ZigBee 协议栈构建无线网络实现主从节点之间数据的采集与传输,利用串口通信技术与PC 机通信,并编程实现数据处理、存储与显示。   1 引言   随着生产技术的提高, 环境温度指标越来越多的影响到生产效率、能源

alaclp的专栏 1万+

SOME/IP协议详解「2.1.2·Payload数据类型序列化」

SOME/IP协议详解「2.1.2·Payload数据类型序列化」 点击返回雪云飞星的SOME/IP协议详解「总目录」 SOME/IP协议详解「2.1.2·Payload数据类型序列化」1 大小端问题2 数据对齐填充问题3 都有哪些数据类型 之前简单的概括了一下序列化/反序列化,就是降维打击,从这一章开始到2.1所有章节结束,都在讲解这个降维打击的详细规则与原理 1 大小端问题 首先什么是大小端: 大端:高字节存放到内存的低地址 小端:高字节存放到内存的高地址 假如有一个数据是0x12345678

雪云飞星的博客 4627

华为OD机考双机位C卷 - 打印机队列 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 打印机队列

算法大师! 4619

CC2430无线SoC深度解析:从8051内核到射频设计的经典物联网方案

片上系统(SoC)是现代嵌入式设计的核心,它将处理器、内存、外设和射频模块集成于单一芯片,大幅降低了系统复杂度与功耗。其原理在于通过硬件模块化与专用加速器协同工作,在提升性能的同时优化能效比。这种设计的技术价值在于为物联网终端设备提供了高集成度、低成本的完整解决方案,尤其适用于无线传感器网络等对功耗敏感的场景。以经典的CC2430为例,这款早期无线SoC通过增强型8051内核与硬件MAC加速器的结合,实现了高效的“通信+计算”一体化,其动态电源管理(如PM2深度睡眠模式)与DMA控制器设计,至今仍是低功耗物

weixin_34246551的博客 351

辉芒微教程第五篇《定时器0实现LED灯闪烁》

定时器定时器,一听就跟个闹钟似的,对于嵌入式定时器大部分的应用中,也的确可以这么理解,但是这只能肤浅地这么理解,实际其功能不仅仅是用来计数定时,但是对于我们这种8位单片机,这么理解就够了。

qq_41809823的博客 723

无线射频转RS232

总体设计无线模块的基本电路图如图1所示,主要由电源、复位电路、串口连接电路和无线收发电路组成。可实现串口数据的无线收发,即:发送数据时,RS-232串口数据经过MAX232将电平转换为TTL电平,再通过CC2430无线发送。接收数据则是发送数据的逆过程,CC2430先接收到数据信号,然后经MAX232将TTL电平转换为RS-232的标准电平,再通过RS-232向上位机输入数据。 硬件设...

weixin_30439067的博客 351

北斗导航 | ILS(仪表着陆系统)、MLS(微波着陆系统)和GBAS(地基增强系统)的性能对比

最 早 的 GBAS 系 统 是 **局 域 增 强 系 统(LAAS)**,它是 1990 年由美国 Honeywell 公司 和 NASA 共 同 完 成 的 差 分 GPS(DGPS)演 变 而 来 的。1998 年,LAAS 被 ICAO 采 纳为 GBAS。2009 年 9 月 3 日 Honeywell 公 司 的GBAS 系统通过了 **CAT-I 精密进近着陆系统**的设计认证 ,而 **CAT-II 和 CAT-III 系统的研发和验证工作也正在有序的进行中**

尘世冰封的专栏 3985

淘宝滑块验证码破解:Python模拟鼠标轨迹过关详解

本文全面解析了淘宝滑块验证码的破解流程,从机制分析、图像处理、轨迹模拟到自动化实现,提供了完整的Python解决方案。随着2026年风控技术的升级,单纯依靠轨迹模拟已经难以达到高通过率,未来趋势是结合强化学习生成更自然的轨迹,并利用深度神经网络进行端到端的验证码绕过。此外,各大平台正逐步推广"无感验证"和"行为式验证码",将验证融入到用户正常操作中,这对爬虫技术提出了更高的挑战。技术本身是中立的,关键在于使用者的目的。希望本文能帮助开发者更好地理解验证码对抗技术,从而设计出更安全的防御系统。

2201_76125261的博客 96

学习z-stack协议栈的serialApp例子(1)

支持原创,如需转载,请注明地址:http://blog.sina.com.cn/litianping0709 作者:叶雨荫城(阿雨))   今天开始接触z-stack的串口通信例子。恩,加油,好好学,一定要搞懂。 先看说明: 本实验是一个取代两个非ZigBee设备之间电缆连接的基本应用。该应用具有实际应用意义,例如RS232ZigBee转换器,给具有RS232接口的设备增加

ldm0703的博客 786

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

弹载计算机的上市公司,基于无线通信的弹载计算机系统BIT设计

摘要:机内测试,简称BIT(Built-In-Test),是提高电路系统可测试性进而提高系统工作可靠性减少系统维护费用的关键技术.它通过附加在系统内的软件和硬件对系统进行故障检测. 当今世界形势和现代战争特点决定了武器装备不但要求具有先进的战术性能,而且要求具有良好的测试性.随着对武器装备测试性要求的提高,迫切需要武器装备本身具备检测能力,以缩短维修时间,因此BIT技术在测试性研究当中占据了越来越...

weixin_34312809的博客 828

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

温度传感器有源电子标签设计浅析

射频识别RFID(Radio Frequency Identification)技术是近年来开始兴起并逐渐走向成熟的一种自动识别技术。该技术以非接触式、存储容量大、识别速度快、距离远、可多卡识别等优点而得到了越来越广泛的应用[1]。随着RFID技术成熟与RFID标签成本的下降,逐步呈现一些具有实际应用价值的发展趋势,其中之一是RFID与温度传感器相结合[...

weixin_33805992的博客 515

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

上一篇: z-stack 数据传输AF层application frame
下一篇: Zigbee绑定流程
cucmakeit
博客等级 码龄14年 30粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值