前面两节,分别介绍了nios ii软核UART的寄存器操作方式和C标准库操作方式。除了这两种用法,其实还有第三种。在第三种方法中,使用fopen函数打开串口,使用fwrite函数给串口发送数据。
接触过Linux环境的人,看到这里肯定感觉很熟悉。因为这种方式和Linux环境下的操作有些像,都是把串口当成一个文件,对其进行读或写操作。
打开上一节下载的Embedded Peripherals IP User Guide文件,第148页,有这样一段代码:
对于这段代码,文档中并没有给出太多的说明,只是说可以参考两个文档:《Nios II Software Developer’s Handbook》和《Nios® V Embedded Processor Design Handbook》。
在《Nios II Software Developer’s Handbook》中,7.7章节,简单描述了这种方式的特点:
字符模式设备是一种硬件外设,它要么发送要么接收字符,或者两者兼而有之,串行进行。一个常见的例子是UART(通用异步接收/发送器)。字符模式设备在HAL文件系统中注册为节点。通常情况下,程序将文件描述符与设备名称关联起来,然后使用file.h中定义的ANSI C文件操作来写入和读取文件中的字符。HAL还支持标准输入、标准输出和标准错误的概念,允许程序调用stdio.h中的I/O函数。
回到程序中,我们可以简单分析下这段代码的功能:
- 定义了一个字符串:msg;
- 定义了一个文件指针:fp;
- 使用打开文件的方式打开uart1;
- 判断文件指针是否正常,正常的话做一些接收或发送的操作。
大致就这些。
从内容上不难看出,这种方式也很简便。它在处理串口时,把串口当成了一个文件,先打开,然后读,或者写。操作完成后,关闭该设备。
接下来,验证一下这段程序的功能。打开NIOS II软件,使用core_led.sopcinfo软核新建一个工程,工程命名为:uart_fp。记得工程间相关联。
然后把上面代码复制下来,粘贴到main.c里面:
#include <stdio.h>
#include <string.h>
int main()
{
char *msg = "Detectde the character 't'.\n";
FILE *fp;
char prompt = 0;
fp = fopen("/dev/uart_0","r+"); //open file for reading and writing
if(fp)
{
while(prompt != 'v')
{
//loop until we receive a 'v'.
prompt = getc(fp); //get a character from the UART
if(prompt == 't')
{
//print a message if character is 't'.
fwrite(msg,strlen(msg),1,fp);
}
}
fprintf(fp,"Closing the UART file.\n");
fclose(fp);
}
return 0;
聪明的你一定能看懂,所以不解释了。保存、编译、下载。
首先发送字符‘t’,软核返回了字符串:Detectde the character ‘t’.
尝试发一些其它的字符,无反应。
最后发送字符‘v’,软核返回了字符串:Closing the UART file.
用法上和之前的不太一样,但都很方便。看个人选择吧!