2

更新 2pause(2) :结果是在打开串行端口后添加一个是它所需要的。

更新我可以手动将 Matlab 代码输入到 Matlab 命令窗口,它会按预期更新 LED,但我无法调用这样做的函数。我会尝试添加时间延迟,也许 Arduino 缓冲区跟不上。

我正在使用带有 Sparkfun PWM 屏蔽的 Arduino Uno 来控制 3 个 LED。我编写了一个 Arduino 草图,它寻找串行输入来设置 LED 值,以及准备和发送串行输出的 Matlab 代码。请参阅下面的所有代码。

由于某种原因,这段几个月前还在工作的代码已经停止工作。我现在使用的是 2011b 版本的 Matlab,之前使用的是 2013a。其他一切都没有改变。

我相信问题出在串行通信上,因为我可以通过同时运行 Matlab 和 Arduino IDE,在 Arduino IDE 中打开串行监视器,然后发出 Matlab 命令来使其工作。它根据需要设置 LED 值。为了发送另一个命令,我需要先关闭,然后重新打开 Arduino 串行监视器。

Matlab代码:

function [] = displayColor(RGB)

s1 = serial('/dev/tty.usbmodem1411','BaudRate',9600);

fopen(s1)

messageRed = bitshift(1,12)+RGB(1);
messageGreen = bitshift(2,12)+RGB(2);
messageBlue = bitshift(3,12)+RGB(3);
fwrite(s1,messageRed,'uint16','sync');
fwrite(s1,messageGreen,'uint16','sync');
fwrite(s1,messageBlue,'uint16','sync');
updateMessage = 0;
fwrite(s1,updateMessage,'uint16','sync');

fclose(s1)

end

Arduino代码:

#include "Tlc9540.h"
int newVal = 0;

void setup(){
Tlc.init();
Serial.begin(9600);
delay(1000);
}

void loop(){

updateChannel();  

}

int updateChannel()
{

int B;
int code;
int value;

  if (Serial.available())
  {
    //Read First Byte
    B = Serial.read();
    //Blocking - waiting for second byte
    while (!Serial.available()){}
    B+=Serial.read()<<8;
    code = (B&(B1111<<12))>>12;
    value = B&4095;
    switch (code)
    {
      case 0:
        Tlc.update();
        break;
      case 1:
        Tlc.set(0,value);
        Serial.print(Tlc.get(0));
        break;
      case 2:
        Tlc.set(1,value);
        Serial.print(Tlc.get(1));
        break;
      case 3:
        Tlc.set(2,value);
        Serial.print(Tlc.get(2));
        break;
    }
  }  
}
4

2 回答 2

0

为了通过 Matlab 通过串行端口使用 Arduino,它似乎需要约 2 秒的时间延迟。在开始通过串行线路发送数据之前添加延迟就可以了。

于 2014-03-09T16:38:20.460 回答
0

我通过设置自己的串行终结器(我用作!终结器)解决了这个问题。当我发送串行命令时,我将!其用作终止符。

set(arduino,'Terminator','!'); % setting my terminator

然后在我的代码中:

test_free = 'mode=free,axis=1,dir=1,speed=50,pos=13245!';
fprintf(arduino,test_free);

我认为问题在于matlab正在等待终结者。如果没有完全填充,则会执行超时并将其设置为 2 秒。这就是为什么在大于超时的延迟后可以执行的原因。

于 2015-06-23T13:30:05.977 回答