RemoTI的串口通信

来源:互联网 发布:虎豹骑最帅捏脸数据女 编辑:程序博客网 时间:2024/06/09 21:49

由于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的函数,最后就搞定了。

原创粉丝点击