linux学习——简单串口通信

在嵌入式linux系统中,串口通信具有很大的作用,可以将一些调试信息发往PC的串口等等。下面我们来做一个简单点的串口通信。
在linux系统中“一切皆文件“,串口也不例外,用来描述串口的文件在/dev目录下的ttyS0,ttyS1,ttyS2…等等。所以我们只需要使用标准的文件读写即可完成对串口的发送与接收数据。
在串口通信这里,我们主要介绍termios,在man手册中termios这样描述:

Many  of the functions described here have a termios_p argument
that isa pointer to a termios structure.  This structure contains
at least thefollowing members:

           tcflag_t c_iflag;      /* input modes */
           tcflag_t c_oflag;      /* output modes */
           tcflag_t c_cflag;      /* control modes */
           tcflag_t c_lflag;      /* local modes */
           cc_t     c_cc[NCCS];   /* special characters */

我们可以采用tcgetattrtcsetattr函数完成对termios的修改,这里termios的设置项较多,我们将在下面的代码示例中进行说明。另外波特率的指定需要采用单独的函数

/*其中参数为termios结构体指针与所需设置速率的宏*/

//获取输入速率
speed_t cfgetispeed(const struct termios *termios_p);

//获取输出速率
speed_t cfgetospeed(const struct termios *termios_p);

//设置输入速率
int cfsetispeed(struct termios *termios_p, speed_t speed);

//设置输出速率
int cfsetospeed(struct termios *termios_p, speed_t speed);

其中系统中关于波特率的宏如下,B后面的数字表示对应的波特率的大小。

            B0
            B50
            B75
            B110
            B134
            B150
            B200
            B300
            B600
            B1200
            B1800
            B2400
            B4800
            B9600
            B19200
            B38400
            B57600
            B115200
            B230400

下面我们以一个最简单的串口通信来具体说明。

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <termios.h>

#define MAX_SIZE 256

void init_series(int fd)
{
    //声明结构体
    struct termios t ;

    //取出默认参数
    tcgetattr( fd , &t) ;

    //CSIZE默认位8位,这里先清除该位
    t.c_cflag &=~CSIZE ;

    //1位停止位,默认2位停止位
    t.c_cflag &=~CSTOPB;

    //使能接收
    t.c_cflag |= CREAD ;

    //忽略调制解调器线路状态
    t.c_cflag |= CLOCAL ;

    //关闭RTS(Request To Send 请求发送)/CTS(clear to send 允许发送)流控制
    t.c_cflag &= ~CRTSCTS;

    //8位数据位
    t.c_cflag |= CS8;

    /*
    另外还有
    PARENB         使用奇偶校验
    PARODD         对输入使用奇偶校验,对输出使用偶校验
    */

    //设置输入输出波特率
    cfsetispeed( &t , B9600);
    cfsetospeed( &t , B9600);

    //刷新缓存
    tcflush( fd , TCIOFLUSH);

    //设置的值立即生效
    //TCSANOW:  不等数据传输完毕就立即改变属性。
   //TCSADRAIN:等待所有数据传输结束才改变属性。
   //TCSAFLUSH:清空输入输出缓冲区才改变属性。
    tcsetattr( fd , TCSANOW ,&t);
}

int main(void)
{
    int fd ;
    int count ;

    //发送缓存
    char buff_send[] = "this is a test\n";      

    //接收缓存
    char buff_recv[MAX_SIZE];   

    //打开串口,这里要注意 权限
    fd = open("/dev/ttyS1" , O_RDWR  | O_NOCTTY );

    if( fd<0)
    {
        printf("open series error\n");
        return 0 ;
    }

    //初始化串口
    init_series(fd);

    //发送数据
    /* fd:串口文件描述符
     * buff_send:发送数据缓存
     * 发送数据大小
     */
    write( fd , buff_send , sizeof(buff_send));

    printf("recv:\n");
    do
    {
        //接收数据
        /*
         *fd:串口文件描述符
         *buff_recv:接收缓存
         *最大接收数据大小
         */
        count = read(fd , buff_recv , MAX_SIZE -1);
        buff_recv[count] = '\0';
        printf("%s" , buff_recv);
    }while(count > 0);

    //关闭文件描述符
    close(fd);

    return 0 ;
}

转载请注明出处:http://blog.csdn.net/u013780605/article/details/52937295

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值