`
xiaoheliushuiya
  • 浏览: 396875 次
文章分类
社区版块
存档分类
最新评论

linux 串口读写 termios说明

 
阅读更多

termios结构体说明

termios结构体中,该结构体一般包括如下的成员:
struct termios
{unsigned short c_iflag; /* 输入模式标志*/
unsigned short c_oflag; /* 输出模式标志*/
unsigned short c_cflag; /* 控制模式标志*/
unsigned short c_lflag; /*区域模式标志或本地模式标志或局部模式*/
unsigned char c_line; /*行控制line discipline */
unsigned char c_cc[NCC]; /* 控制字符特性*/
};


其具体意义如下

c_iflag:输入模式标志,控制终端输入方式,具体参数如下所示。

c_iflag参数表
键值说明
IGNBRK 忽略BREAK键输入
BRKINT如果设置了IGNBRK,BREAK键的输入将被忽略,如果设置了BRKINT ,将产生SIGINT中断
IGNPAR忽略奇偶校验错误
PARMRK标识奇偶校验错误
INPCK允许输入奇偶校验
ISTRIP去除字符的第8个比特
INLCR将输入的NL(换行)转换成CR(回车)
IGNCR忽略输入的回车
ICRNL将输入的回车转化成换行(如果IGNCR未设置的情况下)
IUCLC将输入的大写字符转换成小写字符(非POSIX)
IXON允许输入时对XON/XOFF流进行控制
IXANY输入任何字符将重启停止的输出
IXOFF允许输入时对XON/XOFF流进行控制
IMAXBEL当输入队列满的时候开始响铃,Linux在使用该参数而是认为该参数总是已经设置

c_oflag:输出模式标志,控制终端输出方式,具体参数如下所示。
c_oflag参数
键值说明
OPOST处理后输出
OLCUC将输入的小写字符转换成大写字符(非POSIX)
ONLCR将输入的NL(换行)转换成CR(回车)及NL(换行)
OCRNL将输入的CR(回车)转换成NL(换行)
ONOCR第一行不输出回车符
ONLRET不输出回车符
OFILL发送填充字符以延迟终端输出
OFDEL以ASCII码的DEL作为填充字符,如果未设置该参数,填充字符将是NUL(‘/0’)(非POSIX)
NLDLY换行输出延时,可以取NL0(不延迟)或NL1(延迟0.1s)
CRDLY回车延迟,取值范围为:CR0、CR1、CR2和 CR3
TABDLY水平制表符输出延迟,取值范围为:TAB0、TAB1、TAB2和TAB3
BSDLY空格输出延迟,可以取BS0或BS1
VTDLY垂直制表符输出延迟,可以取VT0或VT1
FFDLY换页延迟,可以取FF0或FF1

c_cflag:控制模式标志,指定终端硬件控制信息,具体参数如下所示。
c_oflag参数
键值说明
CBAUD波特率(4+1位)(非POSIX)
CBAUDEX附加波特率(1位)(非POSIX)
CSIZE字符长度,取值范围为CS5、CS6、CS7或CS8
CSTOPB设置两个停止位
CREAD使用接收器
PARENB使用奇偶校验
PARODD对输入使用奇偶校验,对输出使用偶校验
HUPCL关闭设备时挂起
CLOCAL忽略调制解调器线路状态
CRTSCTS使用RTS/CTS流控制


c_lflag:本地模式标志,控制终端编辑功能,具体参数如下所示。
c_lflag参数
键值说明
ISIG当输入INTR、QUIT、SUSP或DSUSP时,产生相应的信号
ICANON使用标准输入模式
XCASE在ICANON和XCASE同时设置的情况下,终端只使用大写。如果只设置了XCASE,则输入字符将被转换为小写字符,除非字符使用了转义字符(非POSIX,且Linux不支持该参数)
ECHO显示输入字符
ECHOE如果ICANON同时设置,ERASE将删除输入的字符,WERASE将删除输入的单词
ECHOK如果ICANON同时设置,KILL将删除当前行
ECHONL如果ICANON同时设置,即使ECHO没有设置依然显示换行符
ECHOPRT如果ECHO和ICANON同时设置,将删除打印出的字符(非POSIX)
TOSTOP向后台输出发送SIGTTOU信号

与此结构体相关的函数
(一)tcgetattr()
1.原型
int tcgetattr(int fd,struct termois & termios_p);
2.
功能
取得终端介质(fd)初始值,并把其值 赋给temios_p;函数可以从后台进程中调用;但是,终端属性可能被后来的前台进程所改变。


(二)tcsetattr()
1.原型
int tcsetattr(int fd,int actions,const struct termios *termios_p);
2.功能
设置与终端相关的参数 (除非需要底层支持却无法满足),使用 termios_p 引用的 termios 结构。optional_actions (tcsetattr函数的第二个参数)指定了什么时候改变会起作用:
TCSANOW:改变立即发生
TCSADRAIN:改变在所有写入 fd 的输出都被传输后生效。这个函数应当用于修改影响输出的参数时使用。(当前输出完成时将值改变)
TCSAFLUSH :改变在所有写入 fd 引用的对象的输出都被传输后生效,所有已接受但未读入的输入都在改变发生前丢弃(同TCSADRAIN,但会舍弃当前所有值)。


(三)tcsendbreak()
传送连续的 0 值比特流,持续一段时间,如果终端使用异步串行数据传输的话。如果 duration 是 0,它至少传输 0.25 秒,不会超过 0.5 秒。如果 duration 非零,它发送的时间长度由实现定义。
如果终端并非使用异步串行数据传输,tcsendbreak() 什么都不做。


(四)tcdrain()
等待直到所有写入 fd 引用的对象的输出都被传输。


(五)tcflush()
丢弃要写入 引用的对象,但是尚未传输的数据,或者收到但是尚未读取的数据,取决于 queue_selector 的值:

TCIFLUSH :刷新收到的数据但是不读
TCOFLUSH :刷新写入的数据但是不传送
TCIOFLUSH :同时刷新收到的数据但是不读,并且刷新写入的数据但是不传送

(六)tcflow()
挂起 fd 引用的对象上的数据传输或接收,取决于 action 的值:

TCOOFF :挂起输出
TCOON :重新开始被挂起的输出
TCIOFF :发送一个 STOP 字符,停止终端设备向系统传送数据
TCION :发送一个 START 字符,使终端设备向系统传输数据
打开一个终端设备时的默认设置是输入和输出都没有挂起。


(七)波特率函数
被用来获取和设置 termios 结构中,输入和输出波特率的值。新值不会马上生效,直到成功调用了 tcsetattr() 函数。
设置速度为 B0 使得 modem "挂机"。与 B38400 相应的实际比特率可以用 setserial(8) 调整。
输入和输出波特率被保存于 termios 结构中。
cfmakeraw 设置终端属性如下:
termios_p->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
termios_p->c_oflag &= ~OPOST;
termios_p->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
termios_p->c_cflag &= ~(CSIZE|PARENB);
termios_p->c_cflag |= CS8;

1.cfgetospeed()返回 termios_p 指向的 termios 结构中存储的输出波特率
2.cfsetospeed()设置 termios_p 指向的 termios 结构中存储的输出波特率为 speed。取值必须是以下常量之一:
B0 B50 B75 B110 B134 B150 B200 B300 B600 B1200 B1800 B2400 B4800 B9600 B19200 B38400 B57600 B115200 B230400
其中:零值 B0 用来中断连接。如果指定了 B0,不应当再假定存在连接。通常,这样将断开连接。CBAUDEX 是一个掩码,指示高于 POSIX.1 定义的速度的那一些 (57600 及以上)。因此,B57600 & CBAUDEX 为非零。
3.cfgetispeed()返回 termios 结构中存储的输入波特率。
4.cfsetispeed()设置 termios 结构中存储的输入波特率为 speed。如果输入波特率被设为0,实际输入波特率将等于输出波特率。


RETURN VALUE 返回值
1.cfgetispeed() 返回 termios 结构中存储的输入波特率。
2.cfgetospeed() 返回 termios 结构中存储的输出波特率。
3.其他函数返回:
(1)0:成功
(2) -1:失败,
并且为 errno 置值来指示错误。
注意 tcsetattr() 返回成功,如果任何所要求的修改可以实现的话。因此,当进行多重修改时,应当在这个函数之后再次调用 tcgetattr() 来检测是否所有修改都成功实现


我的工程例子:


#include<stdio.h>

#include<string.h>

#include<unistd.h>

#include<fcntl.h>

#include<errno.h>

#include<termios.h>

#include<sys/time.h>


staticspeed_t getBaudrate(jint baudrate)

{

switch(baudrate){

case 0: return B0;

.....

case4800: return B4800;

case9600: return B9600;

case19200: return B19200;

case38400: return B38400;

.........

case576000: return B576000;

case1152000: return B1152000;

...

case 4000000: return B4000000;

default:return -1;

}

}




/*

*Class: cedric_serial_SerialPort

*Method: open

*Signature: (Ljava/lang/String;)V

*/

JNIEXPORTjobject JNICALL Java_com_jenny_iRelax_serialport_SerialPort_open

(JNIEnv*env, jobject thiz, jstring path, jint baudrate,,int stopbits,jint parity)

{

int fd;

speed_t speed;

jobject mFileDescriptor;


/*Check arguments */

{

speed= getBaudrate(baudrate);

if(speed == -1) {

/*TODO: throw an exception */

LOGI("Invalidbaudrate");

return NULL;

}

}

/*Opening device */

{

jboolean iscopy;

constchar *path_utf = (*env)->GetStringUTFChars(env, path, &iscopy);

LOGI("Openingserial port %s", path_utf);

fd= open(path_utf, O_RDWR | O_SYNC);// | O_DIRECT

LOGI("open()fd = %d,%s", fd,strerror(errno));

(*env)->ReleaseStringUTFChars(env,path, path_utf);

if(fd == -1)

{

/*Throw an exception */

LOGI("Cannotopen port");

/*TODO: throw an exception */

return NULL;

}

}

/*Configure device */

structtermios cfg;

LOGI("Configuringserial port");

//取得终端介质(fd)初始值,并把其值 赋给cfg;

if(tcgetattr(fd, &cfg))

{

LOGI("tcgetattr()failed");

close(fd);

/*TODO: throw an exception */

return NULL;

}

bzero(&cfg,sizeof(cfg));

//setting c_cflag

cfg.c_cflag &=~CSIZE;

switch(databits) /*设置数据位数*/

{

case7: cfg.c_cflag|= CS7; //7位数据位

break;

case8: cfg.c_cflag|= CS8; //8位数据位

break;

default: cfg.c_cflag|= CS8;

break;

}

switch(parity) //设置校验

{

case'n':

case'N':

cfg.c_cflag&= ~PARENB; /*输出不进行奇偶校验*/

cfg.c_iflag&= ~INPCK; /*输入不进行奇偶校验*/

break;

case'o':

case'O':

cfg.c_cflag|= (PARODD | PARENB); /*设置为奇校验*/

cfg.c_iflag|= INPCK; /* Disable parity checking */

break;

case'e':

case'E':

cfg.c_cflag|= PARENB; /* Enable parity */

cfg.c_cflag&= ~PARODD;/* 转换为偶校验*/

cfg.c_iflag|= INPCK; /* Disnable parity checking */

break;

case'S':

case's': /*as no parity*/

cfg.c_cflag&= ~PARENB;

cfg.c_cflag&= ~CSTOPB;break;

default:

cfg.c_cflag&= ~PARENB; /* Clear parity enable */

cfg.c_iflag&= ~INPCK; /* Enable parity checking */

break;

}

switch(stopbits)//设置停止位

{

case 1: cfg.c_cflag&= ~CSTOPB;

break;

case 2: cfg.c_cflag|= CSTOPB;

break;

default: cfg.c_cflag&= ~CSTOPB;

break;

}

cfg.c_cc[VTIME]= 0;

cfg.c_cc[VMIN]= 0;

cfg.c_cflag |= (CLOCAL|CREAD);

cfg.c_oflag|=OPOST;

cfg.c_iflag &=~(IXON|IXOFF|IXANY);

cfmakeraw(&cfg);

cfsetispeed(&cfg,speed);

cfsetospeed(&cfg,speed);

//丢弃要写入引用的对象,TCIFLUSH刷新收到的数据但是不读

tcflush(fd, TCIFLUSH);

//设置与终端相关的参数,TCSANOW ----改变立即发生

if(tcsetattr(fd, TCSANOW, &cfg))

{

LOGI("tcsetattr()failed");

close(fd);

/*TODO: throw an exception */

return NULL;

}


/*Create a corresponding file descriptor */

...........


return mFileDescriptor;

}


termios结构体中,该结构体一般包括如下的成员:
struct termios
{unsigned short c_iflag; /* 输入模式标志*/
unsigned short c_oflag; /* 输出模式标志*/
unsigned short c_cflag; /* 控制模式标志*/
unsigned short c_lflag; /*区域模式标志或本地模式标志或局部模式*/
unsigned char c_line; /*行控制line discipline */
unsigned char c_cc[NCC]; /* 控制字符特性*/
};


其具体意义如下

c_iflag:输入模式标志,控制终端输入方式,具体参数如下所示。

c_iflag参数表
键值说明
IGNBRK 忽略BREAK键输入
BRKINT如果设置了IGNBRK,BREAK键的输入将被忽略,如果设置了BRKINT ,将产生SIGINT中断
IGNPAR忽略奇偶校验错误
PARMRK标识奇偶校验错误
INPCK允许输入奇偶校验
ISTRIP去除字符的第8个比特
INLCR将输入的NL(换行)转换成CR(回车)
IGNCR忽略输入的回车
ICRNL将输入的回车转化成换行(如果IGNCR未设置的情况下)
IUCLC将输入的大写字符转换成小写字符(非POSIX)
IXON允许输入时对XON/XOFF流进行控制
IXANY输入任何字符将重启停止的输出
IXOFF允许输入时对XON/XOFF流进行控制
IMAXBEL当输入队列满的时候开始响铃,Linux在使用该参数而是认为该参数总是已经设置

c_oflag:输出模式标志,控制终端输出方式,具体参数如下所示。
c_oflag参数
键值说明
OPOST处理后输出
OLCUC将输入的小写字符转换成大写字符(非POSIX)
ONLCR将输入的NL(换行)转换成CR(回车)及NL(换行)
OCRNL将输入的CR(回车)转换成NL(换行)
ONOCR第一行不输出回车符
ONLRET不输出回车符
OFILL发送填充字符以延迟终端输出
OFDEL以ASCII码的DEL作为填充字符,如果未设置该参数,填充字符将是NUL(‘/0’)(非POSIX)
NLDLY换行输出延时,可以取NL0(不延迟)或NL1(延迟0.1s)
CRDLY回车延迟,取值范围为:CR0、CR1、CR2和 CR3
TABDLY水平制表符输出延迟,取值范围为:TAB0、TAB1、TAB2和TAB3
BSDLY空格输出延迟,可以取BS0或BS1
VTDLY垂直制表符输出延迟,可以取VT0或VT1
FFDLY换页延迟,可以取FF0或FF1

c_cflag:控制模式标志,指定终端硬件控制信息,具体参数如下所示。
c_oflag参数
键值说明
CBAUD波特率(4+1位)(非POSIX)
CBAUDEX附加波特率(1位)(非POSIX)
CSIZE字符长度,取值范围为CS5、CS6、CS7或CS8
CSTOPB设置两个停止位
CREAD使用接收器
PARENB使用奇偶校验
PARODD对输入使用奇偶校验,对输出使用偶校验
HUPCL关闭设备时挂起
CLOCAL忽略调制解调器线路状态
CRTSCTS使用RTS/CTS流控制


c_lflag:本地模式标志,控制终端编辑功能,具体参数如下所示。
c_lflag参数
键值说明
ISIG当输入INTR、QUIT、SUSP或DSUSP时,产生相应的信号
ICANON使用标准输入模式
XCASE在ICANON和XCASE同时设置的情况下,终端只使用大写。如果只设置了XCASE,则输入字符将被转换为小写字符,除非字符使用了转义字符(非POSIX,且Linux不支持该参数)
ECHO显示输入字符
ECHOE如果ICANON同时设置,ERASE将删除输入的字符,WERASE将删除输入的单词
ECHOK如果ICANON同时设置,KILL将删除当前行
ECHONL如果ICANON同时设置,即使ECHO没有设置依然显示换行符
ECHOPRT如果ECHO和ICANON同时设置,将删除打印出的字符(非POSIX)
TOSTOP向后台输出发送SIGTTOU信号

与此结构体相关的函数
(一)tcgetattr()
1.原型
int tcgetattr(int fd,struct termois & termios_p);
2.
功能
取得终端介质(fd)初始值,并把其值 赋给temios_p;函数可以从后台进程中调用;但是,终端属性可能被后来的前台进程所改变。


(二)tcsetattr()
1.原型
int tcsetattr(int fd,int actions,const struct termios *termios_p);
2.功能
设置与终端相关的参数 (除非需要底层支持却无法满足),使用 termios_p 引用的 termios 结构。optional_actions (tcsetattr函数的第二个参数)指定了什么时候改变会起作用:
TCSANOW:改变立即发生
TCSADRAIN:改变在所有写入 fd 的输出都被传输后生效。这个函数应当用于修改影响输出的参数时使用。(当前输出完成时将值改变)
TCSAFLUSH :改变在所有写入 fd 引用的对象的输出都被传输后生效,所有已接受但未读入的输入都在改变发生前丢弃(同TCSADRAIN,但会舍弃当前所有值)。


(三)tcsendbreak()
传送连续的 0 值比特流,持续一段时间,如果终端使用异步串行数据传输的话。如果 duration 是 0,它至少传输 0.25 秒,不会超过 0.5 秒。如果 duration 非零,它发送的时间长度由实现定义。
如果终端并非使用异步串行数据传输,tcsendbreak() 什么都不做。


(四)tcdrain()
等待直到所有写入 fd 引用的对象的输出都被传输。


(五)tcflush()
丢弃要写入 引用的对象,但是尚未传输的数据,或者收到但是尚未读取的数据,取决于 queue_selector 的值:

TCIFLUSH :刷新收到的数据但是不读
TCOFLUSH :刷新写入的数据但是不传送
TCIOFLUSH :同时刷新收到的数据但是不读,并且刷新写入的数据但是不传送

(六)tcflow()
挂起 fd 引用的对象上的数据传输或接收,取决于 action 的值:

TCOOFF :挂起输出
TCOON :重新开始被挂起的输出
TCIOFF :发送一个 STOP 字符,停止终端设备向系统传送数据
TCION :发送一个 START 字符,使终端设备向系统传输数据
打开一个终端设备时的默认设置是输入和输出都没有挂起。


(七)波特率函数
被用来获取和设置 termios 结构中,输入和输出波特率的值。新值不会马上生效,直到成功调用了 tcsetattr() 函数。
设置速度为 B0 使得 modem "挂机"。与 B38400 相应的实际比特率可以用 setserial(8) 调整。
输入和输出波特率被保存于 termios 结构中。
cfmakeraw 设置终端属性如下:
termios_p->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
termios_p->c_oflag &= ~OPOST;
termios_p->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
termios_p->c_cflag &= ~(CSIZE|PARENB);
termios_p->c_cflag |= CS8;

1.cfgetospeed()返回 termios_p 指向的 termios 结构中存储的输出波特率
2.cfsetospeed()设置 termios_p 指向的 termios 结构中存储的输出波特率为 speed。取值必须是以下常量之一:
B0 B50 B75 B110 B134 B150 B200 B300 B600 B1200 B1800 B2400 B4800 B9600 B19200 B38400 B57600 B115200 B230400
其中:零值 B0 用来中断连接。如果指定了 B0,不应当再假定存在连接。通常,这样将断开连接。CBAUDEX 是一个掩码,指示高于 POSIX.1 定义的速度的那一些 (57600 及以上)。因此,B57600 & CBAUDEX 为非零。
3.cfgetispeed()返回 termios 结构中存储的输入波特率。
4.cfsetispeed()设置 termios 结构中存储的输入波特率为 speed。如果输入波特率被设为0,实际输入波特率将等于输出波特率。


RETURN VALUE 返回值
1.cfgetispeed() 返回 termios 结构中存储的输入波特率。
2.cfgetospeed() 返回 termios 结构中存储的输出波特率。
3.其他函数返回:
(1)0:成功
(2) -1:失败,
并且为 errno 置值来指示错误。
注意 tcsetattr() 返回成功,如果任何所要求的修改可以实现的话。因此,当进行多重修改时,应当在这个函数之后再次调用 tcgetattr() 来检测是否所有修改都成功实现


我的工程例子:


#include<stdio.h>

#include<string.h>

#include<unistd.h>

#include<fcntl.h>

#include<errno.h>

#include<termios.h>

#include<sys/time.h>


staticspeed_t getBaudrate(jint baudrate)

{

switch(baudrate){

case 0: return B0;

.....

case4800: return B4800;

case9600: return B9600;

case19200: return B19200;

case38400: return B38400;

.........

case576000: return B576000;

case1152000: return B1152000;

...

case 4000000: return B4000000;

default:return -1;

}

}




/*

*Class: cedric_serial_SerialPort

*Method: open

*Signature: (Ljava/lang/String;)V

*/

JNIEXPORTjobject JNICALL Java_com_jenny_iRelax_serialport_SerialPort_open

(JNIEnv*env, jobject thiz, jstring path, jint baudrate,,int stopbits,jint parity)

{

int fd;

speed_t speed;

jobject mFileDescriptor;


/*Check arguments */

{

speed= getBaudrate(baudrate);

if(speed == -1) {

/*TODO: throw an exception */

LOGI("Invalidbaudrate");

return NULL;

}

}

/*Opening device */

{

jboolean iscopy;

constchar *path_utf = (*env)->GetStringUTFChars(env, path, &iscopy);

LOGI("Openingserial port %s", path_utf);

fd= open(path_utf, O_RDWR | O_SYNC);// | O_DIRECT

LOGI("open()fd = %d,%s", fd,strerror(errno));

(*env)->ReleaseStringUTFChars(env,path, path_utf);

if(fd == -1)

{

/*Throw an exception */

LOGI("Cannotopen port");

/*TODO: throw an exception */

return NULL;

}

}

/*Configure device */

structtermios cfg;

LOGI("Configuringserial port");

//取得终端介质(fd)初始值,并把其值 赋给cfg;

if(tcgetattr(fd, &cfg))

{

LOGI("tcgetattr()failed");

close(fd);

/*TODO: throw an exception */

return NULL;

}

bzero(&cfg,sizeof(cfg));

//setting c_cflag

cfg.c_cflag &=~CSIZE;

switch(databits) /*设置数据位数*/

{

case7: cfg.c_cflag|= CS7; //7位数据位

break;

case8: cfg.c_cflag|= CS8; //8位数据位

break;

default: cfg.c_cflag|= CS8;

break;

}

switch(parity) //设置校验

{

case'n':

case'N':

cfg.c_cflag&= ~PARENB; /*输出不进行奇偶校验*/

cfg.c_iflag&= ~INPCK; /*输入不进行奇偶校验*/

break;

case'o':

case'O':

cfg.c_cflag|= (PARODD | PARENB); /*设置为奇校验*/

cfg.c_iflag|= INPCK; /* Disable parity checking */

break;

case'e':

case'E':

cfg.c_cflag|= PARENB; /* Enable parity */

cfg.c_cflag&= ~PARODD;/* 转换为偶校验*/

cfg.c_iflag|= INPCK; /* Disnable parity checking */

break;

case'S':

case's': /*as no parity*/

cfg.c_cflag&= ~PARENB;

cfg.c_cflag&= ~CSTOPB;break;

default:

cfg.c_cflag&= ~PARENB; /* Clear parity enable */

cfg.c_iflag&= ~INPCK; /* Enable parity checking */

break;

}

switch(stopbits)//设置停止位

{

case 1: cfg.c_cflag&= ~CSTOPB;

break;

case 2: cfg.c_cflag|= CSTOPB;

break;

default: cfg.c_cflag&= ~CSTOPB;

break;

}

cfg.c_cc[VTIME]= 0;

cfg.c_cc[VMIN]= 0;

cfg.c_cflag |= (CLOCAL|CREAD);

cfg.c_oflag|=OPOST;

cfg.c_iflag &=~(IXON|IXOFF|IXANY);

cfmakeraw(&cfg);

cfsetispeed(&cfg,speed);

cfsetospeed(&cfg,speed);

//丢弃要写入引用的对象,TCIFLUSH刷新收到的数据但是不读

tcflush(fd, TCIFLUSH);

//设置与终端相关的参数,TCSANOW ----改变立即发生

if(tcsetattr(fd, TCSANOW, &cfg))

{

LOGI("tcsetattr()failed");

close(fd);

/*TODO: throw an exception */

return NULL;

}


/*Create a corresponding file descriptor */

...........


return mFileDescriptor;

}


分享到:
评论

相关推荐

    linux串口termios.pdf

    linux串口termios.pdf

    linux串口termios[定义].pdf

    linux串口termios[定义].pdf

    Linux串口编程-ESP8266WIFI模块应用

    Linux串口编程,结合ESP8266WIFI模块,实现开发板之间的wifi通信。本工程使用c语言对串口进行编程,运用read,write函数对串口进行AT指令发送以及数据传输。同时,也包含了对termios结构体的运用。

    Linux内核开发termios详解

    termios 结构是在POSIX规范中定义的标准接口,它类似于系统V中的termio接口,通过设置termios类型的数据结构中的值和使用一小组函数调用,你就可以对终端接口进行控制。

    linux下串口通信

    linux 串口 通信 程序 #include &lt;stdio.h&gt; #include #include #include #include #include &lt;termios.h&gt; #include #include &lt;string.h&gt;

    termios详解.doc

    termios的实现中,有大量的参数设置,还有伪终端的 说法。原因就在于当初UNIX发明时,(上世纪七十~八十年代),在美国,西欧大学里面用的都是大型机加客户终端,学生们用的是串口方式与大型机进行交 流,通讯。所以...

    linux+c+串口

    struct termios attr; tcgetattr(fd, &attr;); cfsetspeed(&attr;,B9600); tcsetattr(fd, TCSANOW, &attr;); read(fd,buf,sizeof(buf)); printf("%s\n",buf); write(fd,data,sizeof(data)); read(fd,buf,sizeof(buf...

    c语言 termios.h

    c语言 termios.h

    嵌入式串口

    嵌入式单片机串口通信调试程序串口作为 MCU 的重要外部接口,同时也是软件开发重要的调试手段,其重要性不言而喻。 现在基本上所有的 MCU 都会带有串口,STM32 自然也不例外。 STM32 的串口资源相当丰富的,功能也...

    linux 串口通信

    linux中串口通讯第一步就是打开设备文件,对其属性进行配置,主要用到termios这个结构体。工作常备的资料!很实用!

    termios结构体

    termios结构体

    linux下串口程序

    #include #include #include #include #include #include #include #include #include&lt;termios.h&gt;

    TERMIOS详解.pdf

    TERMIOS详解 资源从网上搜索得来 不是本人制作

    串口终端VC源代码(ARM, MIPS串口调试打印语句用软件的源代码)

    免分提供 串口终端vc源代码. ARM, MIPS串口调试打印语句用软件的源代码 (三星S3C2410微处理器, MIPS等用) USB 下载器上位机程序及 VC 源码包 含库头文件以及库 eb

    C语言串口通信,可以直接编译使用

    打开成功后,"open"函数会返回文件描述符,用于后续的读写操作。如果打开失败,则返回一个负值,同时全局变量"errno"存储具体的错误信息。 接着,我们需要获取串口设备当前的配置参数。"tcgetattr"函数用于获取这些...

    termios:多平台Golang终端管理。 重做版本

    Termios 有关文档,请参阅 。 入门 通过打开当前终端来使用termios 。 那你可以 从用户那里读取密钥 写文字,清除终端 获取(窗口大小),设置(光标位置,样式)属性 term, err := termios.Open() if err != nil {...

    Linux程序设计 第4版.haozip01

    2.8.3 应用程序的说明 76 2.9 小结 77 第3章 文件操作 78 3.1 linux文件结构 78 3.1.1 目录 79 3.1.2 文件和设备 79 3.2 系统调用和设备驱动程序 80 3.3 库函数 81 3.4 底层文件访问 82 3.4.1 write系统...

    linux的man手册PDF格式(不全)

    linux的man手册PDF格式(不全).有open,read,write,close,fopen,fclose,fputs,fgets,termios等

    Linux下 2048小游戏

    在Linux下运行,tar -zxvf 2048.tar.gz 解压 并运行即可 //附加头文件代码 #include #include &lt;termios.h&gt; //操作终端 #include #include #include char my_getch() { int c=0; struct termios org_opts, new...

Global site tag (gtag.js) - Google Analytics