首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux开发】串口接收不定长数据,接收中断+超时判断方案

前言 Linux 开发时,经常会遇到串口通信来完成两个设备之间的交互。...接收中断与超时判断: 当串口接收到数据时,会触发接收中断。...空闲中断法: 当串口在一段时间内没有接收到新数据时,会触发空闲中断。 空闲中断实际上与接收中断的超时判断原理相似,但空闲中断是硬件自带的功能,而接收中断的超时判断则需要我们自己实现。...判断接收中断需要使用 UIS_RX_FIFO,即uart 中断状态表中的第 2 位。 代码实现 串口初始化 定义接收数据变量和信号量,并定义接收的回调函数。...linux 开发和嵌入式开发中是最频繁使用的功能之一,从接收者角度来看,是不知道发送方的数据量是有多大的。

64610
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    STM32—无需中断来实现使用DMA接收串口数据

    本节目标: 通过DMA,无需中断,接收不定时长的串口数据 描述: 当在串口多数据传输下,CPU会产生多次中断接收串口数据,这样会大大地降低CPU效率,同时又需要CPU去做其它更重要的事情,我们应该如何来优化...比如四轴飞行器,当在不停地获取姿态控制方向时,又要去接收串口数据....答:使用DMA,无需CPU中断便能实现接收串口数据 1.DMA介绍 DMA,全称为: Direct Memory Access,即直接存储器访问, DMA 传输方式无需 CPU 直接 控制传输,通过硬件为...2在main()中调用串口配置函数,初始化串口后,然后使能UART1_RX的DMA接收 2.1在main()函数中,使用以下函数来调用配置函数: uart_init(115200); //串口初始化为...所以使用库函数中变量DMA1_Channel5 来配置UART1_RX. 3.2在main()函数中,定义一个接收数组,使用以下3个参数来调用配置函数: u8 USART_RX_BUF[35]; //接收缓冲

    3.6K50

    【STM32笔记】串口空闲中断接收不定长数据(DMA方式)

    在使用STM32的串口接收数据的时候,我们常常会使用接收中断的方式来接收数据,常用的是RXNE。这里分享另一种接收数据的方式——IDLE中断(PS:本文的例子运行在STM32F103ZET6上)。...一、IDLE中断什么时候发生? IDLE就是串口收到一帧数据后,发生的中断。什么是一帧数据呢?...二、RXNE中断和IDLE中断的区别? 当接收到1个字节,就会产生RXNE中断,当接收到一帧数据,就会产生IDLE中断。比如给单片机一次性发送了8个字节,就会产生8次RXNE中断,1次IDLE中断。...这是状态寄存器,当串口接收到数据时,bit5就会自动变成1,当接收完一帧数据后,bit4就会变成1. 需要注意的是,在中断函数里面,需要把对应的位清0,否则会影响下一次数据的接收。 ?...四、USART+DMA+IDLE接收不定长数据例程 1、USART初始化 ? 2、中断服务函数 ? 3、主函数 ? 4、运行结果 ?

    7.3K31

    串口通信—串口发送和接收代码讲解

    我们不仅仅可以将数据发送到串口调试助手,我们还可以在串口调试助手发送数据给控制器,控制器程序根据接收到的数据进行下一步工作。   ...首先,我们来编写一个程序实现开发板与电脑通信,在开发板上电时通过USART 发送一串字符串给电脑,然后开发板进入中断接收等待状态,如果电脑有发送数据过来,开发板就会产生中断,我们在中断服务函数接收数据,...  使能USART;   在USART 接收中断服务函数实现数据接收和发送。   ...首先我们需要调用USART_Config 函数完成USART 初始化配置,包括GPIO 配置,USART 配置,接收中断使能等等信息。   接下来就可以调用字符发送函数把数据发送给串口调试助手了。...我们在串口调试助手发送区域输入任意字符,点击发送按钮,马上在串口调试助手接收区即可看到相同的字符。

    5.3K30

    Simulink 串口接收详解1

    接收更加复杂的情况 4.程序下载 ---- 1. 接收uint8数据 ? 用串口调试助手给 Matlab 发送两个字节a和A,用ASCII码展示就是97和65。 1.1....模块 Serial Configuration 对于串口的一些基本设置。 ? 3....接收更加复杂的情况 由本文1和2两个小节可以看到,该串口接收只能解析单一的数据(要么是uint8数据类型,要么是doule数据类型)。但是实际我们的发送包会很复杂,有可能是多种类型的数据集合。...进阶教程:[Matlab]Simulink串口接收详解2用S-Function解析数据包 typedef struct { uint8 head;//1 double x;//8...St_Data data; }Un_sendData; 4.程序下载 程序下载的所有地址集中在,下一个博客Simulink串口接收详解2用S-Function解析数据包:https:

    2.3K10

    关于串口接收处理数据

    一,处理思路(定时器模拟空闲中断)   判断串口接收到一条完整的数据以后置位一个标志位,主循环判断此标志位处理数据.   ...同时串口中断接收数据的时候对这个变量清零!...如果串口一直接收数据这个变量永远累加不到期望的数值,如果串口接收     数据以后不再接收数据,变量会累加到期望的数值,然后就是判断接收到一条完整的数据....,DMA发送完成中断里面也要判断内存里面有没有需要发送的数据,有的话就重新配置DMA, 说完发送,再说接收 我的想法是 数组+DMA+串口空闲中断/定时器 串口空闲中断和定时器的作用都是判断接收到一条完整的数据...内存管理+DMA+串口空闲中断

    3.4K31

    STM32单片机采用环形缓冲区实现串口中断数据接收管理

    一、前言 在嵌入式系统开发中,与上位机进行串口通信是非常常见的场景。上位机可以通过串口发送指令或者数据给嵌入式设备,而嵌入式设备需要可靠地接收并解析这些数据,以执行相应的操作。...在本项目中,选择使用STM32微控制器来实现串口数据接收功能。STM32具有丰富的外设资源和强大的性能,非常适合用于串口通信和数据处理。...通过使用环形缓冲区管理串口接收的数据,可以实现可靠的数据接收和处理,并提高系统的稳定性和可靠性。同时,该方案也适用于其他嵌入式系统和通信场景。...CircularBuffer_Write(cb, data[i])) { return false; // 写入数据出错 } } return true; } // 示例:STM32串口接收中断处理函数...最后,给出了一个示例,展示在STM32串口接收中断处理函数中将接收到的数据写入环形缓冲区。

    1.4K30

    单片机多字节串口接收(转)

    工作了一年多,写了不少单片机串口程序。感觉串口多字节接收部分的逻辑相对于配置寄存器跟串口回复来说,是有点难度的——寄存器配置基本上都是死的,串口回复多字节跟回复一字节只是多了一个循环。   ...串口接收程序是基于串口中断的,单片机的串口每次接收到一字节数据产生一次中断,然后再读取某个寄存器就可以得到串口接收的数据了。然而在实际应用当中,基本上不会有单字节接收的情况。...第一次写串口接收程序的时候,我首先想到的就是定义一个全局变量(实际上最好是定义局部静态变量),初始值设置为0,然后每进一次中断+1,然后加到串口通信协议的长度的时候再清零。然后判断帧头、校验。...接收成功则在中断程序中把串口接收成功标志位置1。   ...下面是全局变量定义   unsigned char receive[4]={0,0,0,0};//接收缓存   bit uart_flag;//串口接收成功标志   然后串口中断部分   ```c

    1.9K50

    FreeRTOS例程3-串口中断接收不定长的数据与二值信号量的使用

    串口接收中断 中断标志为:USART_IT_RXNE,即rx none empty,串口只要接收到数据就触发中断,如果是接收一个字符串,则每接收到一个字符就触发一次中断。...串口空闲中断 中断标志为:USART_IT_IDLE,idle即空闲的意思,串口空闲时触发的中断,当然也不是说串口空闲时就一直触发中断,而实在每个连续的接收完成后,触发中断,如果是接收一个字符串,则接收完整个字符串后...所以,这两个中断可以配合使用,串口接收中断实时接收数据,接受完一串数据后,空闲中断被触发,就可以对接收的一串数据分析处理了。这种方式不需要知道每次字符串的具体长度,因而可以接收不定长的串口数据。...信号量用于任务间的同步,FreeRTOS是多任务系统,不同任务间可能需要某种同步关系,如串口中断接收完数据后,数据分析处理任务才能拿到数据进行分析,这就是一种同步。...串口空闲中断接受完一串数据后,可执行释放信号量操作,这时,数据分析处理任务就可以获取到信号量,进而可以处理串口数据了,实现了串口数据接收与数据处理的同步。 接下来的程序思路如下: ?

    2.9K12

    Linux中断处理

    中断处理 - 上半部(硬中断) 由于 APIC中断控制器 有点小复杂,所以本文主要通过 8259A中断控制器 来介绍Linux中断的处理过程。...handler: 类型为 hw_interrupt_type 结构,表示IRQ线对应的硬件相关处理函数,比如 8259A中断控制器 接收到一个中断信号时,需要发送一个确认信号才会继续接收中断信号的,发送确认信号的函数就是...这里要注意的是,如果中断处理过程能够开启中断的,那么就把中断打开(因为CPU接收中断信号时会关闭中断)。...鉴于这个原因,Linux中断处理分为两个部分,上半部 和 下半部,上半部 在前面已经介绍过,接下来就介绍一下 下半部 的执行。...softirq机制 中断下半部 由 softirq(软中断) 机制来实现的,在Linux内核中,有一个名为 softirq_vec 的数组,如下: static struct softirq_action

    6.6K20

    Linux中断 - IDT

    [toc] 如何设置IDT IDT 中断描述符表定义 中断描述符表简单来说说是定义了发生中断/异常时,CPU按这张表中定义的行为来处理对应的中断/异常。...中断描述符项定义 当中断发生,cpu获取到中断向量后,查找IDT中断描述符表得到相应的中断描述符,再根据中断描述符记录的信息来作权限判断,运行级别转换,最终调用相应的中断处理程序; 这里涉及到Linux...pre-cpu的中断栈,还是使用IST的中断栈; type表示所中断是何种类型,目前有以下四种: enum { GATE_INTERRUPT = 0xE, //中断门 GATE_TRAP...传统系统调用相关 IDT 的设置 Linux系统启动过程中内核压解后最终都调用到start_kernel, 在这里会调用trap_init, 然后又会调用idt_setup_traps: void...硬件中断相关IDT的初始化也是在Linux启动时完成,在start_kernel中通过调用init_IRQ完成,我们来看一下: void __init init_IRQ(void) { int

    6.6K10

    51单片机采用中断进行串口通信

    51单片机采用中断方式的串口通信过程及程序分析: 所谓中断方式,就是串口收/发标志位出发中断后,在中断中执行既定操作,可通过函数调用来实现。...程序: /*51单片机采用中断方式的串口通信程序分析: 接收数据时 等待中断->然后在中断接收数据 发送数据时 发送数据->等待中断->然后在中断中发送数据 具体步骤如下: 确定T1的工作方式(编程TMOD...=0 波特率不加倍 EA=1;//开总中断 ES=1;//开串口中断 注意:如果使用查询方式进行串口通信时,要把串口中断ES关闭、 } //定义数据发送函数 void sentTemp...(1) { if(RIflag==1) { ES=0;//关串口中断 RIflag=0;//接收标志位清0 sentTemp...{ //串口中断函数 if(RI) { RI=0;//接收中断标志位RI必须由软件清0 Temp=SBUF;//把接收缓冲器中收到的数据赋值给led

    1.8K21

    关于串口数据的发送和接收(调试必备)

    前言 对于串口的数据发送和接收,大多是都是利用串口中断来进行的,但是这样对于编程方面有一定要求,并且程序也不太好写,比如说,如果让你随意接收一段数据,然后利用串口将它发送出来,第一个需要考虑的问题就是接收数据的长度...,因为串口数据的发送可以根据意愿去调用,可以不用中断,但是串口数据的接收就非常需要串口中断了,因为你不知道什么时候数据发送过来,如果用查询法的话,每次都要去轮训,并且在没有操作系统的时候,轮训带来的时间延迟是接收数据所不能接受的...因此我们必须将ES置为1 我们来看一下串口中断的向量表 由此可以看见当ES置为1的时候,即ES开关闭合,则RI和TI(接收完成标志和发送完成标志) 都能够触发串口中断,它们都共用串口中断...这样接收所需要的第一个步骤就清楚了,即ES = 1.接下来谈一下后面的思路。在打开串口中断允许后,数据来的时候,就会触发接收串口中断,RI会置为1。...那么我们就另外想一个办法,因为串口中断接收的时候都会触发中断,那么如果在接收到第一个字节进入中断的时候就清除RI并且开启一个时间更小的定时,然后在里面查询RI是否被置为1(因为一个字节接收完成后RI就会置

    4.8K20

    Linux 中断处理浅析

    最近在研究异步消息处理, 突然想起linux内核的中断处理, 里面由始至终都贯穿着”重要的事马上做, 不重要的事推后做”的异步处理思想....比如: 时钟中断处理过程, 网络发送/接收处理过程. 结尾阶段 CPU接收中断以后, 以历以上五个阶段, 中断处理完成. 最后需要恢复第一阶段中被保存在栈上的寄存器信息. 中断处理结束....中断处理的这几个阶段中不能调用可能导致睡眠的函数(包括分配内存); 对于第一个问题, 较新的linux内核增加了ksoftirqd内核线程, 如果持续处理的softirq超过一定数量, 则结束中断处理过程...据说在montavista(一种嵌入式实时linux)中, 将内核的中断机制做了修改. (某些中断的)中断处理过程被赋予了task结构, 能够被内核调度. 解决了上述两个问题....工作队列 linux基线版本的内核在解决上述问题上, 提供了workqueue机制.

    7.4K80

    Linux基础(串口编程)

    虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接通常特指那些与RS-232标准兼容的硬件或者调制解调器的接口。废话少讲,今天来解剖使用串口时的编程代码细节。...上面的代码是使用串口的第一步,来解释下都是啥意思。...来瞧瞧: 第21-22行,定义了一个用来配置串口属性的结构体: struct termios serial; bzero(&serial, sizeof(serial)); 第24行,将串口设置为raw...|= CLOCAL | CREAD; // 忽略调制解调器线路状态并使能接收器 serial.c_cflag &= ~CSIZE; // 使能字符尺寸 serial.c_cflag |= CS8; /.../ 设置字符尺寸为CS8 serial.c_cflag &= ~PARENB; // 关闭奇偶校验 serial.c_cflag &= ~CSTOPB; // 关闭停止位 第33、36行,刷新掉接收到的数据并忽略掉他们

    12.8K20
    领券