matlab 怎么实现串口中断为依据的循环等待?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab 怎么实现串口中断为依据的循环等待?相关的知识,希望对你有一定的参考价值。

我之前用的是
串口设置
set(s,'baud',38400,'BytesAvailableFcnMode','byte','BytesAvailableFcnCount',1);
set(s,'BytesAvailableFcn',@TESTTRIGGER);

触发回调函数:TESTTRIGGER,
里面是就是将标志位置1,Flag = 1;display('1');%显示1提示已经进入回调函数。

主程序:循环等待
while(Flag == 0)
display('0');
clc
end

但是,用其他设备给我的串口连续给我设备发字节,循环根本就没有停下来,循环显示‘0’,用ctrl+c强行终止运行后,才连续进入回调函数,显示了相应次数的‘1’。分析应该是while优先级比中断优先级高,那么哪个循环优先级比中断低呢?

另外,已经设置了标志位Flag为全局变量,串口设置也没有问题。

或者还有没有别的方法实现matlab的循环等待?

  处理如下:
  1、在循环体中加一句drawnow。drawnow函数会更新图形窗口,同时清理系统的事件队列。
  2、主函数使用timer创建定时器,把循环等待的过程写成定时器的回调函数。
  MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。
  MATLAB是matrix&laboratory两个词的组合,意为矩阵工厂(矩阵实验室)。是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平。
  MATLAB和Mathematica、Maple并称为三大数学软件。它在数学类科技应用软件中在数值计算方面首屈一指。MATLAB可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。
  MATLAB的基本数据单位是矩阵,它的指令表达式与数学、工程中常用的形式十分相似,故用MATLAB来解算问题要比用C,FORTRAN等语言完成相同的事情简捷得多,并且MATLAB也吸收了像Maple等软件的优点,使MATLAB成为一个强大的数学软件。在新的版本中也加入了对C,FORTRAN,C++,JAVA的支持。
  
参考技术A

手边暂时没有测试条件,提两个建议,供参考:

 

1、试一试在循环体中加一句drawnow,看能否解决问题。drawnow函数会更新图形窗口,同时清理系统的事件队列。串口回调函数的执行过程应该是先放在事件队列中,然后由系统进行调度,决定何时执行的,处理的时机不可控。使用drawnow函数可以强制对队列中的事件进行处理。

 

2、主函数可考虑使用timer创建定时器,把循环等待的过程写成定时器的回调函数。这种方式可避免使用显式循环导致的CPU占用太高。不过,如果以前没接触过定时器的使用,就要稍微花点时间去研究,要是前一点能解决问题就可以不用。

 

希望对楼主有帮助。

追问

谢谢您的指教,还有些问题这里发不下,请您移步一下
http://zhidao.baidu.com/question/361097908745531972.html

追答

链接失效了?

本回答被提问者采纳

STM32串口发送中断

今日进行串口数据通信时,使用DMA串口485发送完成中断进行485发送至接收的状态转换时发现,当DMA传输完成时,串口发送寄存器中的数据还未通过发送端口传输完成,在中断中需等待查询串口发送的状态,while((USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET)); 造成中断程序程序的阻塞,以5Mbit/s的波特率的计算的话阻塞约3us。 对控制程序仍有很大影响,以简化中断处理时间的原则,

采用以下改正方法:

1、使用485自动收发电路,(存在的问题是:成本较高,波特率可能达不到,接收状态时同样需要信号输出引脚端置为低电平,若切换时有中断进来,延长发送状态会对总线的数据造成影响。 (电路参考485通讯电路总结http://www.cnblogs.com/my-trees/p/8028960.html))所以不可取。

2、改用发送完成中断进行485发收状态的切换,(用DMA串口空闲中断进行收据的接收)。这样在串口传输完成后即可进行485接收状态的切换,避免程序阻塞,减少了中断的执行时间,降低了对控制程序的影响。

在采用方法2进行处理时,在程序中对中断类型进行判断,发现在使用串口1中断后,程序会频繁进入串口中断,断开通讯、关闭接受空闲中断同样也会进入,

原因是在发送完成中断使能后,使能串口USART_Cmd(USART1, ENABLE)时触发串口中断;通过仿真看到。CR寄存器发送中断标志第6位发送完成中断位置位,触发发送完成中断。 所以在使能发送完成中断状态时,当使能串口时USART_Cmd(USART1, ENABLE);程序会进入一次发送完成中断程序(这与MODBUS发数据协议中介绍的相同,当使能串口发送中断时STM32会自动发送一个空闲帧触发中断描述相同 )。

循环进入中断是因为在发送完成中断中转换485为接受状态后,重新配置了串口接收DMA,重新使能了串口,造成串口发送完成中断循环进入。

 

以上是关于matlab 怎么实现串口中断为依据的循环等待?的主要内容,如果未能解决你的问题,请参考以下文章

怎么用C语言中断方式实现串口的读写?

51单片机串口中断函数响应并返回后主函数运行到末尾后卡着不动,主函数无法循环了

MATLAB串口数据读取问题

STM32串口 不用中断方式 接收一个字符串...怎么解决?

怎么用串口助手发送数组?

MATLAB如何保存串口读入的数据?