在编写Linux串口的C程序之前,需要包含以下头文件:

#include <termios.h>

在Linux系统中,一切皆文件,所以串口设备也是一类文件,学习过Linux驱动程序的学员都知道,Linux有三类设备:字符设备,块设备,网络设备。那么串口设备属于字符设备。所以串口设备的命名一般为/dev/ttySn(n = 0、1、2......),如果该串口为USB转串口,可能名称为/dev/ttyUSBn(n = 0、1、2......),不同的平台下串口的名称是不同的,且串口的名称也是可以更改的。如何更改?在板卡对应的Linux驱动中更改。

在Linux下操作串口,那么也就是跟操作一个文件一样,既然是文件,也就可以使用标准的文件操作API来操作。

1、打开串口

2、关闭串口

fd为文件描述符。

如果不设置串口的波特率,数据位,停止位,校验位的情况下,Linux下默认设置的属性值为:

波特率:9600

数据位:8

校验位:n(表示无)

停止位:1

在不设置串口属性值的情况下,也可以读写串口值。

3、读写串口

使用read,write函数即可,例如:

以上例程展现的是往串口写入一个数据,串口就会回复一个数据,也就是自发自收。

完整例程:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <asm/termios.h>#define DEV_NAME  "/dev/ttyS1"int main (int argc, char *argv[])
{int fd;int len, i,ret;char buf[] = "hello ZLG!";fd = open(DEV_NAME, O_RDWR | O_NOCTTY);if(fd < 0) {perror(DEV_NAME);return -1;}len = write(fd, buf, sizeof(buf));if (len < 0) {printf("write data error \n");}len = read(fd, buf, sizeof(buf));if (len < 0) {printf("read error \n");return -1;}printf("%s", buf);return(0);
}

上面给出的例程是串口驱动的默认属性值(9600,8n1,无流控),在实际产品开发过程中,还是会根据不同的应用场景来设置串口的属性。操作串口属性需要设置对应的标志,在POSIX终端已经帮我们实现了若干结构体以及相应的标志位,我们只要熟练使用它即可,非常简单。

最重要的struct termios结构体:

1、设置串口波特率

.

例程:

static void set_baudrate (struct termios *opt, unsigned int baudrate)
{cfsetispeed(opt, baudrate);cfsetospeed(opt, baudrate);
}

2、设置数据位

数据位指的是每字节中实际数据所占的比特数。要修改数据位可以通过修改termios结构体中c_cflag成员来实现。CS5、CS6、CS7和CS8分别表示数据位为5、6、7和8。值得注意的是,在设置数据位时,必须先使用CSIZE做位屏蔽。

例程:

static void set_data_bit (struct termios *opt, unsigned int databit)
{opt->c_cflag &= ~CSIZE;switch (databit) {case 8:opt->c_cflag |= CS8;break;case 7:opt->c_cflag |= CS7;break;case 6:opt->c_cflag |= CS6;break;case 5:opt->c_cflag |= CS5;break;default:opt->c_cflag |= CS8;break;}
}

3、设置校验位

奇偶校验可以选择偶校验、奇校验、空格等方式,也可以不使用校验。如果要设置为偶校验的话,首先要将termios结构体中c_cflag设置PARENB标志,并清除PARODD标志。如果要设置奇校验,要同时设置termios结构体中c_cflag设置PARENB标志和PARODD标志。如果不想使用任何校验的话,清除termios结构体中c_cflag的PARENB位。表6.12所示为设置奇偶校验的具体方法。

例程:

static void set_parity (struct termios *opt, char parity)
{switch (parity) {case 'N':                  /* no parity check */opt->c_cflag &= ~PARENB;break;case 'E':                  /* even */opt->c_cflag |= PARENB;opt->c_cflag &= ~PARODD;break;case 'O':                  /* odd */opt->c_cflag |= PARENB;opt->c_cflag |= ~PARODD;break;default:                   /* no parity check */opt->c_cflag &= ~PARENB;break;}
}

4、设置停止位

设置串口停止位是在 termios 对象的 c_cflag 成员上设置,需要用到的选项标志为

CSTOPB(2 位停止位,否则为 1 位)。

例程:

static void set_stopbit (struct termios *opt, const char *stopbit)
{if (0 == strcmp (stopbit, "1")) {opt->c_cflag &= ~CSTOPB; /* 1 stop bit */}    else if (0 == strcmp (stopbit, "1")) {opt->c_cflag &= ~CSTOPB; /* 1.5 stop bit */}   else if (0 == strcmp (stopbit, "2")) {opt->c_cflag |= CSTOPB;  /* 2 stop bits */} else {opt->c_cflag &= ~CSTOPB; /* 1 stop bit */}
}

于是我们就可以将串口这三样基本的设置写成一个函数,以后用的时候就调用它即可。

//串口设置
int  Serial_Handle::set_port_attr (int fd,int  baudrate,          // B1200 B2400 B4800 B9600 .. B115200int  databit,           // 5, 6, 7, 8const char *stopbit,    //  "1", "1.5", "2"char parity,            // N(o), O(dd), E(ven)int vtime,int vmin )
{struct termios opt;tcgetattr(fd, &opt);//设置波特率set_baudrate(&opt, baudrate);opt.c_cflag          |= CLOCAL | CREAD;      /* | CRTSCTS *///设置数据位set_data_bit(&opt, databit);//设置校验位set_parity(&opt, parity);//设置停止位set_stopbit(&opt, stopbit);//其它设置opt.c_oflag          = 0;opt.c_lflag               |= 0;opt.c_oflag           &= ~OPOST;opt.c_cc[VTIME]       = vtime;opt.c_cc[VMIN]             = vmin;tcflush (fd, TCIFLUSH);return (tcsetattr (fd, TCSANOW, &opt));
}

以后在使用串口的时候即是要遵循以下的顺序才能使用。

1、打开串口设备

2、设置串口的波特率,数据位,校验位,停止位以及其它设置

3、写数据

4、读出数据

5、关闭串口

参考文献:

1、http://book.51cto.com/art/200711/59758.htm

2、周立功=====>【开发指南】M6G2C&A6G2C系列核心板软件开发指南_V1.05

Linux下C语言串口应用编程相关推荐

  1. Linux下C语言串口应用编程,Linux下串口C语言编程

    Linux下串口C语言编程 (5页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 串口操作代码#include #include #inclu ...

  2. 以下是UNIX linux 下c语言的图形编程  curses库

    UNIX下c语言的图形编程--curses.h 函式库 作者:不详  来源:supcode.com收集整理  发布时间:2005-7-22 19:39:36 减小字体 增大字体 相信您在网路上一定用过 ...

  3. Linux下c语言的图形编程(转) curses.h 函式库

    这是转贴哈,最近想吧TC的图形编程搞到LINUX下面来,所以就对其有所研究了哦. http://tech.techweb.com.cn/viewthread.php?tid=181892 注明了转载, ...

  4. linux下C语言socket网络编程简例

    转自博文:http://blog.csdn.net/kikilizhm/article/details/7858405 在练习写网络编程时,该例给了我帮助,在写服务器时,我把while逻辑位置想法错了 ...

  5. Linux下c语言的图形编程

    简介 GTK+(GIMP TOOLKIT),是一个跨平台的图形界面(GUI)开发工具,是目前LINUX操作系统中较常用的图形界面开发工具之一,它采用一种非常有特色的面向对象的C语言开发框架(C Fra ...

  6. linux系统编程布局,Linux下c语言的图形编程

    GTK+(GIMP TOOLKIT),是一个跨平台的图形界面(GUI)开发工具,是目前LINUX操作系统中较常用的图形界面开发工具之一,它采用一种非常有特色的面向对象的C语言开发框架(C Framew ...

  7. Linux下c语言串口调试助手,World Hello

    调试是每个程序员都会面临的问题. 如何提高程序员的调试效率, 更好更快地定位程序中的问题从而加快程序开发的进度, 是大家共同面对的问题. 可能Windows用户顺口就会说出:用VC呗 :-) , 它提 ...

  8. Linux下C语言进程通讯编程

    代码: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <sys/shm.h> 4 /********* ...

  9. linux c语言工具,Linux下C语言编程环境的工具.doc

    Linux下C语言编程环境的工具 Linux下C语言编程环境的工具 Linux下C语言编程环境的工具 要想在Linux下进行C语言编程,首先得搭建好一个编程环境.这里分别说明一下几个非常有用的软件包. ...

最新文章

  1. 反季大清仓,最低仅需34.9元
  2. PSS:简单有效的End-to-End检测
  3. linux C非阻塞延时,linux 非阻塞式socket编程求助。。
  4. Open Neural Network Exchange(ONNX)概述
  5. GitHub移动App上线:四大特性,手机端无缝完成git任务
  6. 世博展示生态化住宅 物联网助推智能化家居
  7. 车品觉 | 大数据的价值:找到别人的“集体智慧”
  8. 【计算机网络】分层结构
  9. 一个很好用的DBHelper类(包括使用SQL语句 存储过程 事务 做相关操作) 入门级
  10. rtsp简介(ZT)之消息流程-转
  11. 在Array原型链上扩展remove,contain等方法所遇到的坑
  12. 串口485接法图_RS485接线的正确原理图
  13. fiddler抓不到pc微信小程序包解决办法
  14. 计算机的多媒体信息,多媒体信息
  15. ESP32学习10:TcpClient
  16. 平均绝对值误差(L1_Loss)和 均方误差(L2_Loss)
  17. 计算机组成存储单元地址分配,主存中存储单元地址的分配
  18. 利用filezilla下载文件,出现无法启动传输和严重文件错误
  19. 极坐标系及其他常用坐标系的表示方法
  20. 度盘搜失效?这款网盘搜索神器万万别错过!

热门文章

  1. Verilog:【4】脉冲发生器(pulse_gen.sv)
  2. 了解视图dm_os_performance_counters的cntr_type含义
  3. 景深决定照相机什么特性_行政执法考试题库2017 2017摄影专业考试题库
  4. 版本控制----Git
  5. 信号系统一些基本概念
  6. HBUOJ--走台阶
  7. 学计算机会不会老年痴呆,久玩电脑会得老年痴呆吗
  8. JavaScript -- event handler
  9. 数据库--视图的基本概念以及作用
  10. Jmeter 分布式压测