终端及串口编程

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()
posted @ 2021-03-16 22:34  MoreABetter  阅读(331)  评论(0编辑  收藏  举报