这个项目基本上需要两个程序,这意味着在它们之间发送数据,和一个命名管道,这将由他们中的任何人创建。整个系统可以用下图来表示:
图2:使用管道文件的LED控制和GUI框图
在上图中,LED_CONTROL是创建NAMED PIPE的进程,并且总是试图从管道中读取数据。进程LED_GUI是使用QT创建的进程,当它运行时,它将创建一个GUI窗口,其中有几个对应于每个led的按钮。当用户单击这些按钮时,GUI将相应的代码写入NAMED PIPE。
图3:GUI在点击按钮时向NAMED PIPE写入代码
在LED_CONTROL的编码中用于创建NAMED PIPE和用于读写操作的函数将在下一节中解释。
mkfifo ()
函数mkfifo()在所需目录中创建一个临时文件,并在该文件上设置所需的访问权限。函数的原型声明如下:
Int mkfifo (const char *pathname, mode_t模式);
第一个参数是需要创建命名管道的目录的路径名。第二个参数是需要在文件上设置的用户权限。使用值0777作为第二个参数允许系统中的所有用户对该命名管道进行读写。要在C代码中使用这个函数,必须包含两个头文件和。
Mkfifo (" /tmp/my_fifo ", 0777);
上面的函数调用在“/tmp”位置创建了一个名为“my_fifo”的命名管道,该管道具有系统中所有用户的访问权限。
open ()
open()函数在指定的路径上打开一个特定的文件,并设置所需的标志,它将与该文件对应的文件描述符返回给调用open函数的进程。使用该文件描述符,进程可以访问该文件。
open()函数的原型声明如下:
Int open (const char *pathname, Int flags);
第一个参数是需要打开的文件所在位置的路径,第二个参数是需要为文件设置的标志。在文件上设置的标志决定了可以访问文件的方式。
open (" /tmp/my_fifo ", (O_RDONLY | O_NONBLOCK));
上面的函数调用打开位于“/tmp”位置的名为“my_fifo”的文件,并将标志设置为Read Only访问该文件。函数调用将返回一个称为文件描述符的小正整数值,进程可以使用该值访问文件。使用此函数时需要包含的头文件是和。
read ()
read()函数尝试在打开文件时使用open()函数生成的文件描述符从文件中读取数据。函数的参数决定了一次可以读取的最大字节数以及读取数据的存储位置。它还返回从文件中成功读取的数据的字节数。函数的原型在头文件中声明,如下所示;
size_t read (int fd, void *buf, size_t count);
该函数的第一个参数是需要读取的文件的文件描述符,第二个参数是指向需要将读取的数据存储到其中的数据容器的指针,第三个参数是可以读取到数据容器的最大字节数。
读取(our_input_fifo_filestream, (void*) rx_buffer, 255);
上面的语句一次可以读取255个字符的数据,并将其存储在数组rx_buffer中,并且还返回在该特定尝试时从文件中读取的数据数。
PROCESS 1的代码被写入文件fifo.c,并编译为可执行文件fifo。然后使用命令从终端执行;
/先进先出。
这会在/tmp目录下创建一个名为“my_fifo”的临时文件。用户可以从终端本身使用' echo '命令将数据写入临时文件,如下例所示。
Echo abcdef >> /tmp/my_fifo
LED_CONTROL进程的编写方式是这样的:它可以读取NAMED_PIPE上出现的数据,并且可以通过打开或关闭Raspberrypi板上的几个led来响应一些数据集。下面列出了可以写入NAMED PIPE以控制led的命令;
10 -> LED_1熄灭
11 -> LED_1亮
20 -> LED_2熄灭
21 -> LED_2亮
30 -> LED_3灭
31 -> LED_3亮
40 -> LED_4灭
41 -> LED_4亮
这些命令可以从命令行使用' echo '命令写入与LED CONTROL进程对应的NAMED PIPE,如下例所示;
Echo 11 >> /tmp/my_fifo . txt
上面的命令将打开LED_1。
与这篇文章有关的问题?
询问和讨论Electro-Tech-Online.com而且EDAboard.com论坛。
告诉我们你的想法!!
你一定是登录发表评论。