博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AliOS Things标准输入输出端口对接以及修改方法
阅读量:7218 次
发布时间:2019-06-29

本文共 3529 字,大约阅读时间需要 11 分钟。

1 标准输入输出端口对接

标准输入输出用于输出系统日志、打印异常信息、软件调试、CLI交互等场景。在具体项目中,只需要对接PUTCHAR_PROTOTYPE和GETCHAR_PROTOTYPE两个函数即可。其具体定义如下:

#if defined (__CC_ARM) && defined(__MICROLIB)#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)#define GETCHAR_PROTOTYPE int fgetc(FILE *f)#elif defined(__ICCARM__)#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)#define GETCHAR_PROTOTYPE int fgetc(FILE *f)#else/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf   set to 'Yes') calls __io_putchar() */#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)#define GETCHAR_PROTOTYPE int __io_getchar(void)#endif /* defined (__CC_ARM) && defined(__MICROLIB) */

在gcc下,对接代码示例如下:

/**  * @brief  Retargets the C library printf function to the USART.  * @param  None  * @retval None  */PUTCHAR_PROTOTYPE{    if (ch == '\n') {        hal_uart_send(&uart_0, (void *)"\r", 1, 30000);    }      hal_uart_send(&uart_0, &ch, 1, 30000);      return ch;}/**  * @brief  Retargets the C library scanf function to the USART.  * @param  None  * @retval None  */GETCHAR_PROTOTYPE{    uint8_t ch = EOF;    int32_t ret = -1;    uint32_t recv_size = 0;      ret = hal_uart_recv_II(&uart_0, &ch, 1, &recv_size, HAL_WAIT_FOREVER);    if ((ret == 0) && (recv_size == 1)) {        return ch;    } else {        return -1;    }}

可以看出输入输出最终调用的是hal_uart_send 和hal_uart_recv_II这两个函数,实现这两个函数即可。在具体芯片上,需要将芯片的串口驱动对接到uart的hal接口,具体方法见 。

标准输入输出串口的逻辑端口号必须为0,也就是其对应的uart_dev_t结构体的port元素必须设置为0

2 如何从其他物理端口输入输出

标准输入输出串口的逻辑端口号必须为0,并不意味着标准输入输出只能通过固定的端。因为这个0指的是逻辑端口,逻辑端口与物理端口存在一个映射关系。在一个由多个串口的芯片上,可以将port0映射到任意的串口。逻辑端口到物理端口的映射是在hal的对接代码中实现的。

以stm32平台为例,其hal_uart_send函数实现如下:

int32_t hal_uart_send(uart_dev_t *uart, const void *data, uint32_t size, uint32_t timeout){    UART_HandleTypeDef *handle = NULL;    int32_t ret = -1;    if ((uart == NULL) || (data == NULL)) {        return -1;    }    switch (uart->port) {        case PORT_UART0:            handle = &uart0_handle;            break;        case PORT_UART1:            handle = &uart1_handle;            break;        case PORT_UART2:            handle = &uart2_handle;            break;        /* if other uart exist add code here */        default:        break;    }       if (handle != NULL) {        ret = HAL_UART_Transmit_IT(handle, (uint8_t *)data, size);    }    return ret;}

其中PORT_UART0、PORT_UART1、PORT_UART2的值分别为0,1,2,代表的逻辑端口号,uart0_handle、uart1_handle、uart2_handle分别为物理端口串口0、1、2的设备句柄,上述代码中逻辑端口和物理端口是一一对应的,标准输入输出对应到了物理端口串口0.

如果要将标准输入输出端口对应到物理端口串口1,则只需要按照如下修改代码:

int32_t hal_uart_send(uart_dev_t *uart, const void *data, uint32_t size, uint32_t timeout){    UART_HandleTypeDef *handle = NULL;    int32_t ret = -1;    if ((uart == NULL) || (data == NULL)) {        return -1;    }    switch (uart->port) {        case PORT_UART0:            handle = &uart1_handle;            break;        case PORT_UART1:            handle = &uart0_handle;            break;        case PORT_UART2:            handle = &uart2_handle;            break;        /* if other uart exist add code here */        default:        break;    }       if (handle != NULL) {        ret = HAL_UART_Transmit_IT(handle, (uint8_t *)data, size);    }    return ret;}

3 注意事项

在多bin的情况下,app和kernel是分开的。标准输入输出是由用户进行初始化,也就是其对应的uart_dev_t结构体是定义在app中的,但是kernel中要进行异常输出和CLI交互等功能,也需要使用到该结构体,kernel无法获取app中的该结构体。由于kernel中只需要进行send和recive操作而不需要初始化,因此kernel中需要进行标准输入输出时,我们重新定义一个uart_dev_t结构体,将port设置为0即可。由于这个结构体不是初始化时app传入的结构体,因此这个结构体中除了port之外其他的成员都是不可用的。具体来说就是针对标准输入输出串口,在数据发送和接收函数中不要使用uart_dev_t结构体中的priv和config元素,因为这两个元素在kernel中是无效的。对于其他串口,还有其他设备,无此限制。

转载地址:http://vexym.baihongyu.com/

你可能感兴趣的文章
BNU OJ 51000 BQG's Random String
查看>>
PAT (Advanced Level) 1044. Shopping in Mars (25)
查看>>
hdu 1531 King
查看>>
***R
查看>>
Linux 源码编译安装mysql
查看>>
取消手机端页面长按图片出现保存或者图片被打开的方法
查看>>
关于图片居中问题
查看>>
并发下的死锁问题
查看>>
Winserver下的Hyper-v “未在远程桌面会话中捕获到鼠标”
查看>>
oracle体系结构基础
查看>>
有关TCP和UDP 粘包 消息保护边界
查看>>
Mono为何能跨平台?聊聊CIL(MSIL)
查看>>
安装scrapy问题:-bash:scrapy:command not found
查看>>
CentOS7 重置root密码
查看>>
博客作业四
查看>>
Scanner 输入---从键盘输入两个数进行相加
查看>>
test
查看>>
说无可说
查看>>
mysql 语句优化
查看>>
SCP 命令参数使用详解(最详细使用指南)
查看>>