终端及串口编程
1 终端设备类型
可以在Linux的/proc/tty目录下查找到各设备的基本信息,将这些终端设备统一由TTY管理,从而屏蔽硬件实现。
#cat /proc/tty/dreivers
1.1 实际的物理串口设备,即串口终端/dev/ttyS[n],ttyS系列指物理串行接口(一般的台式机拥有1个物理串口,很多笔记本电脑没有物理串口接口),即ttyS0为COM1,ttyS1为COM2。
1.2 ttyl-tty6为控制台终端,即非图形界面下的命令行输入模式,在安装Linux操作系统的主机上,使用键盘ALT+[F1~F6],可以分别切换到这些终端上
1.3 虚拟终端
- /dev/ptmx虚拟设备,用于创建虚拟网络终端设备master/slave配对设备。通过调用posix_openpt( )函数,来打开设备/dev/ptmx
- /dev/pts虚拟终端,通过网络telnet到Linux主机或者在Xwindows环境下打开一个终端,将在/dev/pts目录下依次创建一个虚拟终端设备,相应地退出一个虚拟终端,将自动减少一个设备文件。
1.4 当前终端
- 当前控制台终端/dev/console
- 当前终端/dev/tty
2 终端属性控制
• 输入属性:由终端驱动程序控制输入属性。
• 输出属性:由终端驱动程序控制输出属性,例如,将新行映射成CR/LF等。
• 控制属性:影响物理串行线的特性。例如,停止位、波特波等。
• 本地属性:影响驱动程序与用户之间的界面,例如,向终端发送信息是否会回显。
• 线路规程属性:用来设置是否为标准的线路规程。
• 控制字符:设置专用字符。
查看所有串口属性命令:
#:stty -a
2.1 读取/设置串口终端属性信息
struct termios:
tcflag_t c_iflag; /* input modes /
tcflag_t c_oflag; / output modes /
tcflag_t c_cflag; / control modes /
tcflag_t c_lflag; / local modes /
cc_t c_cc[NCCS]; / special characters */
使用如下函数:
#include <termios.h>
#include <unistd.h>
int tcgetattr(int fd, struct termios *termios_p);
int tcsetattr(int fd, int optional_actions,
const struct termios *termios_p);
int tcsendbreak(int fd, int duration);
int tcdrain(int fd);
int tcflush(int fd, int queue_selector);
int tcflow(int fd, int action);
void cfmakeraw(struct termios *termios_p);
speed_t cfgetispeed(const struct termios *termios_p);
speed_t cfgetospeed(const struct termios *termios_p);
int cfsetispeed(struct termios *termios_p, speed_t speed);
int cfsetospeed(struct termios *termios_p, speed_t speed);
int cfsetspeed(struct termios *termios_p, speed_t speed);
具体函数查看手册
2.2 IOCTLs控制终端
ioctl()控制函数
2.3 进程与终端
函数tcgetpgrp( )获取当前前台进程组的进程组号
函数tcgetsid( )可以获取控制终端的会话首进程的会话ID
函数ctermid( )用来获取当前进程控制终端的名字
函数isatty( )用来检测某个文件描述符是否对应着一个打开的终端
函数ttyname( )用来获取某个文件描述符对应终端的名字
3 串口编程
要检测当前物理串口的基本情况,例如是否工作正常,是否已经接收到数据等,可以通过文件/proc/tty/driver/serial查看
函数:
open()
close()
read()
write()
fcntl()
select()