具体解释linux下的串口通讯开发
串行口是计算机一种经常使用的接口,具有连接线少。通讯简单,得到广泛的使用。经常使用的串口是RS-232-C接口(又称EIA
RS-232-C)它是在1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。串口通讯指的是计算机依次以位(bit)为单位来传送数据。串行通讯使用的范围非常广。在嵌入式系统开发过程中串口通讯也经经常使用到通讯方式之中的一个。
Linux对全部设备的訪问是通过设备文件来进行的,串口也是这样,为了訪问串口。仅仅需打开其设备文件就可以操作串口设备。在linux系统以下,每个串口设备都有设备文件与其关联,设备文件位于系统的/dev文件夹以下。如linux下的/ttyS0,/ttyS1分别表示的是串口1和串口2。
以下来具体介绍linux下是怎样使用串口的:
1. 串口操作须要用到的头文件

1 #include <stdio.h> /*标准输入输出定义*/
2
3 #include <stdlib.h> /*标准函数库定义*/
4
5 #include <unistd.h> /*Unix 标准函数定义*/
6
7 #include <sys/types.h>
8
9 #include <sys/stat.h>
10
11 #include <fcntl.h> /*文件控制定义*/
12
13 #include <termios.h> /*POSIX 终端控制定义*/
14
15 #include <errno.h> /*错误号定义*/
16
17 #include <string.h> /*字符串功能函数*/
18

2. 串口通讯波特率设置
波特率的设置定义在<asm/termbits.h>,其包括在头文件<termios.h>里。
经常使用的波特率常数例如以下:
B0-------à0
B1800-------à1800
B50-----à50
B2400------à2400
B75-----à75
B4800------à4800
B110----à110 B9600------à9600
B134----à134.5 B19200-----à19200
B200----à200 B38400------à38400
B300----à300 B57600------à57600
B600----à600 B76800------à76800
B1200---à1200 B115200-----à115200
假定程序中想要设置通讯的波特率,使用cfsetispeed( )和cfsetospeed(
)函数来操作,获取波特率信息是通过cfgetispeed()和cfgetospeed()函数来完毕的。比方能够这样来指定串口通讯的波特率:

1 #include <stdio.h> //头文件定义
2
3 
..
4
5 struct termios opt; /*定义指向termios 结构类型的指针opt*/
6
7 /***************下面设置通讯波特率****************/
8
9 cfsetispeed(&opt,B9600 ); /*指定输入波特率。9600bps*/
10
11 cfsetospeed(&opt。B9600);/*指定输出波特率,9600bps*/
12
13 /************************************************/
14
15 


16
17

一般来说。输入、输出的波特率应该是一致的。
3. 串口属性配置
在程序中,非常easy配置串口的属性。这些属性定义在结构体struct termios中。为在程序中使用该结构体,须要包括文件<termbits.h>。该头文件定义了结构体struct
termios。
该结构体定义例如以下:

1 #define NCCS 19
2
3 struct termios {
4
5 tcflag_t c_iflag; /* 输入參数 */
6
7 tcflag_t c_oflag; /* 输出參数 */
8
9 tcflag_t c_cflag; /* 控制參数*/
10
11 tcflag_t c_ispeed; /* 输入波特率 */
12
13 tcflag_t c_ospeed; /* 输出波特率 */
14
15 cc_t c_line; /* 线控制 */
16
17 cc_t c_cc[NCCS]; /* 控制字符*/
18
19 };
20

当中成员c_line在POSIX(Portable Operating
System Interface for UNIX)系统中不使用。对于支持POSIX终端接口的系统中。对于port属性的设置和获取要用到两个重要的函数是:
(1).int
tcsetattr(int fd。int opt_DE,*ptr)
该函数用来设置终端控制属性,其參数说明例如以下:
l fd:待操作的文件描写叙述符
l opt_DE:选项值。有三个选项以供选择:
TCSANOW: 不等传输数据完成就马上改变属性
TCSADRAIN:等待全部传输数据结束才改变属性
TCSAFLUSH:清空输入输出缓冲区才改变属性
l *ptr:指向termios结构的指针
函数返回值:成功返回0,失败返回-1。
(2).int tcgetattr(int
fd。*ptr)
该函数用来获取终端控制属性,它把串口的默认设置赋给了termios数据数据结构。其參数说明例如以下:
l fd:待操作的文件描写叙述符
l *ptr:指向termios结构的指针
函数返回值:成功返回0。失败返回-1。
4. 打开串口
在前面已经提到linux下的串口訪问是以设备文件形式进行的。所以打开串口也即是打开文件的操作。函数原型能够例如以下所看到的:
int open(“DE_name”。int
open_Status)
參数说明:
(1).DE_name:要打开的设备文件名称
比方要打开串口1。即为/dev/ttyS0。
(2).open_Status:文件打开方式。可採用以下的文件打开模式:
l O_RDONLY:以仅仅读方式打开文件
l O_WRONLY:以仅仅写方式打开文件
l O_RDWR:以读写方式打开文件
l O_APPEND:写入数据时加入到文件末尾
l O_CREATE:假设文件不存在则产生该文件。使用该标志须要设置訪问权限位mode_t
l O_EXCL:指定该标志,而且指定了O_CREATE标志,假设打开的文件存在则会产生一个错误
l O_TRUNC:假设文件存在而且成功以写或者仅仅写方式打开。则清除文件全部内容,使得文件长度变为0
l O_NOCTTY:假设打开的是一个终端设备,这个程序不会成为相应这个port的控制终端。假设没有该标志,不论什么一个输入,比如键盘中止信号等,都将影响进程。
l O_NONBLOCK:该标志与早期使用的O_NDELAY标志作用差点儿相同。程序不关心DCD信号线的状态。假设指定该标志,进程将一直在休眠状态,直到DCD信号线为0。
函数返回值:
成功返回文件描写叙述符,假设失败返回-1
比如假定以可读写方式打开/dev/ttyS0设备,就能够这样操作:

1 #include<stdio.h> //头文件包括
2
3 

4
5 int fd; /* 文件描写叙述符 */
6
7 fd = open("/dev/ttyS0", O_RDWR | 0_NOCTTY)。 /*以读写方式打开设备*/
8
9 if(fd == -1)
10
11 perror("Can not open Serial_Port 1"n。")。/*打开失败时的错误提示*/
12
13 
..
14
15

5. 串口读操作(接收端)
用open函数打开设备文件,函数返回一个文件描写叙述符(file
descriptors,fd),通过文件描写叙述符来訪问文件。读串口操作是通过read函数来完毕的。函数原型例如以下:
int read(int fd, *buffer,length)。
參数说明:
(1).int fd:文件描写叙述符
(2).*buffer:数据缓冲区
(3).length:要读取的字节数
函数返回值:
读操作成功读取返回读取的字节数,失败则返回-1。
6. 串口写操作(发送端)
写串口操作是通过write函数来完毕的。
函数原型例如以下:
write(int fd, *buffer,length);
參数说明:
(1).fd:文件描写叙述符
(2).*buffer:存储写入数据的数据缓冲区
(3).length:写入缓冲去的数据字节数
函数返回值:
成功返回写入数据的字节数,该值通常等于length,假设写入失败返回-1。
比如:向终端设备发送初始化命令

1 #include<stdio.h> //头文件包括
2 

3
4 int n
5
6 sbuf[]={Hello。this is a Serial_Port test!"n };//待发送数据
7
8 int len_send="sizeof"(sbuf);//发送缓冲区字节数定义
9
10 n = write(fd,sbuf,len_send); //写缓冲区
11
12 if(n == -1)
13
14 {
15
16 printf("Wirte sbuf error."n");
17
18 }
19 


7. 关闭串口
对设备文件的操作与对普通文件的操作一样,打开操作之后还须要关闭,关闭串口用函数close( )来操作,函数原型为:
int close(int fd);
參数说明:
fd:文件描写叙述符
函数返回值:
成功返回0。失败返回-1。
具体解释linux下的串口通讯开发的更多相关文章
- 详解linux下的串口通讯开发
串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用.常用的串口是RS-232-C接口(又称EIA RS-232-C)它是在1970年由美国电子工业协会(EIA)联合贝尔系统.调制解调 ...
- 【转载】详解linux下的串口通讯开发
来源:https://www.cnblogs.com/sunyubo/archive/2010/09/26/2282116.html 串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使 ...
- 关于嵌入式linux下的串口通讯问题---需增加回车/换行才能接收
问题:在Linux应用层,直接从/dev/tty***使用read()函数读数据,无法读到,只有在数据末尾加上0a/0d才可以读到数据(这里是发送十六进制的数据,ASCLL码同理,增加回车才可以读到数 ...
- Linux学习心得之 Linux下命令行Android开发环境的搭建
作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Linux学习心得之 Linux下命令行Android开发环境的搭建 1. 前言2. Jav ...
- linux下查看串口信息
rs232串口通信接口:当通信距离较近时(<12m),可以使用电缆线直接连接,若距离较远,需附加调制解调器. 9个脚针的定义: CDC数据载波检测,RXD接收数据,TXD发送数据,DTR数据中断 ...
- Ubuntu Linux下如何配置Android开发环境
下载和安装Win7系统Android开发环境中讲了怎样在Win7系统中安装Android开发环境,那么怎样在Linux系统中配置Android开发环境呢?本篇文章就将演示如何使用Eclipse.And ...
- Linux下快速搭建php开发环境
php开发环境快速搭建 一.Linux下快速搭建php开发环境 1.安装XAMPP for Linux XAMPP(Apache+MySQL+PHP+PERL)是一个功能强大的建站集成软件包,使用XA ...
- Linux下的串口调试工具——Xgcom
Linux下的串口调试工具——Xgcom xgcom的下载网址:https://code.google.com/archive/p/xgcom/downloads (1)安装必须的库 apt-get ...
- WinCE下的串口通信开发(VS2005,VB.Net,VC++)
WinCE下的串口通信开发(VS2005,VB.Net,VC++) WinCE下的串口通信开发 一.利用Visual Basic 开发很简单,因为有现成的控件可以直接调用 以VS2005为例,首先 ...
随机推荐
- [网络]Linux一些网络知识
今天刚搬到新家,ubuntu一启动,无线网络又连不上了,之前就是大费周折才搞好的,于是又花了两小时才搞好. 下面就先来了解一些基础知识: 1. ifconfig输出的eth0/lo/wlan0分别代表 ...
- js学习笔记23----窗口尺寸及窗口事件
窗口尺寸: 可视区的尺寸 document.documentElement.clientWidth document.documentElement.clientHeight 滚动距离 documen ...
- pip下载默认绕过代理
centos7下使用pip7.1.0安装软件,在shell下设置了全局http_proxy和https_proxy,但是每次都遇到网络超时问题, 后来使用pip install xxx --proxy ...
- 【转】虚拟串口VSPM解决串口编程问题
通过串口调试软件 UartAssist.exe 和虚拟串口软件 VSPM,可以解决串口编程时没用硬件调试的问题,通过VSPM虚拟出串口设备,让程序发送信息到 VSPM 设备后通过 UartAssist ...
- hdu 2025:查找最大元素(水题,顺序查找)
查找最大元素 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- web.xml 中 classpath 写法说明
简单理解,classpath就是代表 /WEB-INF /classes/ 这个路径(如果不理解该路径,就把一个web工程发布为war包,然后用winrar查看其包内路径就理解啦) 常用的场景: ...
- iOS开发之--最简单的导航按钮更换方法/导航颜色的改变
有很多时候,我们需要用到导航,那么更换导航的时候,是在那用那修改,还是自定义一个导航,或者是声明一个代理方法,经过查资料和对导航属性的一些了解,用一种方法最为简单,就是在入口类里面添加一个方法,调用偏 ...
- iOS Web开发
1.让web页面的输入框是数字键盘 html 中 input 的 type = "tel"
- mciSendCommand 音频视频播放命令函数
//打开设备 //typedef struct { //DWORD dwCallback; //指定一个窗口句柄 //MCIDEVICEID wDeviceID; //为成功打开的文 ...
- 【BZOJ2792】[Poi2012]Well 二分+双指针法
[BZOJ2792][Poi2012]Well Description 给出n个正整数X1,X2,...Xn,可以进行不超过m次操作,每次操作选择一个非零的Xi,并将它减一. 最终要求存在某个k满足X ...