0

我是一个业余爱好者,只是探索存储数据的可能性。我想从 readport 读取值并使用 termios.h 将其写入 writeport。我将值保存在两者之间的文件中。我将值存储在一个数组中并从中打印。当我写它们时,输出不是想要的。写入之前是否应该有延迟,以便值首先存储在数组中。

unsigned char buf[500];
int s=0;
do 
{   
    int rdlen, wdlen;
    rdlen = read(fd, buf, sizeof(buf));
    wlen = write(fdwr, buf, sizeof(buf));
    s = s+1;
} while ( s<sizeof(buf) );
4

2 回答 2

1

您正在写入的数据量与您正在读取的数据量不匹配。也许你的意思是:

unsigned char buf[500];
int rdlen, wlen;

rdlen = read(fd, buf, sizeof(buf));
wlen = write(fdwr, buf, rdlen);
于 2020-06-26T12:42:10.410 回答
0

对于 Linux,请仔细 阅读 read(2)write(2)poll(2)syscalls(2)errno(3)。请注意 GNU/Linux 是开源的:内核源代码在kernel.org上,您可以下载和研究它……您可能会对POSIX感兴趣。

你的电话write是错误的。你不想写更多你读过的字节。并且调用read可能会失败。你需要处理这样的失败。

你可能想s增加wlen

花几天时间阅读高级 Linux 编程,然后在githubgitlab上学习几个使用readwrite.

如果您使用GCC作为您的 C 编译器, 仔细gcc -Wall -Wextra -g阅读GCC及其预处理器GNU cpp的文档进行编译。您还想阅读GDB的文档,也许还有binutils的文档。

当然,还要阅读Modern C和一些关于操作系统的教科书,以及每个 C 程序员应该知道的关于未定义行为的知识,然后也许是 C11 标准n1570

当然,请阅读有关USBusb-devices(1)lsusb(8)的 wikipage 。

写之前应该有延迟......

这显然是特定于硬件的。

你有树莓派电脑还是什么?我听说 USB确实需要大约几微秒的延迟。

如果需要延迟,请在 Linux 上查看time(7)并考虑使用usleep(3)nanosleep(2),或编写一些事件循环,例如ppoll(2)select(2)。当然,延迟的精度与硬件设备(如HPET)有关。另请参阅osdev。另见timerfd_create(2)

PS。您可能需要花一周时间阅读文档和现有源代码。

于 2020-06-26T10:44:57.753 回答