更新 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;
}
}
}