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

1、打开串口设备

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

3、写数据

4、读出数据

5、关闭串口。

在编写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、打开串口

int fd;
fd = open("/dev/ttyS0", O_RDWR|O_NOCTTY);
if(fd<0){
perror(“open uart device error\n”);
}

2、关闭串口
close(fd);

fd为文件描述符。

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

波特率:9600

数据位:8

校验位:n(表示无)

停止位:1

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

3、读、写串口

使用read,write函数即可,例如:
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;
}

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

完整例程:

#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 结构体

struct termio
{
unsigned short c_iflag; /* 输入模式标志 /
unsigned short c_oflag; /
输出模式标志 /
unsigned short c_cflag; /
控制模式标志*/
unsigned short c_lflag; /* local mode flags /
unsigned char c_line; /
line discipline /
unsigned char c_cc[NCC]; /
control characters */
};

1、设置串口波特率

struct termios opt;

if (tcgetattr(fd, &opt)< 0) {

return ERROR;

}

cfsetispeed(&opt, B9600); /设置为9600bps/

cfsetospeed(&opt, B9600);

if (tcsetattr(fd, TCSANOW, &opt)<0) {

return ERROR;

}

或者按以下用法:

struct termios opt;

tcgetattr(fd, &opt);
cfsetispeed(&opt,B19200); /设置为19200bps/
cfsetospeed(&opt,B19200);
tcsetattr(fd,TCANOW,&opt);

一般来说,输入、输出的波特率应该是一致的。

2、设置数据位

设置数据位不需要专用的函数,只需要在设置数据位之前用数据位屏蔽标志(CSIZE)把对应数据位清零,然后再设置新的数据位即可,如下所示:

options.c_cflag &= ~CSIZE;/* 先把数据位清零*/

options.c_cflag |= CS8;/* 把数据位设置为8位*/

3、设置校验位

正如设置数据位一样,设置奇偶校验是在直接在cflag成员上设置。下面是各种类型的校验设置方法。

1)无奇偶校验(8N1):

options.c_cflag &= ~PARENB;

options.c_cflag &= ~CSTOPB;

options.c_cflag &= ~CSIZE;

options.c_cflag |= CS8;

2)7位数据位奇偶校验(7E1):

options.c_cflag |= PARENB;

options.c_cflag &= ~PARODD;

options.c_cflag &= ~CSTOPB;

options.c_cflag &= ~CSIZE;

options.c_cflag |= CS7;

3)奇校验(7O1):

options.c_cflag|= PARENB;

options.c_cflag |= PARODD;

options.c_cflag &= ~CSTOPB;

options.c_cflag &= ~CSIZE;

options.c_cflag |= CS7;

4、设置停止位

通过激活c_cflag中的CSTOPB而实现的。若停止位为1,则清除CSTOPB,若停止位为0,则激活CSTOPB。下面是停止位为1时的代码(CSTOPB表示2个停止位(清除该标志表示1个停止位):

options.c_cflag &= ~CSTOPB;

Linux下c编程设置串口属性和读写串口操作说明总结相关推荐

  1. linux下网络编程设置非阻塞,UNIX网络编程 非阻塞connect的实现

    一.<UNIX网络编程>-非阻塞connect 在一个TCP套接口被设置为非阻塞之后调用connect,connect会立即返回EINPROGRESS错误,表示连接操作正在进行中,但是仍未 ...

  2. Linux下libxml2编程基础

    Linux下libxml2编程基础 一.libxml2的简介 xml是一个实现读.创建.以及操作xml数据功能的C语言库.并且支持XPATH查询,以及部分的支持XSLT转换等的功能. libxml2的 ...

  3. 华为关于LINUX的认证,华为认证:华为TA128在LINUX下的简单设置

    华为认证:华为TA128在LINUX下的简单设置 华为认证:华为TA128在LINUX下的简单设置,来看看吧. 现以LINUX RH7为例说明TA128在LINUX下的使用方法. 启动您的X,如果还没 ...

  4. Linux下thread编程

    From: http://blog.sina.com.cn/s/blog_602f87700100dqmk.html Linux下thread编程(一) Sam前些天在提供一个库给别的公司时,因为不喜 ...

  5. linux v4l2 反操作,Linux下V4L2编程小结--吴老师

    作者:武汉华嵌-嵌入式培训中心  吴老师 Linux下V4L2编程小结 一.设置采集方式,格式 常用命令标志 打开视频设备后,可以设置该视频设备的属性,例如裁剪.缩放等.这一步是可选的.在Linux编 ...

  6. Linux下Socket编程

    Linux下Socket编程    网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符.Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的S ...

  7. Linux下高性能网络编程中的几个TCP/IP选项

    Linux下高性能网络编程中的几个TCP/IP选项 转自:http://blog.chinaunix.net/u/12592/showart.php?id=2064847 最近在新的平台上测试程序,以 ...

  8. [zz]Linux 下 socket 编程示例

    本示例为 Client/Server 结构,通过代码演示 Client 如何建立连接,并向远程端发送数据:Server 端如何侦听系统连接请求,接收请求并建立连接,进而获取客户端发来的数据.代码虽短, ...

  9. Linux下网络编程

    Linux下网络编程初步 Linux以其源代码公开闻名于世,并以其稳定性和可靠性雄霸操作系统领域,在网络应用技术方面使用得更加广泛.很久以来它就是Windows的重要对手之一.随着网络时代的来临,Li ...

  10. linux下 C编程改变输出字体颜色

    linux下 C编程改变输出字体颜色 分类: Linux基础编程 Linux操作系统 2012-09-19 10:53 1409人阅读 评论(0) 收藏 举报 linux编程c 格式: echo &q ...

最新文章

  1. oracle 9i 安装及连接远程数据库
  2. Gartner:2012年大数据HypeCycle
  3. android+studio入门指南+pdf,android+studio使用指南v0.1.pdf
  4. 中年职场危机,这是我看过最靠谱的建议
  5. 软键盘挡住EditText
  6. 由“深”至“广”,探索2022音视频技术的无限可能
  7. oracle Blob保存方式,关于文件保存到Oracle中BLOB字段的方法及例子
  8. 智慧林业整体解决方案_智慧农贸市场整体解决方案——前期调研篇
  9. dev 域名与 Chrome
  10. java io装饰类,Java IO 装饰类新说
  11. Java集合——TreeMap源码详解
  12. 雷军:程序员如何成功创业?
  13. javassist组件分享利用javassist动态创建一个类
  14. 网管第一课——网络组建与管理 目录
  15. bmp 图片格式读入 cv::Mat 的 C++ 实现
  16. 使用stylebook制作精美界面的方法(firemonkey)
  17. 河北化工医药职业技术学院学计算机怎么样,河北化工医药职业技术学院宿舍条件怎么样 男生女生宿舍图片...
  18. php strpos ctf,CTF php代码审计 strpos()函数漏洞 XXE漏洞xinclude()
  19. Macbook查看隐藏文件
  20. 链接元宇宙,开启新纪元

热门文章

  1. Ubantu16.04LTS麒麟版:取消登录界面的客人回话
  2. ASP.NET - 一般处理程序获取session值
  3. WINDOWS 2008的trustedinstallerexe占用过多CPU导致服务器性能下降的问题处理
  4. win7 桌面背景保存位置,告诉你源文件删除后如何找回
  5. 多个线程同时写入一个文件问题------php
  6. [转]上海五年的奋斗历程 从月薪3500到700万(感人!催人振奋!)
  7. 终于 知道为什么datagrid有时候翻页要双击了...
  8. 一起瞅一下那些经典案例是如何产业落地的~
  9. 原来神经网络是一种图?
  10. Window10上使用Git与Github远程仓库互连