详解linux下的串口通讯开发[转载]

Linux下串口收发通信 Linux下编程的过程有些固定,很多都是比如打开、配置、关闭等等 串口通信流程:打开串口ttySn--->初始化串口--->读写(read、write)--->关闭串口 最合适的指导书:https://www.ibm.com/developerworks/cn/linux/l-serials/ 串口设置 最基本的设置串口包括波特率设置,效验位和停止位设... 阅读详情

详解linux下的串口通讯开发[转载] 
串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用。常用的串口是RS-232-C接口(又称EIA RS-232-C)它是在1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。串口通讯指的是计算机依次以位(bit)为单位来传送数据,串行通讯使用的范围很广,在嵌入式系统开发过程中串口通讯也经常用到通讯方式之一。

Linux对所有设备的访问是通过设备文件来进行的,串口也是这样,为了访问串口,只需打开其设备文件即可操作串口设备。在linux系统下面,每一个串口设备都有设备文件与其关联,设备文件位于系统的/dev目录下面。如linux下的/ttyS0,/ttyS1分别表示的是串口1和串口2。下面来详细介绍linux下是如何使用串口的:

 

1.      串口操作需要用到的头文件

#include     <stdio.h>      /*标准输入输出定义*/

#include     <stdlib.h>     /*标准函数库定义*/

#include     <unistd.h>     /*Unix 标准函数定义*/

#include     <sys/types.h> 

#include     <sys/stat.h>  

#include     <fcntl.h>      /*文件控制定义*/

#include     <termios.h>    /*POSIX 终端控制定义*/

#include     <errno.h>      /*错误号定义*/

#include   <string.h>       /*字符串功能函数*/

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()函数来完成的。比如可以这样来指定串口通讯的波特率:

#include <stdio.h>    //头文件定义

........

........

.......

struct termios opt;           /*定义指向termios 结构类型的指针opt*/

 

/***************以下设置通讯波特率****************/

cfsetispeed(&opt,B9600 ); /*指定输入波特率,9600bps*/

cfsetospeed(&opt,B9600);/*指定输出波特率,9600bps*/

/************************************************/

.........

..........

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

3.      串口属性配置

在程序中,很容易配置串口的属性,这些属性定义在结构体struct termios中。为在程序中使用该结构体,需要包含文件<termbits.h>,该头文件定义了结构体struct termios。该结构体定义如下:

#define NCCS 19

struct termios {

             tcflag_t c_iflag;               /* 输入参数 */

             tcflag_t c_oflag;               /* 输出参数 */

             tcflag_t c_cflag;               /* 控制参数*/

             tcflag_t c_ispeed;              /* 输入波特率 */

tcflag_t c_ospeed;              /* 输出波特率 */

             cc_t c_line;                   /* 线控制 */

             cc_t c_cc[NCCS];              /* 控制字符*/

};

其中成员c_line在POSIX(Portable Operating System Interface for UNIX)系统中不使用。对于支持POSIX终端接口的系统中,对于端口属性的设置和获取要用到两个重要的函数是:

(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:如果打开的是一个终端设备,这个程序不会成为对应这个端口的控制终端,如果没有该标志,任何一个输入,例如键盘中止信号等,都将影响进程。

l          O_NONBLOCK:该标志与早期使用的O_NDELAY标志作用差不多。程序不关心DCD信号线的状态,如果指定该标志,进程将一直在休眠状态,直到DCD信号线为0。

函数返回值:

成功返回文件描述符,如果失败返回-1

例如假定以可读写方式打开/dev/ttyS0设备,就可以这样操作:

#include<stdio.h>    //头文件包含

......

......

int fd; /* 文件描述符 */

fd = open("/dev/ttyS0", O_RDWR | 0_NOCTTY);  /*以读写方式打开设备*/

if(fd == -1)

perror("Can not open Serial_Port 1/n!");/*打开失败时的错误提示*/

........

........

 

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。

例如:向终端设备发送初始化命令

#include<stdio.h>    //头文件包含

......

......

 

int n

sbuf[]={Hello,this is a Serial_Port test!/n };//待发送数据

int len_send="sizeof"(sbuf);//发送缓冲区字节数定义

n = write(fd,sbuf,len_send); //写缓冲区

if(n == -1)

{

printf("Wirte sbuf error./n");

}

......

......

7.      关闭串口

对设备文件的操作与对普通文件的操作一样,打开操作之后还需要关闭,关闭串口用函数close( )来操作,函数原型为:

int close(int fd);

参数说明:

fd:文件描述符

函数返回值:

成功返回0,失败返回-1。

在后面的文章我会提供一个串行通讯的测试程序,供大家参考!
 
 
 
 
 

linux arm-tiny-6410实现串口通讯 这次小编lucky_leaf要实现的是:用窗口 阅读详情

相关推荐

在RPi Linux上与.NET Core 3.0进行串行通信-项目开发

随着即将发布的.NET Core 3.0,跨平台的串行端口可用。 让我们尝试一下RPi Raspbian。

.Net Core 开发跨平台Linux下串口通讯

.Net Core 开发Linux下串口通讯 功能要求:向锁控板发送开锁命令。 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录.Net Core 开发Linux下串口通讯前言:你需要在你的Linux上安装对应的.net core版本,我安装的是3.1.16一、Linux下使用 “SerialPortStream”一系列准备工作1.NuGet加载包:2.生成Linux下该包调用的方法所依赖的OS文件。库的作者说明如下:2.1:我是直接去git上下载的ZIP文件(地址:[https

weixin_41432198的博客 3187

从零开始:H20服务器上DeepSeek R1 671B大模型部署与压力测试全攻略

最近,我有幸在工作中接触到了DeepSeek R1 671B模型,这是目前中文开源领域参数量最大的高质量模型之一。DeepSeek团队在2024年推出的这款模型,以其惊人的6710亿参数量和出色的推理性能,引起了业界广泛关注。作为一名AI基础设施工程师,我有机会在H20服务器上部署这个庞然大物,并对其进行了全面的压力测试。这篇文章将详细记录我的部署过程和性能测试方法,希望能为大家提供一些参考。💡为什么选择DeepSeek R1?超大规模参数量(671B)优秀的中英文理解能力开源可商用的许可证。

wangli的博客 1万+

.net core linux 串口,.Net Core跨平台应用研究-CustomSerialPort(增强型跨平台串口类库)...

.Net Core跨平台应用研究-CustomSerialPort-增强型跨平台串口类库摘要在使用SerialPort进行串口协议解析过程中,经常遇到接收单帧协议数据串口接收事件多次触发,协议解析麻烦的问题。针对此情况,基于开源跨平台串口类库SerialPortStrem进行了进一步封装,实现了一种接收超时响应事件机制,简化串口通讯的使用。引言最近,写了一篇博文《.net core跨平台应用研究-...

weixin_36463131的博客 810

SuperMap iObjects Java组件开发——环境部署(IntelliJ IDEA)

SuperMap iObjects Java 是面向GIS应用系统开发者的组件式GIS开发平台,具有强大的地理数据管理、编辑、显示、分析等功能,并且其具有极强的易用性和丰富的帮助资源,适宜快速开发大型GIS应用系统。本文将介绍如何在IntelliJ IDEA集成开发环境中进行SuperMap iObjects Java组件的环境部署。

nan620403的博客 1081

pentaho-kettle依赖拉取失败?试试这个Maven仓库配置的终极解决方案

本文详细解析了Pentaho Kettle依赖拉取失败的常见原因,并提供了三种Maven仓库配置方案,包括基础pom.xml配置、全局settings.xml设置以及企业级私有镜像仓库搭建。通过实战验证的方法和常见问题排查指南,帮助开发者彻底解决pentaho-kettle依赖问题,提升项目构建效率。

weixin_30275415的博客 202

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

来源:https://www.cnblogs.com/sunyubo/archive/2010/09/26/2282116.html 串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用。常用的串口是RS-232-C接口(又称EIA RS-232-C)它是在1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯...

anyi2474的博客 333

中科蓝讯蓝牙耳机SDK实战:从目录解析到消息处理框架

本文深入解析中科蓝讯蓝牙耳机SDK的目录结构与消息处理框架,提供从硬件驱动到蓝牙功能定制的实战指南。重点剖析SDK核心模块如消息队列机制、按键事件处理及电量报告优化,并分享二次开发中的调试技巧与避坑经验,助力开发者高效完成TWS耳机功能定制。

weixin_30335575的博客 387

详解linux下的串口通讯开发

声明:本文转载至:http://www.cnblogs.com/sunyubo/archive/2010/09/26/2282116.html 串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用。常用的串口是RS-232-C接口(又称EIA RS-232-C)它是在1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的

Striving 1764

《揭秘 BME688人工智能压力湿度温度气体传感器:气体检测的多面能手》:此文为AI自动生成

BME688 是博世推出的一款具有人工智能和集成高线性度高精度压力、湿度、温度传感器的气体传感器,专为移动和联网应用开发,尺寸紧凑且低功耗。BME688 作为一款先进的传感器,在多个领域展现出卓越的性能。它采用了坚固而紧凑的 3.0 x 3.0 x 0.9 mm³ 封装,这种小巧的尺寸使其能够轻松应用于对空间要求严格的移动设备和联网应用中。同时,低功耗的特性也使得它在能源有限的环境下能够长时间稳定运行。

zheng_ruiguo的专栏 1927

power bi 演唱会-佐罗

我是业务分析人员,注重使用性,因此,课程不到 30% 的内容就可以解决目前为止我碰到的所有业务问题,剩下的 70% 内容是帮助我提升,优化,升华,精益求精用的,比如第三方工具,比如代码运行速度优化,比如查询逻辑优化等等。系统性上来说,结构明晰,安排上非常有条理,层层递进;《BI 真经》,中有真经二字,略显夸大,而当我第一次证明了这点的时候,我也非常惊讶,这就是我做以下所有事情的一切动力。《BI 真经》综合考量思想性,系统性,本质性,创新性,通用性,技巧性,启发性,对比其他课程有压倒性的显著优势。

v_1090213742的博客 911

linux 测试串口命令,Linux 下测试串口的命令microcom

昨天应为要测试主板上的串口,查了一下,可以使用microcom 这条命令进行测试。命令使用方法很简单:Usage: microcom [-d DELAY] [-t TIMEOUT] [-s SPEED] [-X] TTY参数如下:-d 表示延时时间,一般我都不设置。-t 表示超时时间,超多少时间就自动退出。单位为ms-s 表示传输速度,波特率的意思,这个根据自己的情况而定。-X 不加最后指定你的串...

weixin_30750349的博客 2017

STM32F407+OV2640的DCMI+DMA双缓冲JPEG图像采集系统

在嵌入式视觉系统中,数字摄像头接口(DCMI)是MCU连接CMOS图像传感器的关键硬件通道,其与DMA协同实现零CPU干预的高速数据流采集;而JPEG作为一种基于DCT变换与量化压缩的有损图像格式,依赖传感器端硬件编码引擎才能满足实时性要求。理解DCMI三重同步时序(PCLK/HSYNC/VSYNC)与DMA双缓冲机制的流水线协作原理,是突破带宽瓶颈、避免FIFO溢出和帧丢失的技术基础。该架构广泛应用于智能硬件、工业检测与边缘AI前端等需低功耗、高可靠图像捕获的场景,本文以OV2640与STM32F407为

weixin_42103128的博客 156

树莓派中QT实现串口通讯

树莓派中QT实现串口通讯 开发平台为QT 此博客QT使用的为WiringPi驱动 我使用的串口调试助手为 cutecom 先简单说一些开发过程中需要注意的问题 Linux 下设备为 tty ,对应在 windows 下为 COM ttyS0 与 ttyUSB0 不是一个东西 raspi-config 中, serial 应该被打开, 但是 Serial Console 不应该被打开,除非你想要用...

weixin_30532759的博客 1329

VS Code 重大更新:Agent Skills完美支持!

代码不会骗人,但你的 LLM 可能会编个故事——除非你给它一本《技能手册》。——某位深夜调试成功的 Go 工程师。

weixin_44058951的博客 3459

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

linux 远程串口 sol,[转载]SOL 浅析

In order to use serial console you need to configure GRUB bootloader. Following instructions are tested on :[1] Cent OS 4/5[2] Redhat Enterprise Linux (RHEL) 3/4/5[3] Debian 3/4Step # 1: Serial redire...

weixin_39972768的博客 2574

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

浅谈linux下的串口通讯开发

转载自:https://www.jb51.net/article/101467.htm

modi000的博客 223

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

LINUX下(虚拟机中的LINUX系统)串口通讯 part3------fedora 9下USB转串口的应用和minicom的设置(转载)

原链接地址:http://hi.baidu.com/%D0%C4%B5%AD%C8%E7%D4%C2/blog/item/500b33b5fe4038798ad4b24f.html我的USB串口转换器使用的芯片是PL2303,可以在Linux终端输入lsusb命令查到设备信息# lsusb[root@localhost ~]#  lsusbBus 002 Device 001:

alexyangyuanchao2008的专栏 1480

Linux 串口编程入门

Linux 串口编程入门 转载  Linux操作系统从一开始就对串行口提供了很好的支持,本文就Linux下的串行口通讯编程进行简单的介绍。 串口简介  串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用。常用的串口是RS-232-C接口(又称EIA RS-232-C)它是在1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的

王世宏的专栏 324

串口通讯不正常

笔者在淘宝网淘的一块USB转串口模块,价格才几元人民币。看外观好像质量还不错,另外传输线缆还带屏蔽。 但是拆开模块,发现使用的是绑定的IC,大约是为了节省生产成本的原因吧,当然绑定IC在质量上常规情况下,要比塑料或陶瓷封闭材料的IC差。 笔者的模块用于arm-linux开发,但是经常遇到一个情况: 正常启动Bootloader,并成功进入linux,通过串口向笔者的笔记本电脑传送大量...

weixin_30505225的博客 756

「转载」Linux串口通信详解

Linux串口编程详解 http://www.adamjiang.com/pukiwiki/index.php?Linux%E4%B8%B2%E5%8F%A3%E7%BC%96%E7%A8%8B%E8%AF%A6%E8%A7%A3 [&amp;amp;nbsp;Front page&amp;amp;nbsp;] &amp;amp;nbsp; [&amp;amp;nbsp;Diff&amp;amp;nbsp;|&amp;amp;nbsp;

Feiyuemoxuan的博客 657

Linux下串口编程

转载自 串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用。常用的串口是RS-232-C接口(又称EIA RS-232-C)它是在1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。串口通讯指的是计算机依次以位(bit)为单位来传送数据,串行通讯使用的范围很广,在嵌入式系统开发过程中串口通讯也经常用到通讯方式之一。 Linux对所有设备的访问是通过设备文件来进行的,串口也是这样,为了访问串口,只需打开其设备文件即可操作串口设备

peifeng 1379

ARM-Linux(mini2440)串口与51单片机的9位串口通讯

ARM-Linux(mini2440)串口与51单片机的9位串口通讯   (2013-03-10 16:09:34) 转载▼ 标签:  9bit串口   arm-linux   51单片机 分类: 技术之路 ARM-Linux(mini2440)串口与51单片机的9位串口通讯: 当51单片机的串口模式在

linuxheik的专栏 2264

Linux系统下运用开源RXTX库实现JAVA串口通讯

Linux系统下运用开源RXTX库实现JAVA串口通讯

yrryyff的博客 1726
上一篇: QT的中文化相关问题
下一篇: 使用ld
飞羽飞之猪
博客等级 码龄21年 127粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值