Обновление 2. Оказалось, что достаточно было добавить pause(2)
после открытия последовательного порта.
Обновление: Я могу вручную ввести код Matlab в командное окно Matlab, и он обновит светодиоды, как ожидалось, но я не могу вызвать свою функцию, которая делает это. Я попробую добавить задержки, возможно, буфер Arduino не успевает.
Я использую Arduino Uno с экраном Sparkfun PWM для управления 3 светодиодами. Я написал скетч Arduino, который ищет последовательный ввод для установки значений светодиодов, и код Matlab, который подготавливает и отправляет последовательный вывод. Смотрите весь код ниже.
По какой-то причине перестал работать этот код, работавший несколько месяцев назад. Сейчас я использую версию Matlab 2011b, а раньше использовал 2013a. Больше ничего не изменилось.
Я считаю, что проблема связана с последовательной связью, так как я могу заставить ее работать, запустив Matlab и Arduino IDE одновременно, открыв последовательный монитор в Arduino IDE, а затем выполнив команду Matlab. Он устанавливает желаемые значения светодиодов. Чтобы отправить другую команду, мне нужно сначала закрыть и снова открыть последовательный монитор 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;
}
}
}
/dev/tty.usbmodem1411
? - person ChrisJ   schedule 26.02.2014/dev/tty.usbmodem1411
? Кроме того, не забудьте прочитать архивную документацию для 2011b, а не новые материалы, которые вы можете найти через Google (или просто используйтеhelp
иdoc
). - person horchler   schedule 26.02.2014