11、串口编程
2016-05-19 19:08
281 查看
structtermios{
tcflag_tc_iflag;/*inputmodeflags*/输入模式标志
tcflag_tc_oflag;/*outputmodeflags*/输出模式标志
tcflag_tc_cflag;
/*controlmodeflags*/控制模式标志
tcflag_tc_lflag;/*localmodeflags*/本地模式标志
cc_tc_line;/*linediscipline*/
cc_tc_cc[NCCS];/*controlcharacters*/控制字符
};、
6.1、controlflag
控制模式,主要是对,波特率,传输的数据位,校验位、停止位、和流控进行设置。对于控制标志的设置,是通过下面的常量(宏)进行配置。Constant DescriptionCBAUD BitmaskforbaudrateB0 0baud(dropDTR) //波特率B50 50baudB75 75baudB110 110baudB134 134.5baudB150 150baudB200 200baudB300 300baudB600 600baudB1200 1200baudB1800 1800baudB2400 2400baudB4800 4800baudB9600 9600baudB19200 19200baudB38400 38400baudB57600 57,600baudB76800 76,800baudB115200 115,200baudEXTA ExternalrateclockEXTB ExternalrateclockCSIZE Bitmaskfordatabits //传输数据位的掩模CS5 5databitsCS6 6databitsCS7 7databitsCS8 8databits //8bit数据位CSTOPB 2stopbits(1otherwise) //2个停止位CREAD Enablereceiver //允许接收字符PARENB Enableparitybit //使能校验位PARODD Useoddparityinsteadofeven //使用奇校验HUPCL Hangup(dropDTR)onlastcloseCLOCAL Localline−donotchange"owner" // 本地接收ofportLOBLK Blockjobcontroloutput CNEW_RTSCTS //CNEW_RTSCTS和CRTSCTS 使能硬件流控 CRTSCTS Enablehardwareflowcontrol(notsupportedonallplatforms) CLOCAL 和CREAD这两个选项,应该被选中。而对标志的设置,永远也不要对这些标志做初始化的操作,而应该是使用与、或的操作,达到清零或者置一的操作。
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<termios.h>
#include<errno.h>[/code]
(1)属性的获取与设置
inttcgetattr(intfd,structtermios*termios_p);
获取属性存放在structtermios里面,而fd是打开串口的的文件描述符。
inttcsetattr(intfd,intoptional_actions,conststructtermios*termios_p);设置属性(termios结构)//激活自己的配置
cfgetispeed得到输入速度
Cfgetospeed得到输出速度[/code]
Cfsetispeed设置输入速度
Cfsetospeed设置输出速度[/code]
Tcdrain等待所有输出都被传输[/code]
tcflow挂起传输或接收
tcflush刷清未决输入和/或输出[/code]
Tcsendbreak送BREAK字符
tcgetpgrp得到前台进程组ID
tcsetpgrp设置前台进程组ID[/code]
structtermiosnewtio,oldtio;
tcgetattr(fd,&oldtio);[/code] 获取原先串口的配置。
newtio.c_cflag|=CLOCAL|CREAD;
cfsetispeed(&Opt,B19200);/*设置为19200Bps*/
cfsetospeed(&Opt,B19200);//设置输出的波特率为19200
波特率的设置,都是BXXXXX
newtio.c_cflag&=~CSIZE;
newtio.c_cflag|=CS8;//设置数据位为8位
设置奇校验
newtio.c_cflag|=PARENB;
newtio.c_cflag|=PARODD;
newtio.c_iflag|=(INPCK|ISTRIP);
设置偶校验:
newtio.c_iflag|=(INPCK|ISTRIP);
newtio.c_cflag|=PARENB;
newtio.c_cflag|=~PARODD;
newtio.c_cflag&=~CSTOPB;
newtio.c_cc[VTIME]=0;
newtio.c_cc[VMIN]=0;
inttcflush(intfiledes,intquene)
quene数应当是下列三个常数之一:
*TCIFLUSH刷清输入队列
*TCOFLUSH刷清输出队列
*TCIOFLUSH刷清输入、输出队列
inttcsetattr(intfiledes,intopt,conststructtermios*termptr);
opt使我们可以指定在什么时候新的终端属性才起作用,[/code]
*TCSANOW:更改立即发生
*TCSADRAIN:发送了所有输出后更改才发生。若更改输出参数则应使用此选项
*TCSAFLUSH:发送了所有输出后更改才发生。更进一步,在更改发生时未读的
//打开串口并初始化设置
init_serial(void)
{
serial_fd=open("/dev/ttyS0",O_RDWR|O_NOCTTY|O_NDELAY);
if(serial_fd<0){
perror("open");
return-1;
}
//串口主要设置结构体termios<termios.h>
structtermiosoldtio;
structtermiosnewtio;
bzero(&newtio,sizeof(structtermios));
/**1.tcgetattr函数用于获取与终端相关的参数。
*参数fd为终端的文件描述符,返回的结果保存在termios结构体中
*/
tcgetattr(serial_fd,&oldtio);
/**2.修改所获得的参数*/
newtio.c_cflag|=(CLOCAL|CREAD);//设置控制模式状态,本地连接,接收使能
//3.设置串口输入输出的波特率
cfsetispeed(&newtio,B115200);cfsetospeed(&newtio,B115200);//4.设置数据位的位数newtio.c_cflag&=~CSIZE;//字符长度,设置数据位之前一定要屏掉这个位,其实是将对应的位进行清理
newtio.c_cflag&=~CRTSCTS;//无硬件流控
newtio.c_cflag|=CS8;//8位数据长度,设置对应的位//5.设置奇偶校验newtio.c_iflag|=IGNPAR;//无奇偶检验位
//6.设置停止位
newtio.c_cflag&=~CSTOPB;//1位停止位停止位
//7.设置最少字符和等待的时间
newtio_c.cc[VTIME]=0;newtio_c.cc[VMIN]=0;
//8.清空缓存区域
tcflush(serial_fd,TCIOFLUSH);//刷新输入输出的缓存
//9.激活配置
tcsetattr(serial_fd,TCSANOW,&newtio);
//options.c_lflag &=~(ICANON|ECHO|ECHOE|ISIG); /*Input*/ //options.c_oflag &=~OPOST; /*Output*/
return0;
}[/code]
options.c_lflag&=~(ICANON|ECHO|ECHOE|ISIG);/*Input*/
options.c_oflag&=~OPOST;/*Output*/[/code]当然设置也可以为终端模式:
options.c_lflag|=(ICANON|ECHO|ECHOE|ISIG);/*Input*/
options.c_oflag|=OPOST;/*Output*/
intbuf[1024];
intreadByte=read(fd,buf,1024);[/code] 就可以将串口的数据读取到buf中,而返回值为读取到字符的数目。
close(fd);[/code] 一般来说,关闭了串口,先要将之前的串口的配置进行还原。