用C写串口读写

我正在写一个C程序,将读取和写入一个串行端口。 每次写入之后都将进行一次读取,其中将包含基于写入的数据。 我将有大约16个不同的写入来执行,每个写入之后都是读取。

我还是新来的串行编程,并试图确定如何处理这个。 程序是否应该在每次写入/读取期间阻塞(基本上有很长的一(1)次写入和读取循环)?

有可能有一个线程发送写入,而另一个线程执行读取? 是否可以创build一个callback函数让线程知道数据何时可以从串口读取?

谢谢您的帮助。

编辑:

操作系统:Linux

Solutions Collecting From Web of "用C写串口读写"

这听起来像一个简单的循环与读和写就足够了。 如果你想要更多的控制(比如在X秒没有输入的情况下写保持活动状态),使用selectpoll ; 它们允许你“感知”数据是否可用,所以read不会被阻塞(但是,如果在选择和读取之间发生什么事情,你仍然应该阅读非阻塞)。 多线程在这种情况下没有意义。

selectpoll也可以让你测试写入是否会阻塞; 再次,写无阻只是为了确保。 除了select或者poll之外,你通常不希望你的进程挂在某个阻塞系统调用中。 (至少,我不)

使用ioctl在串行线上设置各种参数。 使用

 $ strace -o /tmp/strace.minicom -f minicom 

启动minicom(或任何其他终端程序),看看他们做了什么工作,如果你卡住了。 和往常一样,请参阅man select/poll/read/ioctl了解更多信息。

一般来说,有几种方法可以解决这个问题。 最好的选择可能取决于您读取串行端口时要查看的数据类型,以及如何处理数据中的错误。

第一种方法是打开阻塞IO的串行文件,并执行:

 while (question) { write(ser_fd, question.data, question.len); sleep(1); ioctl(ser_fd, FIONREAD, &answer.len); answer.data = realloc(answer.data, answer.len); read(ser_fd, question.answer, question.answer_len); question = next(question); answer = next(answer); } 

虽然我没有在这做任何错误处理。

如果你想能够超时等待回复来到串口,那么这会改变很多东西。 你应该考虑使用select,pselect,poll,ppoll,或者epoll系列调用。 这些程序允许你的程序阻塞(睡眠),直到有数据准备被读入。然后,你可以循环查询,直到你已经完成了你的答案或者没有时间。

另一个选择是尝试使用SIGIO,但我不建议这样做。 要做到这一点并不容易,难以调试。

此外,您可能可以使用SIGALRM将您从阅读呼叫中删除,以此作为超时。

如果你正在尝试使用stdio输入和输出例程,那么这是非常困难的。 你会被困在第一种方法之类的东西里面,而不能询问有多少数据已经准备好。