是否可以多次打开一个串口?

Posted

技术标签:

【中文标题】是否可以多次打开一个串口?【英文标题】:Is it possible to open a serial port multiple times? 【发布时间】:2012-10-06 07:23:16 【问题描述】:

我正在设计一个控制系统,它应该通过串行端口处理过多的执行器(或执行器组)。新设计(尚未实现)应该通过多个 POSIX 线程控制执行器。

这是否可以多次(通过多个线程)打开一个串行端口? 如果是的话,我会写一个同步写/异步读机制。会有n线程M[0]M[n-1]可以直接向串口写入数据。他们不应该直接从串口读取。相反,线程R 应该在while(true) 循环中从端口读取数据,并将数据提供给等待它的相应线程。 (唤醒等待响应的M[i],当数据准备好,属于ith线程)

这完全取决于是否可以通过多个线程写入串行端口。

注意:我无法测试串口的行为,因为目前我无法访问我大学机电一体化实验室的设备,

我正在使用带有 Xenomai 实时子系统(如果重要)修补的内核 2.6.38-8

我正在将代码移植到与串行端口通信的传统 Linux 方式。 (打开/dev/ttyS0,设置波特率,read()write()等)目前使用第三方库与串口通信。

【问题讨论】:

【参考方案1】:

同一个串口只能打开一次。第二次试用因拒绝访问而失败。打开端口后,您可以使用端口句柄在不同的线程中使用它。当然,你需要在这些线程之间同步端口访问。

【讨论】:

我正在尝试编写无锁代码。您的意思是要以某种方式保护包含wite() 系统调用的代码部分与mutex?两个线程同时尝试写入端口有问题吗? 写操作不是原子的,所以如果不同的写调用不同步,结果是不确定的。 如果你坚持无锁,(我看不出那个 re.serial 调用有什么意义),使用无锁队列来传达你的 tx。指向执行写入的一个线程的缓冲区/字符串指针。您仍然需要在队列、信号量或其他东西上发出信号,以消除旋转,但您将拥有“无锁”,这是值得的。

以上是关于是否可以多次打开一个串口?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查串口是否在Linux中打开?

各位大侠,我写了一个linux下我写了个程序验证串口接收数据情况,是个死循环read,发现串口需要分多次read

检查使用O_NONBLOCK打开的文件描述符是否准备就绪

电子秤怎么连接电脑

1-python库之-serial串口操作

电子秤连接电脑怎么调试?