APUE学习62章终端(二): stty命令&特殊字符&终端标志

1. stty命令

stty命令的英文解释:

很明显stty有一个-F参数

所以准确的说: stty命令是设置当前终端驱动程序(也有可能直接配置了硬件,这点目前不清楚)的属性,使当前终端的驱动程序能够使能/去使能一些特殊字符的识别与处理等等

2. stty命令的结构

3. 终端特殊字符(选)

详见<Linux_UNIX系统编程手册下>62.4 终端特殊字符,这里只选一些来说明:

1). 回车符,ascii十进制13,控制字符^M, 转义字符\r

2). 擦除字符,ascii码127,控制字符是^?

3). 中断(INTR)字符, ascii码是3,控制字符是^C

4). NL换行符,ascii码是10,控制字符是^J

5). START/STOP字符,ascii码分别是17与19,控制字符分别是^Q与^S, 也被称为XON/XOFF

这里需要搞清楚的概念是: IXON/IXOFF,XON/XOFF是什么意思:

IXON/IXOFF:终端标志

XON/XOFF: 特殊字符,XON: ascii码17,控制字符^Q, XOFF:ascii码19,控制字符^S

ASCII 表 | 菜鸟教程

这里还需要搞清楚XON/XOFF流控的原理是什么:

4. 终端标志(选)

BRKINT

ECHO

ICANON

OPOST

5. 实验

*SETUP介绍:

  • 正点原子ALPHA开发板+正点原子USB转换器
  • 由于我的转换器芯片是CH340,所以需要安装两个ko(镜像已经编译出来了,只需要insmod)

整个SETUP如下图:(RS232线序见前一篇公<->母)

USB转换器被抽象为/dev/ttyUSB0(sender ),COM3被抽象为/dev/ttymxc2(receiver)

sender的终端驱动配置:

1). 实验1,ICANON+ICRNL

receiver的终端驱动配置:

测试代码为:

cpp 复制代码
#include <strings.h>
#include <errno.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#define BUFSIZE (1024)

int main(void)
{
    int fd = open("/dev/ttyUSB0", O_RDWR);
    if (fd < 0) {
        printf("sender open failed!\n");
        return -1;
    }

    int ret, i;
    char input;
    char buf[BUFSIZE] = {0, 13, '\n'};
    char recv_buf[BUFSIZE] = {0};

    while(1) {

        memset(recv_buf, 0x00, sizeof(recv_buf));
        printf("input a char:");
        input = getchar();
        getchar(); /* eat the NL */

        buf[0] = input;
        write(fd, buf, strlen(buf));
        ret = read(fd, recv_buf, sizeof(recv_buf));
        for (i = 0; i < ret; i++) {
            printf("recv:%#x\n", recv_buf[i]);
        }

        sleep(2);
    }
    return 0;
}

结果:

cpp 复制代码
root@ATK-IMX6U:/# cat /dev/ttymxc2 &
[1] 880
root@ATK-IMX6U:/# 
root@ATK-IMX6U:/# 
root@ATK-IMX6U:/# 
root@ATK-IMX6U:/# 
root@ATK-IMX6U:/# 
root@ATK-IMX6U:/# 
root@ATK-IMX6U:/# ./a.out
input a char:a
a

recv:0x61
recv:0xa
recv:0xa
input a char:b
b

recv:0x62
recv:0xa
recv:0xa
input a char:

2). 实验2,ICANON+OPOST+ONLCR

sender的配置不变,receiver的配置如下:

测试代码不变,结果如下:

cpp 复制代码
root@ATK-IMX6U:/# ./a.out
input a char:a
a
recv:0x61
recv:0xd
recv:0xd
recv:0xa
input a char:b
b
recv:0x62
recv:0xd
recv:0xd
recv:0xa
input a char:c
c
recv:0x63
recv:0xd
recv:0xd
recv:0xa
input a char:

3). IXON

基本原理示意图:

我们看到IMX6ULL是设置了IXON与IXOFF软件流控标志的,且XON=ctrl+Q,XOFF=ctrl+S

当我们在串口上敲ctr+S时,发现串口动不了了,这是因为PC端通过TX发送了特殊字符XOFF,IMX6ULL端的终端驱动识别到这个特殊字符并在开启了IXON输出控制的时候,即使有echo标志,IMX6ULL的TX也不会发东西回来,所以看不到回显,表象就是串口不动了;当继续敲击几个字符后再敲ctrl+Q时,发现刚才敲击的字符又出现了,这是因为IMX6ULL的终端驱动程序识别了特殊字符XON并开启了输出控制IXON而且设置了echo特殊标志,所以又会回显出来,表象就是串口又有反应了

终端回显参考: APUE学习62章终端(一): 整体概览_Andy Pines的博客-CSDN博客

相关推荐
运维佬5 分钟前
CentOS 9 配置网卡
linux·centos
轩轩曲觞阁23 分钟前
Linux网络——网络初识
linux·网络
2401_8401922725 分钟前
python基础大杂烩
linux·开发语言·python
weixin_438197381 小时前
K8S创建云主机配置docker仓库
linux·云原生·容器·eureka·kubernetes
xiaoyaolangwj3 小时前
高翔【自动驾驶与机器人中的SLAM技术】学习笔记(十三)图优化SLAM的本质
学习·机器人·自动驾驶
静止了所有花开4 小时前
SpringMVC学习笔记(二)
笔记·学习
爱吃生蚝的于勒4 小时前
C语言内存函数
c语言·开发语言·数据结构·c++·学习·算法
L_cl6 小时前
Python学习从0到1 day26 第三阶段 Spark ④ 数据输出
学习
Mephisto.java6 小时前
【大数据学习 | HBASE】hbase的读数据流程与hbase读取数据
大数据·学习·hbase
舞动CPU7 小时前
linux c/c++最高效的计时方法
linux·运维·服务器