Linux串口编程入门

<!--EndFragment-->

开发环境

Fedora12

GCC4.4.4

Linux的串口编程使用POSIX终端控制函数,关于POSIX终端控制函数的详细情况可以查看:

SerialProgrammingGuideforPOSIXOperatingSystems

我的翻译:

POSIX操作系统的串口编程指南

相关头文件

termios.h

在/usr/include目录下,包含了POSIX终端控制函数的声明,代码中只包含这个头文件即可。

bit/termios.h

在/usr/include/bit目录下,定义了POSIX终端控制函数所需的数据结构和所有选项的宏定义。

打开、关闭串口

int fd=0; fd=open("/dev/ttyS0",O_RDWR | O_NOCTTY | O_NDELAY); close(fd);

O_NOCTTY:如果打开的是终端设备,不会成为进程的控制终端。

O_NDELAY:该程序不关心DCD信号的状态,即另一端的串口是否打开。

配置串口

配置串口需要使用termios结构,它包含了串口的所有参数选项,它的定义在bits/termios.h文件中:

typedef unsigned char cc_t; typedef unsigned int speed_t; typedef unsigned int tcflag_t; #define NCCS 32 struct termios { tcflag_t c_iflag; /* input mode flags */ tcflag_t c_oflag; /* output mode flags */ tcflag_t c_cflag; /* control mode flags */ tcflag_t c_lflag; /* local mode flags */ cc_t c_line; /* line discipline */ cc_t c_cc[NCCS]; /* control characters */ speed_t c_ispeed; /* input speed */ speed_t c_ospeed; /* output speed */ };

POSIX标准提供了如下两个函数用于获得和设置串口的属性:

inttcgetattr(intfd,structtermios*);

inttcsetattr(intfd,intactions,conststructtermios*);

fd为文件描述符;

tcgetattr将当前串口的参数放在一个termios结构中;

tcsetattr根据termios指针指向的结构设置当前的串口,optional_action有三个可选参数:

TCSANOW:立即进行修改;

TCSADRAIIN:等待当前输出完成后再修改;

TCSAFLUSH:等待当前输出完成后再修改,但丢弃还未从read调用返回的当前可以的任何输入。

1)设置波特率

设置波特率不可用直接操作termios结构的c_ispeed和c_ospeed成员,需要用函数cfsetispeed和cfsetospeed分别设置输入和输出的波特率,最好设置为相同:

struct termios options; speed_t baudrate=0; . . . tcgetattr(fd,&options); cfsetispeed(&options,baudrate); cfsetospeed(&options,baudrate); tcsetattr(fd,TCSANOW,&options); tcflush(fd,TCIOFLUSH);

函数参数baudrate是波特率,它的值可以使用bits/termios.h中的宏定义,常用的有:

#defineB0 0000000 /*hangup*/

#defineB4800 0000014

#defineB9600 0000015

#defineB19200 0000016

#defineB38400 0000017

#defineB576000010001

#defineB1152000010002

tcflush函数用于清空输入、输出缓冲区,有三个选项:

TCIFLUSH:清空输入

TCOFLUSH:清空输出

TCIOFLUSH:清空输入和输入

2)设置数据位、校验位、停止位

这些属性的设置都要修改termios结构中的c_cflag成员变量。

设置数据位:

//五位数据位 options.c_cflag &= ~CSIZE; options.c_cflag |= CS5; //六位数据位 options.c_cflag &= ~CSIZE; options.c_cflag |= CS6; //七位数据位 options.c_cflag &= ~CSIZE; options.c_cflag |= CS7; //八位数据位 options.c_cflag &= ~CSIZE; options.c_cflag |= CS8;

设置奇偶校验位:

//无校验 options.c_cflag &= ~PARENB; options.c_iflag &= ~INPCK; //奇校验 options.c_cflag |= PARENB; options.c_cflag &= ~PARODD; options.c_iflag |= INPCK; //偶校验 options.c_cflag |= PARENB; options.c_cflag |= PARODD; options.c_iflag |= INPCK;

如果使能了奇 偶校验,最好用options.c_iflag|=INPCK使能输入奇偶校验。

设置停止位:

//一位停止位 options.c_cflag &= ~CSTOPB; //两位停止位 options.c_cflag |= CSTOPB;

3)设置流控制

/无流控制 options.c_iflag &= ~(IXON | IXOFF | IXANY); //disable software flow control options.c_cflag &= ~CRTSCTS; //disable hardware flow control options.c_cflag |= CLOCAL; //软件流控制 options.c_cflag &= ~CRTSCTS; options.c_cflag &= ~CLOCAL; options.c_iflag |= (IXON | IXOFF | IXANY); //硬件流控制 options.c_cflag &= ~CLOCAL; options.c_iflag &= ~(IXON | IXOFF | IXANY); options.c_cflag |= CRTSCTS;

4)本地模式

选择CanonicalInput:

CanonicalInput是以行进行操作的。输入的字符被放在一个可以由用户进行交互编辑的缓冲区,直到收到回车(CR)或换行(LF)字符。选择这个模式的话,你需要选择ICANON,ECHO和ECHOE选项:

options.c_lflag|=(ICANON|ECHO|ECHOE);

选择RawInput:

Rawinput是不做任何处理的。输入字符被收到后就直接传送。你需要取消ICANON、ECHO、ECHOE和ISIG选项来选择RawInput模式:

options.c_lflag&=~(ICANON|ECHO|ECHOE|ISIG);

如果只是做串口调试,只需接受原始数据,选择RawInput即可。

5)输出模式

输出模式c_oflag中设置,主要用于对串口在CanonicalInput模式时输出的特殊字符处理,而对RawInput模式无效。如果设置了RawInput,需要取消c_oflag中的OPOST

options.c_oflag&=~OPOST;

取消OPOST选项时,c_oflag中的其他选项都将被忽略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值