串行口是计算机一种经常使用的接口,具有连接线少。通讯简单,得到广泛的使用。经常使用的串口是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下的串口通讯开发的更多相关文章

  1. 详解linux下的串口通讯开发

    串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用.常用的串口是RS-232-C接口(又称EIA RS-232-C)它是在1970年由美国电子工业协会(EIA)联合贝尔系统.调制解调 ...

  2. 【转载】详解linux下的串口通讯开发

    来源:https://www.cnblogs.com/sunyubo/archive/2010/09/26/2282116.html 串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使 ...

  3. 关于嵌入式linux下的串口通讯问题---需增加回车/换行才能接收

    问题:在Linux应用层,直接从/dev/tty***使用read()函数读数据,无法读到,只有在数据末尾加上0a/0d才可以读到数据(这里是发送十六进制的数据,ASCLL码同理,增加回车才可以读到数 ...

  4. Linux学习心得之 Linux下命令行Android开发环境的搭建

    作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Linux学习心得之 Linux下命令行Android开发环境的搭建 1. 前言2. Jav ...

  5. linux下查看串口信息

    rs232串口通信接口:当通信距离较近时(<12m),可以使用电缆线直接连接,若距离较远,需附加调制解调器. 9个脚针的定义: CDC数据载波检测,RXD接收数据,TXD发送数据,DTR数据中断 ...

  6. Ubuntu Linux下如何配置Android开发环境

    下载和安装Win7系统Android开发环境中讲了怎样在Win7系统中安装Android开发环境,那么怎样在Linux系统中配置Android开发环境呢?本篇文章就将演示如何使用Eclipse.And ...

  7. Linux下快速搭建php开发环境

    php开发环境快速搭建 一.Linux下快速搭建php开发环境 1.安装XAMPP for Linux XAMPP(Apache+MySQL+PHP+PERL)是一个功能强大的建站集成软件包,使用XA ...

  8. Linux下的串口调试工具——Xgcom

    Linux下的串口调试工具——Xgcom xgcom的下载网址:https://code.google.com/archive/p/xgcom/downloads (1)安装必须的库 apt-get ...

  9. WinCE下的串口通信开发(VS2005,VB.Net,VC++)

    WinCE下的串口通信开发(VS2005,VB.Net,VC++)   WinCE下的串口通信开发 一.利用Visual Basic 开发很简单,因为有现成的控件可以直接调用 以VS2005为例,首先 ...

随机推荐

  1. mr中间结果优化

    转载请注明出处:http://blog.csdn.net/lastsweetop/article/details/9187721 作为输入 当压缩文件做为mapreduce的输入时,mapreduce ...

  2. 扩展RBAC用户角色权限设计方案<转>

    RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色- ...

  3. css实现圆角三角形例子(无图片)

    css实现圆角三角形例子(无图片) 以前我们做圆角时都会要用到图片来实现,今天我给大家整理的这款css圆角效果是不需要图片的纯css实现的哦,下面我们一起来看看吧. 效果如下图所示 三角形所对方向&q ...

  4. VMware ESXi 启动时提示引导错误:不是VMware引导槽。找不到管理程序(bank6 not a vmware boot bank no hypervisor found)

    VMware ESXi 启动时提示引导错误: bank6 not a vmware boot bank no hypervisor found 大概中文意思是:不是VMware引导槽.找不到管理程序. ...

  5. ORDER BY 语句用于对结果集进行排序。

    ORDER BY 语句 ORDER BY 语句用于根据指定的列对结果集进行排序. ORDER BY 语句默认按照升序对记录进行排序. 如果您希望按照降序对记录进行排序,可以使用 DESC 关键字.

  6. MFC显示bmp图像

    有了bmp文件读写的基础,我们就能够開始用MFC显示BMP图片了. 在这里,事实上微软为我们提供了一个实现bmp文件显示的框架,名叫diblook,我们能够先下载下来看看. 以下上链接:DIBLOOK ...

  7. [深入理解Android卷一全文-第八章]深入理解Surface系统

    由于<深入理解Android 卷一>和<深入理解Android卷二>不再出版.而知识的传播不应该由于纸质媒介的问题而中断,所以我将在CSDN博客中全文转发这两本书的全部内容. ...

  8. Sublime Text2.0.2注冊码

    // Sublime Text 3 License Keys // Sublime Text 2.x -– BEGIN LICENSE -– Andrew Weber Single User Lice ...

  9. Python学习笔记6-字典Dict

    Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度. >>> person ...

  10. 《C++ Primer Plus》学习笔记 2.1.1 main()函数

    main()函数的基本结构如下: int main() { statements ; } 这几行代码构成了函数定义(function definition),该定义由两部分组成: 第一行int mai ...