linux下串口编程之困惑

fish_kun 2010-08-11 04:17:52
最近准备做一个GNome下的应用程序,是与一个外部设备通过串口通信。对于linux下的串口通信,小弟有一些困惑,希望大家能够指点。

1,我做的这个应用程序是希望独占一个串口,请问我用fopen的函数打开串口后,别的程序可以操作它吗?有没有独占打开串口的方法,既不让别的程序打开串口。

2,我对串口的理解是,由于串口有rx与tx,所以读写是相对独立的,所以读写并不需要遵循相应的时序,即我在读串口的同时,其实也可以写串口,写串口的同时,也可以读串口,对吗?

3,由于外部设备可以独立地向PC通过串口发送数据,所以,PC端需要在串口有数据到达就接受,但数据合适到达并不确定,我想用异步的模式来操作串口,并不想不断地去读串口数据。我打算用select方法来做。
我想代码应该如下:
while(1)
{
...
ret = select(serialPort, &rdfds, NULL, NULL, NULL);
...
}
但我想的问题是,如果调用了上述接收函数,它就会一直在while循环中,这时程序的其它代码都不能执行,比如PC向串口发送数据到设备,比如GNome窗口的响应,对吧?
我想到的方法有二:
一,将ret = select(serialPort, &rdfds, NULL, NULL, NULL);这段代码加到GNome中的事件轮询机制中去,但我还不晓得方法。
二,fork一个子进程,专门负责接收串口数据。这时,父进程依然可以向串口写数据,并不需要与子进程同步,对吗?
我希望大家能够给些建议。

4,有没有别的方法,既可以实现串口的异步接收数据,又不用新的进程或线程的方法,并且不影响程序其它部分的功能?
...全文
560 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
谭海燕 2010-08-12
  • 打赏
  • 举报
回复
可以。你用读写锁。

这种锁,只允许有一个在写。也就是写和读是互斥的。

可以允许多个读,但是决不允许有人在写,有人在读。

jldream110 2010-08-12
  • 打赏
  • 举报
回复
路过 学习一下。 单片机里 可以用硬件中断方式 接收数据 。不知道在操作系统里 可不可以,还有你的串口接收数据 是要马上就处理呢 还是先存储起来?
lonelyhawl 2010-08-12
  • 打赏
  • 举报
回复
这个我晓得,我想要这样一种文件锁,加锁后,其他程序不能以读写方式打开串口,但可以以只读方式打开串口。
谭海燕 2010-08-12
  • 打赏
  • 举报
回复
你要弄清楚,linux的特点,所有的设备都是文件。同样,串口也当做文件,你只需要

对串口/dev/tty设备文件打开的时候,加文件锁就可以了。
fish_kun 2010-08-12
  • 打赏
  • 举报
回复
另外,我问一下,锁串口具体怎么实现?
fish_kun 2010-08-12
  • 打赏
  • 举报
回复
用slect的方法后恐怕还是要用多线程或多进程的方法,因为接收函数必须写成:
while(1)
{
...
ret = select(serialPort, &rdfds, NULL, NULL, NULL);
...
}
这样,这个接收函数一直在while死循环中,不能出来,这时要向串口写数据的话,必须在另外的线程或进程中了。
lkncjy 2010-08-12
  • 打赏
  • 举报
回复
路过,学习。。
glacierful 2010-08-12
  • 打赏
  • 举报
回复
学习了。
wwwunix 2010-08-11
  • 打赏
  • 举报
回复
1、可以用文件锁
2、是的。
3、可以用select也可以用多进程或者多线程的方法。是否需要同步,取决于你读/写数据之间是否存在依赖关系。
4、可以用信号的方式来处理:开一个子进程或者线程专门监听串口,有了数据后就向父进程发送一个信号。在父进程中注册这个信号的处理函数。那么父进程只有在收到这个信号后,才会调用这个处理函数,其他时间运行其他代码。
谭海燕 2010-08-11
  • 打赏
  • 举报
回复
1.独立打开串口,在串口设置中,可以加锁
2.rxd,txd,现在的串口几乎都是全双工的,也就是读和写是双向的,对于读的同时可以写,这个你不用关心。

事实情况就是读的同时可以写数据。。

3.select只不过是用来判断此时到底有没有数据来,或者说,监视该文件有没有发生变化,免得只用while作无谓

的循环

23,115

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧