当前位置: 技术问答>问一个LINUX下串口的问题
iis7站长之家
linux下串口编程之困惑
来源: 互联网 发布时间:2016-09-18
本文导语: 最近准备做一个GNome下的应用程序,是与一个外部设备通过串口通信。对于linux下的串口通信,小弟有一些困惑,希望大家能够指点。 1,我做的这个应用程序是希望独占一个串口,请问我用fopen的函数打开串口后,别...
最近准备做一个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,有没有别的方法,既可以实现串口的异步接收数据,又不用新的进程或线程的方法,并且不影响程序其它部分的功能?
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,有没有别的方法,既可以实现串口的异步接收数据,又不用新的进程或线程的方法,并且不影响程序其它部分的功能?
|
1.独立打开串口,在串口设置中,可以加锁
2.rxd,txd,现在的串口几乎都是全双工的,也就是读和写是双向的,对于读的同时可以写,这个你不用关心。
事实情况就是读的同时可以写数据。。
3.select只不过是用来判断此时到底有没有数据来,或者说,监视该文件有没有发生变化,免得只用while作无谓
的循环
2.rxd,txd,现在的串口几乎都是全双工的,也就是读和写是双向的,对于读的同时可以写,这个你不用关心。
事实情况就是读的同时可以写数据。。
3.select只不过是用来判断此时到底有没有数据来,或者说,监视该文件有没有发生变化,免得只用while作无谓
的循环
|
1、可以用文件锁
2、是的。
3、可以用select也可以用多进程或者多线程的方法。是否需要同步,取决于你读/写数据之间是否存在依赖关系。
4、可以用信号的方式来处理:开一个子进程或者线程专门监听串口,有了数据后就向父进程发送一个信号。在父进程中注册这个信号的处理函数。那么父进程只有在收到这个信号后,才会调用这个处理函数,其他时间运行其他代码。
2、是的。
3、可以用select也可以用多进程或者多线程的方法。是否需要同步,取决于你读/写数据之间是否存在依赖关系。
4、可以用信号的方式来处理:开一个子进程或者线程专门监听串口,有了数据后就向父进程发送一个信号。在父进程中注册这个信号的处理函数。那么父进程只有在收到这个信号后,才会调用这个处理函数,其他时间运行其他代码。
|
你要弄清楚,linux的特点,所有的设备都是文件。同样,串口也当做文件,你只需要
对串口/dev/tty设备文件打开的时候,加文件锁就可以了。
对串口/dev/tty设备文件打开的时候,加文件锁就可以了。
|
可以。你用读写锁。
这种锁,只允许有一个在写。也就是写和读是互斥的。
可以允许多个读,但是决不允许有人在写,有人在读。
这种锁,只允许有一个在写。也就是写和读是互斥的。
可以允许多个读,但是决不允许有人在写,有人在读。