Linux下C语言串口应用编程
在编写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语言串口应用编程相关推荐
- Linux下C语言串口应用编程,Linux下串口C语言编程
Linux下串口C语言编程 (5页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 串口操作代码#include #include #inclu ...
- 以下是UNIX linux 下c语言的图形编程 curses库
UNIX下c语言的图形编程--curses.h 函式库 作者:不详 来源:supcode.com收集整理 发布时间:2005-7-22 19:39:36 减小字体 增大字体 相信您在网路上一定用过 ...
- Linux下c语言的图形编程(转) curses.h 函式库
这是转贴哈,最近想吧TC的图形编程搞到LINUX下面来,所以就对其有所研究了哦. http://tech.techweb.com.cn/viewthread.php?tid=181892 注明了转载, ...
- linux下C语言socket网络编程简例
转自博文:http://blog.csdn.net/kikilizhm/article/details/7858405 在练习写网络编程时,该例给了我帮助,在写服务器时,我把while逻辑位置想法错了 ...
- Linux下c语言的图形编程
简介 GTK+(GIMP TOOLKIT),是一个跨平台的图形界面(GUI)开发工具,是目前LINUX操作系统中较常用的图形界面开发工具之一,它采用一种非常有特色的面向对象的C语言开发框架(C Fra ...
- linux系统编程布局,Linux下c语言的图形编程
GTK+(GIMP TOOLKIT),是一个跨平台的图形界面(GUI)开发工具,是目前LINUX操作系统中较常用的图形界面开发工具之一,它采用一种非常有特色的面向对象的C语言开发框架(C Framew ...
- Linux下c语言串口调试助手,World Hello
调试是每个程序员都会面临的问题. 如何提高程序员的调试效率, 更好更快地定位程序中的问题从而加快程序开发的进度, 是大家共同面对的问题. 可能Windows用户顺口就会说出:用VC呗 :-) , 它提 ...
- Linux下C语言进程通讯编程
代码: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <sys/shm.h> 4 /********* ...
- linux c语言工具,Linux下C语言编程环境的工具.doc
Linux下C语言编程环境的工具 Linux下C语言编程环境的工具 Linux下C语言编程环境的工具 要想在Linux下进行C语言编程,首先得搭建好一个编程环境.这里分别说明一下几个非常有用的软件包. ...
最新文章
- 反季大清仓,最低仅需34.9元
- PSS:简单有效的End-to-End检测
- linux C非阻塞延时,linux 非阻塞式socket编程求助。。
- Open Neural Network Exchange(ONNX)概述
- GitHub移动App上线:四大特性,手机端无缝完成git任务
- 世博展示生态化住宅 物联网助推智能化家居
- 车品觉 | 大数据的价值:找到别人的“集体智慧”
- 【计算机网络】分层结构
- 一个很好用的DBHelper类(包括使用SQL语句 存储过程 事务 做相关操作) 入门级
- rtsp简介(ZT)之消息流程-转
- 在Array原型链上扩展remove,contain等方法所遇到的坑
- 串口485接法图_RS485接线的正确原理图
- fiddler抓不到pc微信小程序包解决办法
- 计算机的多媒体信息,多媒体信息
- ESP32学习10:TcpClient
- 平均绝对值误差(L1_Loss)和 均方误差(L2_Loss)
- 计算机组成存储单元地址分配,主存中存储单元地址的分配
- 利用filezilla下载文件,出现无法启动传输和严重文件错误
- 极坐标系及其他常用坐标系的表示方法
- 度盘搜失效?这款网盘搜索神器万万别错过!