
正文
linux串口中断命令 linux串口中断读数据
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
如何实现linux下的串口中断编程?
#include
#include
#include
#include
#include
#include
#define BAUDRATE B38400
#define MODEMDEVICE "/dev/ttyS1"
#define _POSIX_SOURCE 1 /* POSIX 系统相容 */
#define FALSE 0
#define TRUE 1
volatile int STOP=FALSE;
void signal_handler_IO (int status); /* 定义讯号处理程序 */
int wait_flag=TRUE; /* 没收到讯号的话就会是 TRUE */
main()
{
int fd,c, res;
struct termios oldtio,newtio;
struct sigaction saio; /* definition of signal action */
char buf[255];
/* 开启装置为 non-blocking (读取功能会马上结束返回) */
fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK);
if (fd 0) {perror(MODEMDEVICE); exit(-1); }
/* 在使装置非同步化前, 安装讯号处理程序 */
saio.sa_handler = signal_handler_IO;
saio.sa_mask = 0;
saio.sa_flags = 0;
saio.sa_restorer = NULL;
sigaction(SIGIO,saio,NULL);
/* 允许行程去接收 SIGIO 讯号*/
fcntl(fd, F_SETOWN, getpid());
/* 使档案ake the file descriptor 非同步 (使用手册上说只有 O_APPEND 及
O_NONBLOCK, 而 F_SETFL 也可以用...) */
fcntl(fd, F_SETFL, FASYNC);
tcgetattr(fd,oldtio); /* 储存目前的序列埠设定值 */
/* 设定新的序列埠为标准输入程序 */
newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
newtio.c_iflag = IGNPAR | ICRNL;
newtio.c_oflag = 0;
newtio.c_lflag = ICANON;
newtio.c_cc[VMIN]=1;
newtio.c_cc[VTIME]=0;
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,newtio);
/* 等待输入讯号的回圈. 很多有用的事我们将在这做 */
while (STOP==FALSE) {
printf(".\n");usleep(100000);
/* 在收到 SIGIO 後, wait_flag = FALSE, 输入讯号存在则可以被读取 */
if (wait_flag==FALSE) {
res = read(fd,buf,255);
buf[res]=0;
printf(":%s:%d\n", buf, res);
if (res==1) STOP=TRUE; /* 如果只输入 CR 则停止回圈 */
wait_flag = TRUE; /* 等待新的输入讯号 */
}
}
/* 回存旧的序列埠设定值 */
tcsetattr(fd,TCSANOW,oldtio);
}
相关问答
Q1: Linux内核中断之中断申请接口
本文基于 RockPI 4A 单板Linux4.4内核介绍中断申请的常用接口函数。
1、文件
2、定义
说明:
1)、 irq :要申请的中断号,可通过 platform_get_irq() 获取,见“Linux内核中断之获取中断号”。
2)、 handler :中断处理函数,发生中断时,先处理中断处理函数,然后返回 IRQ_WAKE_THREAD 唤醒中断处理线程。中断处理函数尽可能简单。
中断处理函数定义: typedef irqreturn_t (*irq_handler_t)(int, void *);
中断返回值如下:
3)、 thread_fn :中断处理线程,该参数可为NULL。类似于中断处理函数的下半部分。
4)、 irqflags :中断类型标志。
定义文件: include/linux/interrupt.h ,内容如下:
5)、 devname :中断名称,可使用 cat /proc/interrupts 命令查看。
6)、 dev_id :设备ID,该值唯一。
在使用共享中断时(即设置 IRQF_SHARED ),必须传入 dev_id ,在中断处理和释放函数中都会使用该参数。
注:
1、 request_threaded_irq() 函数可替代 request_irq 加 tasklet 或 workqueue 的方式。
2、对应的中断释放函数为: void free_irq(unsigned int, void *) ,需要和中断申请函数成对出现。
1、文件
2、定义
说明:
1)、 __must_check :指调用函数一定要处理函数的返回值,否则编译器会给出警告。
2)、 request_irq() 函数本质上是中断处理线程 thread_fn 为空的 request_threaded_irq() 函数。
注 :
对应的中断释放函数为: void free_irq(unsigned int, void *) ,需要和中断申请函数成对出现。
1、文件
2、定义
说明 :
devm_request_threaded_irq() 本质上还是使用 request_threaded_irq() 函数实现中断申请。
两者区别:
1)多了一个 dev 参数;
2)在设备驱动卸载时,中断会自动释放;
3)如果想单独释放中断,可使用 void devm_free_irq(struct device *dev, unsigned int irq, void *dev_id) 函数。
1、文件
2、定义
devm_request_irq() 函数本质上是中断处理线程 thread_fn 为空的 devm_request_threaded_irq() 函数。
1、获取中断号
2、申请中断
3、中断处理函数
4、中断处理线程
5、查看中断
Q2: linux内核启动从内核态转到用户态需要串口中断?
不需要,首先系统调用流程
Linux 提供了 glibc 库, 它封装了系统调用接口, 对上层更友好的提供服务, 系统调用最终都会通过 DO_CALL 发起, 这是一个宏定义, 其 32 位和 64 位的定义是不同的:
32 位系统调用
用户态
将请求参数保存到寄存器
将系统调用名称转为系统调用号保存到寄存器 eax 中
通过软中断 ENTER_KERNEL 陷入内核态
内核态
内核的软中断陷入门收到系统调用会将用户态的寄存器保存到 pt_regs 结构中
在系统调用函数表 sys_call_table 中根据调用号找到对应的函数
并将寄存器中保存的参数取出来作为参数执行函数, 将返回值写入 pt_regs 结构的 ax 位置
通过iret指令根据 pt_regs 恢复用户态进程
64 位系统调用
用户态
将请求参数保存到寄存器
将系统调用名称转为系统调用号保存到寄存器 rax 中
通过 syscall 指令进入内核态
(注:由int中断指令改为syscall指令,减少了一次查表过程,性能应该有所提高)
内核态
将用户态的寄存器保存到 pt_regs 中
在系统调用函数表 sys_call_table 中根据调用号找到对应的函数
将寄存器中保存的参数取出来作为函数参数执行函数, 将返回值写入 pt_regs 的 ax 位置
Q3: linux系统中的中断指令是什么??
什么是中断
Linux 内核需要对连接到计算机上的所有硬件设备进行管理,毫无疑问这是它的份内事。如果要管理这些设备,首先得和它们互相通信才行,一般有两种方案可实现这种功能:
轮询(polling) 让内核定期对设备的状态进行查询,然后做出相应的处理;中断(interrupt) 让硬件在需要的时候向内核发出信号(变内核主动为硬件主动)。
第一种方案会让内核做不少的无用功,因为轮询总会周期性的重复执行,大量地耗用 CPU 时间,因此效率及其低下,所以一般都是采用第二种方案 。
对于中断的理解我们先看一个生活中常见的例子:QQ。第一种情况:你正在工作,然后你的好友突然给你发送了一个窗口抖动,打断你正在进行的工作。第
二种情况:当然你有时候也会每隔 5 分钟就去检查一下 QQ
看有没有好友找你,虽然这很浪费你的时间。在这里,一次窗口抖动就可以被相当于硬件的中断,而你就相当于 CPU,你的工作就是 CPU
这在执行的进程。而定时查询就被相当于 CPU 的轮询。在这里可以看到:同样作为 CPU 和硬件沟通的方式,中断是硬件主动的方式,较轮询(CPU
主动)更有效些,因为我们都不可能一直无聊到每隔几分钟就去查一遍好友列表。
CPU
有大量的工作需要处理,更不会做这些大量无用功。当然这只是一般情况下。好了,这里又有了一个问题,每个硬件设备都中断,那么如何区分不同硬件呢?不同设
备同时中断如何知道哪个中断是来自硬盘、哪个来自网卡呢?这个很容易,不是每个 QQ 号码都不相同吗?同样的,系统上的每个硬件设备都会被分配一个
IRQ 号,通过这个唯一的 IRQ 号就能区别张三和李四了。
从物理学的角度看,中断是一种电信号,由硬件设备产生,并直接送入中断控制器(如
8259A)的输入引脚上,然后再由中断控制器向处理器发送相应的信号。处理器一经检测到该信号,便中断自己当前正在处理的工作,转而去处理中断。此后,
处理器会通知 OS 已经产生中断。这样,OS
就可以对这个中断进行适当的处理。不同的设备对应的中断不同,而每个中断都通过一个唯一的数字标识,这些值通常被称为中断请求线。
Q4: Linux下通过哪个命令怎么查看中断
与Linux设备驱动中中断处理相关的首先是申请与释放IRQ的API request_irq()和free_irq()。
C++是一种面向对象的计算机程序设计语言,由美国ATT贝尔实验室的本贾尼·斯特劳斯特卢普博士在20世纪80年代初期发明并实现,最初它被称作“C with Classes”(包含类的C语言)。
它是一种静态数据类型检查的、支持多重编程范式的通用程序设计语言,支持过程化程序设计、数据抽象、面向对象程序设计、泛型程序设计等多种程序设计风格。
在C基础上,一九八三年又由贝尔实验室的Bjarne Strou-strup推出了C++,C++进一步扩充和完善了C语言,成为一种面向 对象的程序设计语言。
C++目前流行的编译器最新版本是Borland C++ 4.5,Symantec C++ 6.1,和Microsoft Visual C++ 2012。
Q5: linux哪个组合可以断开长命令
可以。linux哪个组合可以断开长命令,中断linux命令快捷键:
1、Tab这是不能没有的Linux快捷方式。将节省Linux命令行中的大量时间。
2、Ctrl+C这个组合能在终端上中断命令或进程。按下它将立即停止正在运行的程序。如果要停止使用在前台运行的程序,只需按此组合键即可。
3、Ctrl+Z此快捷方式将在后台发送正在运行的程序。
关于linux串口中断命令和linux串口中断读数据的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。








