是否可以多次打开一个串口?
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]
,当数据准备好,属于i
th线程)
这完全取决于是否可以通过多个线程写入串行端口。
注意:我无法测试串口的行为,因为目前我无法访问我大学机电一体化实验室的设备,
我正在使用带有 Xenomai 实时子系统(如果重要)修补的内核 2.6.38-8
我正在将代码移植到与串行端口通信的传统 Linux 方式。 (打开/dev/ttyS0
,设置波特率,read()
,write()
等)目前使用第三方库与串口通信。
【问题讨论】:
【参考方案1】:同一个串口只能打开一次。第二次试用因拒绝访问而失败。打开端口后,您可以使用端口句柄在不同的线程中使用它。当然,你需要在这些线程之间同步端口访问。
【讨论】:
我正在尝试编写无锁代码。您的意思是要以某种方式保护包含wite()
系统调用的代码部分与mutex
?两个线程同时尝试写入端口有问题吗?
写操作不是原子的,所以如果不同的写调用不同步,结果是不确定的。
如果你坚持无锁,(我看不出那个 re.serial 调用有什么意义),使用无锁队列来传达你的 tx。指向执行写入的一个线程的缓冲区/字符串指针。您仍然需要在队列、信号量或其他东西上发出信号,以消除旋转,但您将拥有“无锁”,这是值得的。以上是关于是否可以多次打开一个串口?的主要内容,如果未能解决你的问题,请参考以下文章