对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变量
{