linux系统串口编程实例

来源:互联网 发布:日本网络直播网站 编辑:程序博客网 时间:2024/04/29 04:31
    在嵌入式开发中一些设备如WiFi、蓝牙......都会通过串口进行主机与从机间通信,串口一般以每次1bit位进行传输,效率相对慢。    在linux系统下串口的编程有如下几个步骤,最主要的是串口初始化!    1.打开串口 open(“/dev/XXXX”, O_NOCTTY|O_RDWR)    2.初始化串口 见下面实例。    3.对串口读写操作    4.关闭串口
#include <termios.h>/** *fd: 串口描述符 *nbits: 数据位 *nvent: 奇偶校验位 *nspeed: 波特率 *nstop: 停止位 **/bool set_opt(int fd, int nbits, char nevent, int nspeed, int nstop){    struct termios newtio, oldtio;    //检测是否为终端设备描述符    if (!isatty(fd)) {        perror("is not a termios device");        return false;    }    //得到此描述符之前的属性    if (tcgetattr(fd, &oldtio) != 0) {        perror("tcgetattr error");        return false;    }    //CLOCAL:忽略调制解调器状态行    //CREAD:开启接受装置    newtio.c_cflag |= CLOCAL | CREAD;    //清空字符长度位    newtio.c_cflag &= ~CSIZE;    //设置数据位    switch(nbits) {        case 5:            newtio.c_cflag |= CS5;            break;        case 6:            newtio.c_cflag |= CS6;            break;        case 7:            newtio.c_cflag |= CS7;            break;        case 8:            newtio.c_cflag |= CS8;            break;    }    //设置奇偶校验位    switch(nevent) {        case 'O':            newtio.c_cflag |= PARENB;            newtio.c_cflag |= PARODD;            newtio.c_iflag |= (INPCK | ISTRIP);            break;        case 'E':            newtio.c_cflag |= PARENB;            newtio.c_cflag &= ~PARODD;            newtio.c_iflag |= (INPCK | ISTRIP);            break;        case 'N':            newtio.c_cflag &= ~PARENB;            break;    }    //设置波特率    switch(nspeed) {        case 115200:            cfsetospeed(&newtio, B115200);            cfsetispeed(&newtio, B115200);            break;        case 9600:            cfsetospeed(&newtio, B9600);            cfsetispeed(&newtio, B9600);            break;        case 2400:            cfsetospeed(&newtio, B2400);            cfsetispeed(&newtio, B2400);            break;        case 4800:            cfsetospeed(&newtio, B4800);            cfsetispeed(&newtio, B4800);            break;        case 460800:            cfsetospeed(&newtio, B460800);            cfsetispeed(&newtio, B460800);            break;        default:            cfsetispeed(&newtio, B9600);            cfsetospeed(&newtio, B9600);            break;    }    //设置停止位    if (1 == nstop) {        newtio.c_cflag &= ~CSTOPB;    } else if (2 == nstop) {        newtio.c_cflag |= CSTOPB;    }    //MIN==0, TIME==0  如果有数据可用,则read最多返回所要求的字节数,    //如果无数据可用,则read立即返回0    newtio.c_cc[VTIME]  = 0;    newtio.c_cc[VMIN] = 0;    //冲洗输入缓冲区    tcflush(fd, TCIFLUSH);    //为终端设备设置属性    if (tcsetattr(fd, TCSANOW, &newtio) != 0) {        perror("comX set error");        return false;       }    return true;}