你好楼主,前一阵正好研究了一下linux串口编程,苦恼了一阵,不过总算弄通了,下面说一下我的思路和理解。
struct termios state; 这是一个设计到串口属性的结构体,通过给结构体内的属性赋值来设计串口
的一些属性。
tcgetattr (STDIN_FILENO, &state); 这是获取当前的串口的属性,并赋给STDIN_FILENO这个设
备。计算机中已定义STDIN_FILENO这是一个标准输入的设
备,通常是写在屏幕上(就是在屏幕上显示)。如楼主所说
的A与B相连,可能就是从A写到B了。
=====下面是重新给串口的结构体的属性赋值,以达到自己想设计一个什么功能的串口========
state.c_iflag &= ~(ICRNL | INPCK | ISTRIP | BRKINT); c_iflag是控制输入属性的标志位,打个比
方,c_iflag原来是111,ICRNL代表001 ,ICRNL代表010,ISTRIP代表100,这三
个常量按位或ICRNL | INPCK | ISTRIP 得出的结果就是111 然后再取 ~(非)符号
得的结果就是 000。就代表最终c_iflag的值是000。然后计算机就会根据这一窜二
进制的数字来判断输入的到底是什么属性。向ICRNL 这些常量的值都是在计算机
中已经定义好的了。但是字符串的位数要比我举例子的要多,我只是说了个大概的
意思。 下面我说一下上面个参数的意思。
ICRNL 代表将输入中的回车换为新行。
INPCK 代表启用奇偶校验。
ISTRIP 代表去掉第八位,(就是传输是只传7位)
BRKINT 代表 如果设置了IGNBRK,将忽略BREAK。如果没有设置,但是设置了
BRKINT,那么BREAK将使得输入和输出队列被刷新(影响应该不大)
state.c_iflag |= IXON; IXON 表示可以用ctrl-s暂停输出 。
state.c_lflag &= ~(ICANON | IEXTEN | ISIG | ECHO);
c_lflag 代表本地属性(local),原理同上,下面介绍下个参数的用意。
ICANON代表允许一些特殊字符以及按行缓冲。
IEXTEN 当设置 时可被识别,不再作为输入传递。
ISIG 代表当接收到INTR QUIT SUSR 或 DSUSP时产生信号。
ECHO 显示输入字符。
state.c_oflag &= ~OPOST; c_oflag 代表输出控制标志位。
OPOST 代表程序可以选择加工过的输入
state.c_cflag |= CS8; c_cflag 代表控制标志位(ctrl)
CS8代表字符长度掩码是8为,(如会看到串口一些数据
“ 9600 -8-n-1” 代表频率9600,字符长度8位,无奇偶校验,一
位停止位)。
state.c_cflag |= CREAD; CREAD代表设置接受使能。
state.c_cc[VMIN] = 1; 代表非常规模式下读的最小的字符数。
state.c_cc[VTIME] = 0; 代表非常规模式下读的最小延迟。
==========================================================================
tcsetattr (STDIN_FILENO, TCSAFLUSH, &state); 这是把刚才设置好的属性又赋值给
STDIN_FILENO这个设备。
TCSAFLUSH代表当清空输入输出缓冲区时
才改变。
以上是我的看法,希望这些对你有帮助, 欢迎有问题与我交流。
2. 如何查看linux串口cts
在Linux环境下,串口名从ttyS0开始依次是ttyS1、ttyS2等。在本程序中,使用ttyS0作为通信串口。在打开ttyS0的时候,选项 O_NOCTTY 表示不能把本串口当成控制终端,否则用户的键盘输入信息将影响程序的执行; O_NDELAY表示打开串口的时候,程序并不关心另一端 的串口是否在使用中。在Linux中,打开串口设备和打开普通文件一样,使用的是open()系统调用。比如我么打开串口设备1也就是COM1,只需要: fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY ); 打开的串口设备有很多设置选项。本文中使用int setup_com(int fd)设置。在系统头文件<termios.h>中 定义了终端控制结构struct termios,tcgetattr()和tcsetattr()两个系统函数获得和设置这些属性。结构 struct termios中的域描述的主要属性包括: c_cflag : 控制选项 c_lflag : 线选项 c_iflag : 输入选项 c_oflag :输出选项 c_cc :控制字符 c_ispeed :输入数据波特率 c_ospeed :输出数据波特率 如果要设置某个选项,那么就使用"|="运算,如果关闭某个选项就使用"&="和"~"运算。本文使用的各个选项的意义定义如下: c_cflag: CLOCAL 本地模式,不改变端口的所有者 CREAD 表示使能数据接收器 PARENB 表示偶校验 PARODD 表示奇校验 CSTOPB 使用两个停止位 CSIZE 对数据的bit使用掩码 CS8 数据宽度是8bit c_lflag: ICANON 使能规范输入,否则使用原始数据(本文使用) ECHO 回送(echo)输入数据 ECHOE 回送擦除字符 ISIG 使能SIGINTR,SIGSUSP, SIGDSUSP和 SIGQUIT 信号 c_iflag: IXON 使能输出软件控制 IXOFF 使能输入软件控制 IXANY 允许任何字符再次开启数据流 INLCR 把字符NL(0A)映射到CR(0D) IGNCR 忽略字符CR(0D) ICRNL 把CR(0D)映射成字符NR(0A) c_oflag: OPOST 输出后处理,如果不设置表示原始数据(本文使用原始数据) c_cc[VMIN]: 最少可读数据 c_cc[VTIME]: 等待数据时间(10秒的倍数) 根据以上设置的定义,串口端口设置函数setup_com()定义如下: int setup_com(int fd){ struct termios options; tcgetattr(fd, &options); /* Set the baud rates to 38400...*/ cfsetispeed(&options, B38400); cfsetospeed(&options, B38400); /* Enable the receiver and set local mode...*/ options.c_cflag |= (CLOCAL | CREAD); /* Set c_cflag options.*/ options.c_cflag |= PARENB; options.c_cflag &= ~PARODD; options.c_cflag &= ~CSTOPB; options.c_cflag &= ~CSIZE; options.c_cflag |= CS8; /* Set c_iflag input options */ options.c_iflag &=~(IXON | IXOFF | IXANY); options.c_iflag &=~(INLCR | IGNCR | ICRNL); options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); /* Set c_oflag output options */ options.c_oflag &= ~OPOST; /* Set the timeout options */ options.c_cc[VMIN] = 0; options.c_cc[VTIME] = 10; tcsetattr(fd, TCSANOW, &options); return 1; } 6.7.2 设置串口通信参数 串口通信参数指的是波特率、数据位、奇偶校验位和停止位。对串口实现控制的时候同样要用到termio结构体。下面将结合具体的代码说明如何设置这些参数。 1.波特率设置 获得端口波特率信息是通过cfgetispeed函数和cfgetospeed函数来实现的。cfgetispeed函数用于获得结构体 termios_p中的输入波特率信息,而cfgetospeed函数用于获得结构体termios_p 中的输出波特率信息。这两个函数的具体信息如表 6.9所示。 表6.9 cfgetispeed函数和cfgetospeed函数 头文件 <termios.h> <unistd.h> 函数形式 speed_t cfgetispeed(const struct termios *termios_p); speed_t cfgetospeed(const struct termios *termios_p); 返回值 成功 失败 是否设置errno 返回termios_p结构中的输入/输出端口的波特率 ?1 是 cfsetispeed函数和cfsetospeed函数用于设置端口的输入/输出波特率。一般情况下,输入和输出波特率是相等的。cfsetispeed函数和cfsetospeed函数的函数声明信息如表6.10所示。 表6.10 cfsetispeed函数和cfsetospeed函数 头文件 <termios.h> <unistd.h> 函数形式 int cfsetispeed(struct termios *termios_p, speed_t speed); int cfsetospeed(struct termios *termios_p, speed_t speed); 返回值 成功 失败 是否设置errno 返回termios_p结构中的输入/输出端口的波特率 ?1 是 cfsetispeed函数和cfsetospeed函数会修改结构体termios_p中的波特率信息,其中参数speed可以使用表6.11中所列出的宏。 表6.11 speed参数常用波特率信息 宏 定 义 波特率(单位:bit/s) 宏 定 义 波特率(单位:bit/s) B0 0 B1800 1800 B50 50 B2400 2400 B75 75 B4800 4800 B110 110 B9600 9600 B134 134 B19200 19200 B150 150 B38400 38400 B200 200 B57600 57600 B300 300
3. vim 怎么查询 linux 系统中有没有termios库文件
通过命令+文件名查看内容。如下命令可以查看。 1, cat :由第一行开始显示文件内容; 2,tac:从最后一行开始显示,可以看出tac与cat字母顺序相反; 3,nl:显示的时候输出行号; 4,more:一页一页的显示文件内容
4. termios.h是什么只有在linux下可以用么为什么在windows的VC中说没有这个文件
1、这是Linux 下串口驱动头文件。
2、一般只能在Linux下。
3、不能在windows上使用,是因为这不属于C标准库或者WINDOWS标准库头文件。
4、要想在windows上使用,需要有开发库的支持。
5、Windows的驱动开发,有专门的驱动包,叫WDK,自己可以去微软官网搜索下载。
5. 在linux下终端参数,让用户输入的字符如何被立即送到程序,而不敲回车
termios。在程序中或者终端设置中改一下teminal的设置就行了。具体的话,参见任何一本linux编程书中的terminal这一章。很简单的,就两三句话。
6. termios.h是什么只有在linux下可以用么为什么在windows的VC中说没有这个文件
1、这是linux
下串口驱动头文件。
2、一般只能在linux下。
3、不能在windows上使用,是因为这不属于c标准库或者windows标准库头文件。
4、要想在windows上使用,需要有开发库的支持。
5、windows的驱动开发,有专门的驱动包,叫wdk,自己可以去微软官网搜索下载。
7. termios.h是什么只有在linux下可以用吗为什么在windows的VC中说无此文件
1、这是Linux 下串口驱动头文件。
2、一般只能在Linux下。
3、不能在windows上使用,是因为这不属于C标准库或者WINDOWS标准库头文件。
4、要想在windows上使用,需要有开发库的支持。
5、Windows的驱动开发,有专门的驱动包,叫WDK,自己可以去微软官网搜索下载。
8. linux中termios.h 头文件里怎么没有tiocmget
头文件中有函数的申明,库文件实现函数的定义。
比如,printf函数。使用时应包括stdio.h,打开stdio.h你只能看到,printf这
个函数的申明,却看不到printf具体是怎么实现的,而函数的实现在相应的C库
中。而库文件一般是以二进制形式而不是C源文件形式提供给用户使用的。程序
中包括了stdio.h这个头文件。链接器就能根据头件中的信息找到printf这个函
数的实现并链接进这个程序代码段里。
总结起来就是,库文件通过头文件向外导出接口。用户通过头文件找到库文件中
函数实现的代码从而把这段代码链接到用户程序中去。
9. linux串口设置时struct termios中各个选项的具体意思是什么
设置串口
最基本的设置串口包括波特率设置,效验位和停止位设置。串口的设置主要是设置 struct termios 结构体的各成员值。
struct termio
{ unsigned short c_iflag; /* 输入模式标志 */
unsigned short c_oflag; /* 输出模式标志 */
unsigned short c_cflag; /* 控制模式标志*/
unsigned short c_lflag; /* local mode flags */
unsigned char c_line; /* line discipline */
unsigned char c_cc[NCC]; /* control characters */
};
设置这个结构体很复杂,我这里就只说说常见的一些设置:
波特率设置 下面是修改波特率的代码:
struct termios Opt;
tcgetattr(fd, &Opt);
cfsetispeed(&Opt,B19200); /*设置为19200Bps*/
cfsetospeed(&Opt,B19200);
tcsetattr(fd,TCANOW,&Opt);
一般简单的问题,网络和google都有,搜索一下就有了。