Linux串口编程(中断方式和select方式)
Linux下的串口编程,在嵌入式开发中占据着重要的地位,因为很多的嵌入式设备都是通过串口交换数据的。在没有操作系统的我们可以使用UART的中断来出来数据的接受和发送,而在Linux操作系统下,我们也可以使用软中断的方式来处理数据的接受和发送,这里主要使用的是信号SIGIO,也就是异步I/O。这里也可以使用select实现异步形式的通知。 这里可以参考《UNIX 环境高级编程》中的第14章 高级I/O和第18章的I/O终端,这两章描述了串口的编程和异步I/O方面的内容。还有一本书《linux serial programming how-to》,《Serial Programming Guide for POSIX Operating Systems》。这都是串口编程的必读和经典书籍。
串口参数的设置一般包括波特率、起始位数量、数据位、停止位和流控协议。在接收端和发送端要配置成一样的参数设置。在Linux中,所有的设备文件一般都位于“/dev”下,其中串口一、串口二对应的设备名依次为“/dev/ttyS0”、"/dev/ttyS1"。这可以通过查看"/dev"下的文件加以确认。我的串口通信是开发板ARM9--mini2440发送数据,PC机通过串口接受数据。我的串口的参数设置为 115200,8,‘N’,1。也就是波特率是115200,8位数据位,无奇偶校验位,1位停止位。因为是用的开发板发送数据,所以要用到在minicom中运行发送的程序,不过在发送程序运行后,要立即关闭minicom,否则,接受程序不能接受到数据。这个是我使用中断时出现的问题,当我使用select是没有此问题,现在还不知道具体的原因是什么。
串口编程中有一个最重要的结构体:
|
|
这个结构中最重要的是c_cflag。通过对它的赋值,用户可以设置波特率、字符大小、数据位、停止位、奇偶校验位和硬件流控等。其中的参数在网上和很多的书籍上都介绍的很详细了,这里主要介绍一下我在其中遇到的问题和解决的办法,以供学习。其中的c_line,在POSIX中的Linux中没有用到。
在c_lflag中有这么一个参数ICANON,如若设置,则按规范模式工作,这使下列字符起作用:EOF、EOL EOL2、 ERASE、 KILL、 REPRINT 、STATUS、WERASE。输入字符被装配成行。如果不以规范模式工作,则读请求直接从输入队列取字符。在至少接收到MIN个字节或已超过TIME值之前,read将不返回。
在规范模式很容易:系统每次返回一行。但在非规范模式下,系统怎样才能知道在什么时候将数据返回给我们呢?如果它一次返回一个字节,那么系统开销就很大。解决方法是:当已读了指定量的数据后,或者已经过了给定的时间后,即通知系统返回。这种技术使用了termios结构中c_cc数组的两个变量:MIN和TIME。C_cc数据中的这两个元素的下标名为VMIN和VTIME。MIN说明一个read返回前的最小字节数。TIME说明等待数据到达的分秒数。
|
|
其中的“Set_Uart.c”是我设置串口的模式和打开串口的文件。模式的设置就是按上面说的进行设置。
下面是发送数据,写串口的程序,
|
{ { |
把该文件进行交叉编译后下载到开发板,进行运行./Write_Uart。
下面是中断读取数据的main函数。Read_Uart_IRQ.c
当使用中断方式的读取数据时,要先运行开发板上的Write_Uart.c文件,然后,立即关闭,再在PC上运行读取数据的
Read_Uart_IRQ.c文件。所以,在Write_Uart.c中,在使用write()函数向UART写数据之间加入一小段的延时。这样便于关
闭minicom,如果在两台PC上进行测试的话,应该不存在此问题。
|
saio.sa_flags = 0; /* allow the process to recevie SIGIO*/ |
下面是select方式的读取数据的main函数。Read_Uart.c
|
|
下面是运行的结果,PC机收到的开发板发送过来的数据。
|
|
其中串口中的一些重要的设备如下;
|
|
http://blog.chinaunix.net/uid-20788636-id-1841319.html
Linux串口编程(中断方式和select方式)的更多相关文章
- linux串口编程参数配置详解(转)
1.linux串口编程需要的头文件 #include <stdio.h> //标准输入输出定义#include <stdlib.h> //标准函数 ...
- linux串口编程参数配置详解
1.linux串口编程需要的头文件 #include <stdio.h> //标准输入输出定义 #include <stdlib.h> //标准函 ...
- storysnail的Linux串口编程笔记
storysnail的Linux串口编程笔记 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据Ge ...
- Linux串口编程详解(转)
串口本身,标准和硬件 † 串口是计算机上的串行通讯的物理接口.计算机历史上,串口曾经被广泛用于连接计算机和终端设备和各种外部设备.虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接 ...
- linux串口编程总结
串口本身.标准和硬件 † 串口是计算机上的串行通讯的物理接口.计算机历史上,串口以前被广泛用于连接计算机和终端设备和各种外部设备.尽管以太网接口和USB接口也是以一个串行流进行数据传送的.可是串口连接 ...
- Linux串口编程进阶
在<Linux串口编程>编程一文中介绍了串口应用中常用的基本操作,如:串口打开关闭.串口设置.数据收发等.本篇文章主要基于常规串口操作进行了扩充,主要介绍如下操作: Linux系统使用非标 ...
- linux串口编程
按照对linux系统的理解,串口编程的顺序无非就是open,read,write,close,而串口有波特率.数据位等重要参数需要设置,因此还应该用到设置函数,那么接下来就带着这几个问题去学习linu ...
- Linux串口编程(转载)
在嵌入式Linux中,串口是一个字设备,访问具体的串行端口的编程与读/写文件 的操作类似,只需打开相应的设备文件即可操作.串口编程特殊在于串 口通信时相关参数与属性的设置.嵌入式Linux的串口编程时 ...
- linux串口编程设置(转载)
(转载)在嵌入式Linux中,串口是一个字设备,访问具体的串行端口的编程与读/写文件 的操作类似,只需打开相应的设备文件即可操作.串口编程特殊在于串 口通信时相关参数与属性的设置.嵌入式Linux的串 ...
随机推荐
- CVS 相关内容
CVS 基础 cvs 并不是 eclipse 独有, 而是 eclipse 支持 cvs. cvs 是用于几个程序员之间共享程序避免冲突的一个工具, 是 C/S 架构. cvs 是 java 的一个开 ...
- 本地调试远程api tag
当你在本地开发js且需要跨域调用远程接口的时候.可按照下列步骤设置你的chrome. 1.创建chrome快捷方式. 2.右键属性新的快捷方式,在目标一栏后面追加 "--args ...
- python django -1
VT Django是一款python的web开发框架 与MVC有所不同,属于MVT框架 m表示model,负责与数据库交互 v表示view,是核心,负责接收请求.获取数据.返回结果 t表示templa ...
- Problem 500!!! (Project Euler 500)
题目大意:求出最小的正整数,它的约数有$2^{500500}$个. 思路:考虑将一个数质因数分解,如果它的约数有$2^{500500}$个, 那么每个质因子的指数一定是$2^k-1$这样的形式. 如果 ...
- jprofiler_监控远程linux服务器的JVM进程(转 非常棒)
几天前写了一篇文章,jprofiler_监控远程linux服务器的tomcat进程(实践),介绍了使用jprofiler怎样监控远程linux的tomcat进程,这两天想了想,除了可以监控tomcat ...
- 利用Lucene将被索引文件目录中的所有文件建立索引
1.新建两个文件夹htm和index,其中htm中存放被索引的文件,index文件中存放建立的索引文件. 2.新建解析目录中所有文件的类,用来解析指定目录下的所有文件. import java.io. ...
- 用训练好的caffemodel对单个/批量图片进行分类
一.单个图片进行分类 这个比较简单,在*.bat文件中输入以下代码: @echo off set BIN_DIR=D:\caffe\caffe-windows\Build\x64\Release se ...
- CodeIgniter框架——源码分析之入口文件index.php
CodeIgniter框架的入口文件主要是配置开发环境,定义目录常量,加载CI的核心类core/CodeIgniter.php. 在index.php中,CI首先做的事情就是设置PHP的错误报告, ...
- java学习笔记——数据类型及类型转换
数据类型分为: 1.引用类型(字符型); 2.基本数据类型(数值型); 以下为基本数据类型介绍(括号内的数字表示该类型所占据的字节数) a.整型 byte(8) short(16) int(3 ...
- java图片二进制相互转换
import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOu ...