matlab 的串口通讯速度问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab 的串口通讯速度问题相关的知识,希望对你有一定的参考价值。

用matlab的timer定时中断发送通讯请求,我试过了,确实是可以的。
  不过有个问题,我跟设备的通讯波特率是38400,命令每帧10字节,加上起始终止位,100Bits,也就是说理论上,2.604ms(384Hz)就可以完成一次通讯,考虑到一些延迟和数据处理时间,

  我把通讯周期设定为10ms,结果误码率特别高。周期改为直到30ms才开始比较稳定,改到50ms就完全没有问题了。
  不知道这种延迟是matlab本身各种事件过多造成的?
  还是Windows线程过多造成的?
  还是我的USB-COM转换器处理时间过长造成的?
之前的问题:http://zhidao.baidu.com/question/1830364275704002740.html?sort=6#answer-1718945701

参考技术A 需要你提供更详细的一些信息:
1、在循环体中加drawnow的做法是否可以解决你上次说的问题?
2、你现在用timer的思路是怎样的?它的回调函数与串口对象回调函数的功能怎样划分?
3、你所说的“误码率特别高”具体是什么现象?

串口通讯涉及到很多因素,采取什么样的通讯机制(或者说处理策略)很重要。
我觉得你猜测几个原因中,“matlab本身各种事件过多”、“Windows线程过多”可能性都不是很大,而USB-COM转换涉及到硬件,我不好判断,但也觉得可能性不大。
最好把你的代码贴出来(如果受字数限制,可传到网盘),我才好进一步分析。

Arduino Matlab 串口通讯速度

【中文标题】Arduino Matlab 串口通讯速度【英文标题】:Arduino Matlab serial communication speed 【发布时间】:2017-03-04 11:50:57 【问题描述】:

我在一个简单的 Arduino - Matlab(2014 和 2016)串行通信中遇到了一些问题。 我有一个简单的 Arduino 草图,它从传感器收集值并通过串行发送它们。 Arduino 等待字符 'r' 开始读取/发送过程

void loop()
    
  if(Serial.available()) 
  
    cmd = Serial.read();
    if(cmd == 'r') 
    
      while(1)
      
        accelgyro.read();
        //acc
        raw_values[0] = accelgyro.a.x;
        raw_values[1] = accelgyro.a.y;
        raw_values[2] = accelgyro.a.z;    

        //gyro
        raw_values[3] = accelgyro.g.x;
        raw_values[4] = accelgyro.g.y;
        raw_values[5] = accelgyro.g.z;

        for (j=0; j<6; j++)
        
            Serial.write (highByte(raw_values[j]));
            Serial.write (lowByte(raw_values[j]));
             
       delay(2);
      
    
  

以及对应的Matlab代码:

Arduino = serial('COM6','BaudRate',115200);
fopen(Arduino);
flushinput(Arduino)

acqSize = 1000;

pause(2)

'start'
fwrite(Arduino,'r');
tStart = tic;

while( i <=acqSize)

    if(Arduino.BytesAvailable>packetSize-1)

        lastData = fread(Arduino,packetSize) ;
        raw_matrix(:,i) =  byteToInt(lastData);
        raw_matrix(7,i) = toc(tStart);
        tStart = tic;
        i=i+1
    end
    pause(0.001);
end

其中 packetsize 是每个周期从 Arduino 发送的字节数,即 12

问题是速度真的很低,我检查了两次读取之间的时间,我得到的如下图所示

除了这些周期性出现的尖峰外,我的速度还不错。在这些情况下,两次读数之间的间隔大于 0.1 秒。

【问题讨论】:

天哪,那些 spikes 有一个漂亮的 周期性 行为.. 可能是由于某些 周期性任务而造成的一些干扰 在您的机器上?一些垃圾收集器,也许吧?只是猜测。我不明白为什么这应该是一个 arduino 问题。 arduino 串口监视器说什么?也许看门狗重置(虽然你有一些delay())?大多数 Arduinos 可以超过 115200 波特,例如250,000 波特。 我在想一些与缓冲区大小有关的事情...... @MaximilianGerhardt 串行监视器连续打印符号...将字节转换为 ascii 字符的符号 【参考方案1】:

Matlab 中的时序与您的 Arduino 中的时序不同。嵌入式硬件和小型操作系统(如用于 Arduino 的操作系统)是硬实时的,可以非常准确地保持时间。但是,Matlab 需要在 Windows、Linux 等操作系统上运行。这些不是实时操作系统,时间不能准确和可预测。因此,如果操作系统忙于做其他事情,时间的抖动可能会增加。此外,即使对于非常强大的 CPU,也无法实现“暂停(0.001)”。如果 CPU 消耗对您来说不是问题,您可以删除“暂停”,或者您可以使用占用 CPU 并更快返回的代码,如下所示:

function delay(seconds)
  % function pause the program
  % seconds = delay time in seconds
  tic;
  while toc < seconds
  end
end

更多讨论可以在这里找到: Pause function in matlab for 1 millisecond

【讨论】:

以上是关于matlab 的串口通讯速度问题的主要内容,如果未能解决你的问题,请参考以下文章

串口通讯速度最高可达多少?

PLC西门子通讯协议、以太网通讯协议、串口通讯协议、MODBUS

STM32 USB使用记录:使用CDC类虚拟串口(VCP)进行通讯

STM32串口通讯问题

急!请教RS485串口通讯的问题

Qt入门教程硬件编程串口基础知识