2009-5-23
 
串口编程
对于串口的编程操作,不论是在wince还是linux下流程都是差不多的,但是一些操作模式还是有很大的差别的,在这里主要记录学习下linux下面的一些关于串口编程的结构体和函数调用。
       首要要说的就得数termios这个结构了,定义如下:
struct termios
{
       tcflag  c_iflag;      //input flags
       tcflag  c_oflag;     //output flags
       tcflag  c_cflag;     //control flags
       tcflag  c_lflag;     //local flags
       cc_t   c_cc[NCCS] //control charactors
};
这个结构体主要是针对串口的一些配置,串口的一些操作都是围绕它来进行的。
 
       下面看一些与串口操作相关的函数调用
tcgetattr        取属性(termios结构)
tcsetattr        设置属性(termios结构)
cfgetispeed   得到输入速度
cfgetospeed         得到输出速度
cfsetispeed           设置输入速度
cfsetospeed          设置输出速度
tcdrain           等待所有输出都被传输
tcflow           挂起传输或接收
tcflush          刷清未决输入和/或输出
tcsendbreak         BREAK字符
tcgetpgrp            得到前台进程组ID
tcsetpgrp             设置前台进程组ID
 
       要用到的东西,说完了,下面看下,这个流程对上述函数的调用过程。
1.      打开串口
fd = open( "/dev/ttyS0", O_RDWR|O_NOCTTY|O_NDELAY);//ttyo代表串口1
2.      设置读写的阻塞状态
fcntl(fd, F_SETFL, 0);
3.      检查串口是否已被占用
isatty(STDIN_FILENO);
4.      对该打开串口的当前配置进行保存
tcgetattr( fd,&oldtio);
5.      对串口新配置的设置
bzero( &newtio, sizeof( newtio ) );
newtio.c_cflag  |=  CLOCAL | CREAD;
newtio.c_cflag &= ~CSIZE;
newtio.c_cflag |= CS8;//数据位为8
newtio.c_cflag |= PARENB;//使能奇偶校验
newtio.c_cflag |= PARODD;//设置校验为奇校验
newtio.c_iflag |= (INPCK | ISTRIP);
cfsetispeed(&newtio, B115200);//设置输入波特率为115200
cfsetospeed(&newtio, B115200);//设置输出波特率为115200
newtio.c_cflag &=  ~CSTOPB;//设置停止位为1
newtio.c_cc[VTIME]  = 0;
newtio.c_cc[VMIN] = 0;
tcflush(fd,TCIFLUSH);//设置flush为输入flush
tcsetattr(fd,TCSANOW,&newtio);//设置新的配置
6.      读写用readwrite函数
7.      最后用close关闭打开的串口