ZStack串口操作

本文介绍了如何配置和使用ZStack中的串口,包括串口配置结构体halUARTCfg_t的各个字段,以及如何打开串口。还讨论了串口的读写操作,特别是如何利用回调函数halUARTCBack_t处理串口事件。通过设置回调函数,可以在串口打开时自动调用,实现自定义功能。
摘要由CSDN通过智能技术生成

对ZStack串口的操作并不复杂,只要在需要的配置串口,打开串口,收发数据即可。 


一、串口的配置和打开


要使用串口,首先需要对串口进行配置。在hal_uart.h中,我们可以找到halUARTCfg_t结构体用于配置串口:
typedef struct
{
  bool                configured;
  uint8               baudRate;
  bool                flowControl;
  uint16              flowControlThreshold;
  uint8               idleTimeout;
  halUARTBufControl_t rx;
  halUARTBufControl_t tx;
  bool                intEnable;
  uint32              rxChRvdTime;
  halUARTCBack_t      callBackFunc;
}halUARTCfg_t;
在这个结构体中,定义了串口正常工作需要的一些数据,如波特率等,同时也包含了一个重要的函数指针  halUARTCBack_t      callBackFunc这个稍后再说。
举一个实例:
void UARTService_Init(void)
{
  halUARTCfg_t uartConfig;
  
  uartConfig.configured           = TRUE;              // 2x30 don't care - see uart driver.
  uartConfig.baudRate             = HAL_UART_BR_38400;
  uartConfig.flowControl          = FALSE;
  uartConfig.flowControlThreshold = 256;  // 2x30 don't care - see uart driver.
  uartConfig.rx.maxBufSize        = 70;   // 2x30 don't care - see uart driver.
  uartConfig.tx.maxBufSize        = 256;  // 2x30 don't care - see uart driver.
  uartConfig.idleTimeout          = 6;    // 2x30 don't care - see uart driver.
  uartConfig.intEnable            = TRUE;              // 2x30 don't care - see uart driver.
  uartConfig.callBackFunc         = UARTService_ReceiveCallBack;
  
  HalUARTOpen(UART_CONTROLLER_PORT,&uartConfig);
  HalUARTOpen(UART_WIFI_PORT,&uartConfig); 
}
在配置好串口之后,调用uint8 HalUARTOpen(uint8 port, halUARTCfg_t *config)打开串口就可以正常使用了。HalUARTOpen的有两个参数,前一个为串口号,后一个为串口配置的结构体,之前已经叙述过了。CC2530配套的ZStack-CC2530-2.3.0-1.4.0,也就是目前我使用的版本,定义了2个串口,可以根据需要使用。
/* Ports */
#define HAL_UART_PORT_1   0x01
#define HAL_UART_PORT_MAX 0x02
二、串口的读写操作
简单来说,写串口调用uint16 HalUARTWrite(uint8 port, uint8 *buf, uint16 len),读串口调用uint16 HalUARTRead(uint8 port, uint8 *buf, uint16 len)函数即可(均在hal_uart.c)中定义。
写串口这样操作没有问题,但是读串口的时候就有问题了:我们怎么知道应该在什么时候读串口里的数据呢?
想一想之前在串口配置halUARTCfg_t中,是不是有什么东西我们还没有用到的?对的,有一个函数指针halUARTCBack_t ,先看一下具体定义:
typedef void (*halUARTCBack_t) (uint8 port, uint8 event);
就像自定义数据类型一样,我们也可以先定义一个函数指针类型,然后再用这个类型来申明函数指针变量。
我先给你一个自定义数据类型的例子。
typedef int* PINT;     //为int* 类型定义了一个PINT的别名
int main()
{
   int x;
   PINT px=&x;    //与int * px=&x;是等价的。PINT类型其实就是int * 类型
   *px=10;        //px就是int*类型的变量  
   return 0;
}
根据注释,应该不难看懂吧!(虽然你可能很少这样定义使用,但以后学习Win32编程时会经常见到的。)
下面我们来看一下函数指针类型的定义及使用:(请与上对照!)
//自行包含头文件
void MyFun(int x);     //此处的申明也可写成:void MyFun( int );
typedef void (*FunType)(int );    //这样只是定义一个函数指针类型
FunType FunP;               //然后用FunType类型来申明全局FunP变量
{

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值