由于zigbee pro和RF4CE当初设计针对的应用场合有些不一样,所以协议栈的实现是有些不一样的。ZStack里面的很多函数在RemlTI里面都找不到了,有些是改头换面了。
RemoTI里面关于串口的程序例子貌似只有SerialBoot,但是这个例子里面串口通信部分有很大的局限性:每次只能接受一个字节。就是说这里面是没有缓存的……如果没有及时接受的话前面的数据就会被后来的的覆盖掉。在例程里,由于就一个死循环在不断地监测串口,没有其他任务,而且对于每一个字节处理的时间也不长,因此还是能够比较及时地接受每一字节的。但是当我想把它弄到OSAL中作为其中一个任务执行时就出问题了,我原意是想每隔一段时间才执行一次串口的任务,这样的话明显就不能及时接受所有字符了。难道要自己写一个利用中断实现的缓存机制吗?不过,幸好再次翻看了一下官方API的说明文档,发觉有一系列开头是HalUART的函数,而且根据说明发现是和串口相关的函数。果断翻查整个文件包,结果在Components文件夹里的hal里的include文件夹中找到了名为hal_uart.h的头文件,而实现文件在target文件夹中,只不过例程几乎都没有包含这个头文件。再一次证明了,看官方的开发说明文档才是王道。
但是问题又来了,target中居然有4个文件夹,并且代码中也对应着多种模式。
void HalUARTInit(void)
{
#if HAL_UART_DMA
HalUARTInitDMA();
#endif
#if HAL_UART_ISR
HalUARTInitISR();
#endif
#if HAL_UART_USB
HalUARTInitUSB();
#endif
}
uint8 HalUARTOpen(uint8 port, halUARTCfg_t *config)
{
(void)port;
(void)config;
#if (HAL_UART_DMA == 1)
if (port == HAL_UART_PORT_0) HalUARTOpenDMA(config);
#endif
#if (HAL_UART_DMA == 2)
if (port == HAL_UART_PORT_1) HalUARTOpenDMA(config);
#endif
#if (HAL_UART_ISR == 1)
if (port == HAL_UART_PORT_0) HalUARTOpenISR(config);
#endif
#if (HAL_UART_ISR == 2)
if (port == HAL_UART_PORT_1) HalUARTOpenISR(config);
#endif
#if (HAL_UART_USB)
HalUARTOpenUSB(config);
#endif
return HAL_UART_SUCCESS;
}
其中有一个是名为USB的,由于我看过zigbee开发板的电路图,发觉开发板的串口通信是通过usb来实现的,所以我就自以为是地认为应该引用USB文件夹中的文件。结果搞了非常久都不行,最后回头过来看zigbee pro的实现,发现zigbee pro里串口的实现文件是一样的。由于之前有人弄过zigbee pro并且能实现串口功能,因此决定研究一下在zigbee pro中用的是哪一个模式。通过调试发现用的函数竟然是名字带DMA的,而且,zigbee pro中连名字带USB的函数都没有。这就好办了,将与DMA相关的文件全部导入到工程,然后我是手动修改了宏定义,强行在串口功能中使用名字带DMA的函数,最后就搞定了。