交互还是很有必要的,而且使用键盘和显示器的交互效率还是很高的。当然,可以直接使用uart进行字符的输入和输出。但是又何必浪费了c的标准输入输出的格式控制之类的功能呢?
这次内容就是使用scanf()和printf()函数进行pc和开发板的交互。
一、c标准函数库
与硬件相关的功能,最终都需要直接访问硬件。这一点,c的标准函数库的实现面对众多的硬件设备,已经无能为力了。
atmel studio使用的c标准库的实现疑似为newlib。
在工程的asf\sam\utils\syscalls\gcc\syscalls.c文件中,asf已经实现了若干需要自己实现的函数了(这个文件虽然叫syscall,但是可能只是因遵守unix的习惯起的。因为这里没有操作系统,也就没有“系统调用”一说了)。但是类似输入输出这些定制性较高的实现就没有默认的实现。
newlib的大部分文件读写功能是通过_read()和_write()函数实现了。所以实现了这两个函数就可以实现标准输入输出了。函数的签名及参数含义可以google。
二、实现
注意需要先完成uart的配置工作。
在具体的实现就很简单了。在实现时,可以不对目标文件进行判断,而对所有的输入输出均通过uart完成。若需要判断目标文件是否为标准输入输出,以及在检测到错误时对这个错误进行报告,就需要包含以下头文件:
12#include #include
_write:
123456789101112131415int_write(intfile,constchar*ptr,intlen){// 只处理标准输出if(file == stdout_fileno){for(inti = 0; iuart_sr & uart_sr_txrdy));uart0->uart_thr = ptr[i];}returnlen;}else{errno= ebadf;return-1;}}
_read:
12345678910111213141516171819int_read (intfile, char*ptr, intlen){// 只处理标准输入if(file == stdin_fileno){inti;for(i = 0; i uart_sr & uart_sr_rxrdy));ptr[i] = uart0->uart_rhr;/* 当读到换行符时返回if ('\n' == ptr[i])return i;}return i; /* 缓o冲?区?已°?慢y */}else{errno= ebadf;return-1;}}
测试,以下代码获取uart的输入,并通过uart重新输出:
123456789#include printf(-i- test for stdio through uart0\r\n);charreadbuf[64];while(1){printf(-i- input something...\r\n);scanf(%s, readbuf);printf(output: %s\r\n,readbuf);}
注意,pc端在发送数据时需要加上换行符。
三、在asf中使用
因为这是一个很常用的功能,所以在asf中也有实现。在asf中不但可以进行一些配置,而且在使用的时候真正需要编写的代码只有几行,甚至这几行代码也可以完全参考(抄)asf示例中的代码。
添加模块standard serial i/o。
在conf_board.h里面已经默认声明了相应的宏了:
12/* configure uart pins */#define conf_board_uart_console
在conf_uart_serial.h里,已经有了使用uart相关的参考设置代码了。删去参考代码前面的注释符号即可:
1234567/* a reference setting for uart *//** uart interface */#define conf_uart console_uart/** baudrate setting */#define conf_uart_baudrate 115200/** parity setting */#define conf_uart_parity uart_mr_par_no
调用stdio_serial_init初始化串行标准i/o:
1234567constusart_serial_options_t uart_serial_options = {.baudrate = conf_uart_baudrate,.paritytype = conf_uart_parity};/* configure console uart. */sysclk_enable_peripheral_clock(console_uart_id);stdio_serial_init(conf_uart, &uart_serial_options);
浅析智能建筑中智能照明控制系统的设计
小米米物精英键鼠上架,采用降音按键设计
MEMS芯片商敏芯股份获授首批苏州市商业秘密保护示范点
iPhone11ProMax成本曝光 512GB版本约合人民币3493元
介绍一种使用分立式CoolSiC™MOSFET所获得的测试结果
怎样通过UART进行标准IO?
三分钟深入了解UHF RFID电子标签的EAS功能应用
自动驾驶汽车的电源系统能胜任吗?
如何在树莓派Pico上使用触摸开关TTP223模块?
浮点模型的定点化到产品级代码的生成
光纤交换机和普通交换机的区别
NVLink的演进
安富利设计服务联手赛灵思和德州仪器
漏电保护器跳闸原因
希微科技发布首款自研Wi-Fi 6双频高性能数传Combo芯片
Tarari T2000单芯片,LSI推出的针对高速联网的应
曝Windows7用户可通过修改系统时钟免费升级Windows10
刘永波,在数据安全上的经历史
华为P9、荣耀V9和魅族Pro、6Plus推荐与不推荐,一句话解决!
电力设备高低温环境试验