您的位置 首页 测评

怎样经过UART进行规范IO?

怎样通过UART进行标准IO?-在工程的ASF\sam\utils\syscalls\gcc\syscalls.c文件中,ASF已经实现了若干需要自己实现的函数了(这个文件虽然叫syscall,但是可能只是因遵守unix的习惯起的。因为这里没有操作系统,也就没有“系统调用”一说了)。但是类似输入输出这些定制性较高的实现就没有默认的实现。

交互仍是很有必要的,并且运用键盘和显示器的交互功率仍是很高的。当然,能够直接运用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 < len; i++){// 经过UART读入数据while(!(UART0->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示例中的代码。

在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);

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ceping/347207.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部