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

1. stty命令

stty命令的英文解释:

很明显stty有一个-F参数

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

2. stty命令的结构

APUE学习62章终端(二): stty命令&特殊字符&终端标志_第1张图片

APUE学习62章终端(二): stty命令&特殊字符&终端标志_第2张图片

 3. 终端特殊字符(选)

详见62.4 终端特殊字符,这里只选一些来说明:

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

APUE学习62章终端(二): stty命令&特殊字符&终端标志_第3张图片

2). 擦除字符,ascii127,控制字符是^

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

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

APUE学习62章终端(二): stty命令&特殊字符&终端标志_第4张图片

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

APUE学习62章终端(二): stty命令&特殊字符&终端标志_第5张图片

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

IXON/IXOFF:终端标志

APUE学习62章终端(二): stty命令&特殊字符&终端标志_第6张图片

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

ASCII 表 | 菜鸟教程

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

APUE学习62章终端(二): stty命令&特殊字符&终端标志_第7张图片

4. 终端标志(选)

BRKINT

APUE学习62章终端(二): stty命令&特殊字符&终端标志_第8张图片

ECHO

ICANON

OPOST

5. 实验

*SETUP介绍:

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

APUE学习62章终端(二): stty命令&特殊字符&终端标志_第9张图片

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

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

sender的终端驱动配置:

 1). 实验1,ICANON+ICRNL

receiver的终端驱动配置:

APUE学习62章终端(二): stty命令&特殊字符&终端标志_第10张图片

测试代码为:

#include 
#include 

#include 
#include 
#include 
#include 

#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;
}

 结果:

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的配置如下:

APUE学习62章终端(二): stty命令&特殊字符&终端标志_第11张图片

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

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

基本原理示意图:

APUE学习62章终端(二): stty命令&特殊字符&终端标志_第12张图片

APUE学习62章终端(二): stty命令&特殊字符&终端标志_第13张图片 我们看到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博客

 

你可能感兴趣的:(学习,linux)