linux下串口使用

{
    perror("Open UART failed!");
    return -1;
}
return fd;

}


3、设置串口  
 串口初始化需要设置串口波特率,数据流控制,帧的格式(即数据位个数,停止位,校验位,数据流控制)。  
 最基本的串口设置包括波特率、校验位和停止位设置,且串口设置主要使用  
 termios.h头文件中定义的termios结构


串口配置函数



int uart_set(int fd,int baude,int c_flow,int bits,char parity,int stop)
{
struct termios options;

/\*获取终端属性\*/
if(tcgetattr(fd,&options) < 0)
{
    perror("tcgetattr error");
    return -1;
}

/\*设置输入输出波特率,两者保持一致\*/
switch(baude)
{
    case 4800:
        cfsetispeed(&options,B4800);
        cfsetospeed(&options,B4800);
        break;
    case 9600:
        cfsetispeed(&options,B9600);
        cfsetospeed(&options,B9600);
        break;
    case 19200:
        cfsetispeed(&options,B19200);
        cfsetospeed(&options,B19200);
        break;
    case 38400:
        cfsetispeed(&options,B38400);
        cfsetospeed(&options,B38400);
        break;
    default:
        fprintf(stderr,"Unkown baude!\n");
        return -1;
}

/\*设置控制模式\*/
options.c_cflag |= CLOCAL;//保证程序不占用串口
options.c_cflag |= CREAD;//保证程序可以从串口中读取数据

/\*设置数据流控制\*/
switch(c_flow)
{
    case 0://不进行流控制
        options.c_cflag &= ~CRTSCTS;
        break;
    case 1://进行硬件流控制
        options.c_cflag |= CRTSCTS;
        break;
    case 2://进行软件流控制
        options.c_cflag |= IXON|IXOFF|IXANY;
        break;
    default:
        fprintf(stderr,"Unkown c\_flow!\n");
        return -1;
}

/\*设置数据位\*/
switch(bits)
{
    case 5:
        options.c_cflag &= ~CSIZE;//屏蔽其它标志位
        options.c_cflag |= CS5;
        break;
    case 6:
        options.c_cflag &= ~CSIZE;//屏蔽其它标志位
        options.c_cflag |= CS6;
        break;
    case 7:
        options.c_cflag &= ~CSIZE;//屏蔽其它标志位
        options.c_cflag |= CS7;
        break;
    case 8:
        options.c_cflag &= ~CSIZE;//屏蔽其它标志位
        options.c_cflag |= CS8;
        break;
    default:
        fprintf(stderr,"Unkown bits!\n");
        return -1;
}

/\*设置校验位\*/
switch(parity)
{
    /\*无奇偶校验位\*/
    case 'n':
    case 'N':
        options.c_cflag &= ~PARENB;//PARENB:产生奇偶位,执行奇偶校验
        options.c_cflag &= ~INPCK;//INPCK:使奇偶校验起作用
        break;
    /\*设为空格,即停止位为2位\*/
    case 's':
    case 'S':
        options.c_cflag &= ~PARENB;//PARENB:产生奇偶位,执行奇偶校验
        options.c_cflag &= ~CSTOPB;//CSTOPB:使用两位停止位
        break;
    /\*设置奇校验\*/
    case 'o':
    case 'O':
        options.c_cflag |= PARENB;//PARENB:产生奇偶位,执行奇偶校验
        options.c_cflag |= PARODD;//PARODD:若设置则为奇校验,否则为偶校验
        options.c_cflag |= INPCK;//INPCK:使奇偶校验起作用
        options.c_cflag |= ISTRIP;//ISTRIP:若设置则有效输入数字被剥离7个字节,否则保留全部8位
        break;
    /\*设置偶校验\*/
    case 'e':
    case 'E':
        options.c_cflag |= PARENB;//PARENB:产生奇偶位,执行奇偶校验
        options.c_cflag &= ~PARODD;//PARODD:若设置则为奇校验,否则为偶校验
        options.c_cflag |= INPCK;//INPCK:使奇偶校验起作用
        options.c_cflag |= ISTRIP;//ISTRIP:若设置则有效输入数字被剥离7个字节,否则保留全部8位
        break;
    default:
        fprintf(stderr,"Unkown parity!\n");
        return -1;
}

/\*设置停止位\*/
switch(stop)
{
    case 1:
        options.c_cflag &= ~CSTOPB;//CSTOPB:使用1位停止位
        break;
    case 2:
        options.c_cflag |= CSTOPB;//CSTOPB:使用两位停止位
        break;
    default:
        fprintf(stderr,"Unkown stop!\n");
        return -1;
}

/\*设置输出模式为原始输出\*/
options.c_oflag &= ~OPOST;//OPOST:若设置则按定义的输出处理,否则所有c\_oflag失效

/\*设置本地模式为原始模式\*/
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
/\*

*ICANON:允许规范模式进行输入处理
*ECHO:允许输入字符的本地回显
*ECHOE:在接收EPASE时执行Backspace,Space,Backspace组合
*ISIG:允许信号
*/

/\*设置等待时间和最小接受字符 否则就会阻塞 如果两个都是0就表示只要我去读就会返回\*/
options.c_cc[VTIME] = 0;//可以在select中设置
options.c_cc[VMIN] = 1;//最少读取一个字符

/\*如果发生数据溢出,只接受数据,但是不进行读操作\*/
tcflush(fd,TCIFLUSH);

/\*

激活配置
TCSANOW:立即执行而不等待数据发送或者接受完成。
TCSADRAIN:等待所有数据传递完成后执行。
TCSAFLUSH:Flush input and output buffers and make the change
*/
if(tcsetattr(fd,TCSANOW,&options) < 0)
{
perror(“tcsetattr failed”);
return -1;
}
return 0;
}


串口默认缓冲512个字节  
 4、串口读写



ssize_t safe_write(int fd, const void *vptr, size_t n)
{
size_t nleft;
ssize_t nwritten;
const char *ptr;

ptr = vptr;
nleft = n;

while(nleft > 0)
{
if((nwritten = write(fd, ptr, nleft)) <= 0)
    {
        if(nwritten < 0&&errno == EINTR)
            nwritten = 0;
        else
            return -1;
    }
    nleft -= nwritten;
    ptr   += nwritten;
}
return(n);

}

ssize_t safe_read(int fd,void *vptr,size_t n)
{
size_t nleft;
ssize_t nread;
char *ptr;

ptr=vptr;
nleft=n;

while(nleft > 0)
{

最全的Linux教程,Linux从入门到精通

======================

  1. linux从入门到精通(第2版)

  2. Linux系统移植

  3. Linux驱动开发入门与实战

  4. LINUX 系统移植 第2版

  5. Linux开源网络全栈详解 从DPDK到OpenFlow

华为18级工程师呕心沥血撰写3000页Linux学习笔记教程

第一份《Linux从入门到精通》466页

====================

内容简介

====

本书是获得了很多读者好评的Linux经典畅销书**《Linux从入门到精通》的第2版**。本书第1版出版后曾经多次印刷,并被51CTO读书频道评为“最受读者喜爱的原创IT技术图书奖”。本书第﹖版以最新的Ubuntu 12.04为版本,循序渐进地向读者介绍了Linux 的基础应用、系统管理、网络应用、娱乐和办公、程序开发、服务器配置、系统安全等。本书附带1张光盘,内容为本书配套多媒体教学视频。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。

华为18级工程师呕心沥血撰写3000页Linux学习笔记教程

本书适合广大Linux初中级用户、开源软件爱好者和大专院校的学生阅读,同时也非常适合准备从事Linux平台开发的各类人员。

需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论

加入社区》https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值