作者 | 陈振哲
背景
想必大家拿到RVB2601都会跑一下自带的helloworld例程,其中消息是通过LOGD函数打出的。
LOGD(TAG, "test! YoC");
与此同时,由于带了stdlib库,printf函数也是可以使用的,可以正常地在putty上打印出消息来。但是如果我们如果与上位机交互,scanf是无法使用的。
值得注意的是,如果有与我一样用putty连接RVB2601的朋友们,会碰到在虚拟串口窗口上打不出字的情况,可以在putty的configuration中找到connection-serial-flow control,putty默认用的是XON/XOFF,将其改成None即可。
使用cli_getchar的尝试
接下来就可以处理读取数据的函数,常用的scanf()函数在这里是没有定义的,只能考虑从uart获取数据,uart_getchar()函数于此也是不可用的,如果从头写一个从uart获取消息的功能需要设计到很多方面。由于并没有现成现成的资料,群中的清欢老师建议参考cli中cli_adapt.c中cli_getchar函数,定义如下所示。
int32_t cli_getchar(char *inbuf) { uart_dev_t uart_stdio; int32_t ret = CLI_OK; uint32_t recv_size = 0; memset(&uart_stdio, 0, sizeof(uart_dev_t)); uart_stdio.port = CLI_UART; ret = hal_uart_recv_II(&uart_stdio, inbuf, 1, &recv_size, HAL_WAIT_FOREVER); if ((ret == 0) && (recv_size == 1)) { return recv_size; } else { return 0; } }
这个函数本来是用于输入aos的指令用的,在main.c中直接调用该函数,将数据传入我们自己的字符串能够起到作用,调用如下所示。
int ret = cli_getchar(&str); printf("输入的字符是:%c \n",str);
虽然能读入键盘中的数据,但是考虑到可能是aos的cli部件的一部分的原因,每次总是由aos先吞一个字符,然后输入的第二个字符才会传到我们定义的char中去。
禁用cli的尝试
这里忙碌的死龙老师建议禁用cli组件,我的理解是在sdk_chip_ch2601包中把cli组件拖出去,如下图所示,但是编译上会产生问题。
这里一篇博文给了我启发,是不是我们可以从port1获取数据。https://blog.csdn.net/weixin_34120274/article/details/89656272
标准输入输出串口的逻辑端口号必须为0,并不意味着标准输入输出只能通过固定的端。因为这个0指的是逻辑端口,逻辑端口与物理端口存在一个映射关系。在一个由多个串口的芯片上,可以将port0映射到任意的串口。逻辑端口到物理端口的映射是在hal的对接代码中实现的。 以stm32平台为例,其hal_uart_send函数实现如下:
cli中默认的uart端口使用是0,如果我们可以把cli_adapt.c中的头文件与cli_getchar搬到main.c中并指定uart1端口为1是否就能解决问题?
由图下可见,会产生互斥锁的问题,该方案也行不通。
总结
就目前的进展看,能实现的还是只有cli_getchar函数然后让aos吞掉一个字符的方法能够相对接近实现效果。这个问题的解决本身不很复杂,需要继续探索。
本文源自:平头哥芯片开放社区
欢迎关注公众号:芯片开放社区(ID:OCC_THEAD),查看更多应用实战文章。