【问题标题】:How to set interrupt with serial on linux?如何在linux上设置串口中断?
【发布时间】:2019-01-28 14:35:30
【问题描述】:

我想在linux上为串口设置中断,所以我通过信号来做。信号处理程序有措辞,但我不知道如何获取字符数。具体我不确定第三个系统调用处理程序时 read() 函数中的参数。所以,我需要一个知道串行数据量的解决方案。

谢谢大家。

PS:我的英文不好,所以上面可能表达的不是很清楚

void serialHandler(int sig)
{
    read(fd,buffer,I don't know);
}

【问题讨论】:

  • 第三个参数取决于你期望的数据量和你传递给read()的缓冲区大小(取其少)
  • 听起来你需要aio_read,它使用缓冲区和指定的大小限制设置读取,并在读取完成时向您发送信号。一旦出现,aio_return 会告诉您实际传输了多少字节。
  • 或者将文件描述符设置为非阻塞。然后 read 将返回,但有多少字符存在。

标签: c linux unix serial-port posix


【解决方案1】:

具体来说,当系统调用处理程序时,我不确定 read() 函数中的第三个参数

read() 在这里进行了完整的描述,包括以下示例:

#include <sys/types.h>
#include <unistd.h>
...
char buf[20];
size_t nbytes;
ssize_t bytes_read;
int fd;
...
nbytes = sizeof(buf);
bytes_read = read(fd, buf, nbytes);

在测试 read 的输出以获取退出条件时,通常会使用循环结构(例如,围绕与上面显示的类似的代码)。在上述实现中(未循环)bytes_read 包含成功读取的字节数,不包括删除的任何回车符。如果遇到读取错误或文件结尾 (EOF),则返回值可能小于 number_ofBytes 参数中指定的值。如果发生错误,read 返回 0 并将 errno 设置为非零值。

注意:正如 cmets 中所述,将read() 与串行端口结合使用很可能会阻止它看到EOF 条件。

同时也阐述了关于using timeouts with read()的评论,以及implement a timeout for the read function itself using the select()的作用。

还有更多 information here 可以帮助创建从端口读取的算法。

【讨论】:

  • 然而,值得一提的是,串行端口上的读取通常永远不会返回 EOF。数据的长度和结尾必须由某种帧协议确定。
  • Emmmm,看来我的说法有问题。我的意思是,例如,三个字节来自串口,但我不知道是三个,如果我将第三个参数设置为一,会丢失两个字节。
  • @buyuer 字节不会丢失,您可以在随后调用read() 时读取它们。
  • @Ctx-非常感谢,我似乎明白了,我知道我应该做什么了。再次感谢。
猜你喜欢
  • 1970-01-01
  • 2019-08-15
  • 1970-01-01
  • 1970-01-01
  • 2020-07-12
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 2023-03-20
相关资源
最近更新 更多