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博客

相关推荐
舟遥遥娓飘飘几秒前
Nexus4CC 手机电脑同步claude code对话部署教程(基于linux系统)
linux·智能手机·电脑
何妨呀~13 分钟前
Firewalld防火墙端口配置
linux
切糕师学AI20 分钟前
Vim 深度解析:从经典 vi 到现代编辑器之巅
linux·vim·文本编辑器
Amazing_Cacao20 分钟前
CFCA精品可可产区认证课程风土解析(美洲):打破风味堆叠的假象,建立时间轴上的层次展开阅读系统
学习
永远不会的CC33 分钟前
浙江华昱欣实习(4月23日~ 4月19日)
后端·学习
爱上好庆祝41 分钟前
学习js的第五天
前端·css·学习·html·css3·js
计算机安禾44 分钟前
【Linux从入门到精通】第49篇:服务器故障排查终极指南——思路决定出路
linux·运维·服务器
古月-一个C++方向的小白1 小时前
Linux——初识文件
linux·运维·服务器
qiaozhangchi1 小时前
求解器学习笔记
笔记·python·学习
北山有鸟1 小时前
编译香橙派内核
linux·运维·服务器