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

这里还需要搞清楚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特殊标志,所以又会回显出来,表象就是串口又有反应了