导航
  • 主页
  • 系统维护与使用
  • 应用程序开发
  • 内核源代码
  • 驱动程序开发
  • CPU和硬件区
  • UNIX文化
  • Solaris
  • Power Linux
  • 问答

Linux下如何设置串口的DTR/DSR硬件流控?

wmrwinhap 2004-04-12 09:15:23
以下方法是设置RTS/CTS硬件流控的,如何设置DTR/DSR硬件流控呢?
struct termios options;
options.c_cflag |= CRTSCTS; // 设置有RTS/CTS硬件流控
options.c_cflag &= ~CRTSCTS; // 设置无RTS/CTS硬件流控
...
而且上面的方法将我的RTS信号拉高的同时我的CTS引脚还必须检测对方的RTS信号也拉高才能发送数据。

而我还想对DTR/DSR、RTS/CTS单独设置,也就是说将我的DTR、RTS信号拉高的同时,我的DSR、CTS引脚并不检测对端的DTR、RTS是否拉高。应该如何设置呢?

Windows API 很容易实现我这方面的要求,但在Linux下我却找不到接口。

望高手指教?严重感谢!
...全文
999 点赞 收藏 6
写回复
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
carol1980 2004-04-20
好像没有这种写法的吧
你对 |= 的理解有点偏差,这不是简单的异或

status &= ~TIOCM_DTR; // low dtr
status |= TIOCM_DTR // high dtr

相当于对 tiocm_dtr 对应的那一位置0或1, status |= TIOCM_DTR|TIOCM_RTS; 没见过

不知道你的这种做法能不能成功,你自己试试看吧,劝你不要用。
回复
wmrwinhap 2004-04-20
那么我想拉高DTR与RTS(同时支持对方需要流控与不需要流控,反正我拉高了),
而且不较验对方是否拉高DTR与RTS(同时支持对方使用与不使用流控,反正我不要求),
我就应该这样写:

status |= TIOCM_DTR|TIOCM_RTS;
status &= ~(TIOCM_DSR|TIOCM_CTS);

ioctl(fd,TIOCMSET,&status);

对吗?

回复
rzsheng 2004-04-12
minicom 的源代码里面有。
回复
daidai_____DD 2004-04-12
直接写串口的控制寄存器,控制寄存器的定义你查查吧,我忘了。
写寄存器之前,要先调用iopl,或ioperm
回复
microyzy 2004-04-12
也许ioctl可以,呵呵,猜测而已
回复
carol1980 2004-04-12
microyzy(毛毛叉) 说得对,用 ioctl

我做过,可以的

Listing 6 - Dropping DTR with the TIOCMSET ioctl.

#include <unistd.h>
#include <termios.h>

int fd;
int status;

ioctl(fd, TIOCMGET, &status);

status &= ~TIOCM_DTR;

ioctl(fd, TIOCMSET, &status);
回复
发动态
发帖子
Linux/Unix社区
创建于2007-08-27

2.0w+

社区成员

Linux/Unix社区 应用程序开发区
申请成为版主
社区公告
暂无公告