Проблема общаться через сериал в Ардуино из Матлаба
-
21-12-2019 - |
Вопрос
Я использую Arduino Uno с помощью Spearffun PWM Shield для управления 3 светодиодами. Я написал эскиз Arduino, который ищет последовательный вход для установки светодиодных значений, и код MATLAB, который готовит и отправляет последовательный вывод. Смотрите весь код ниже.
По какой-то причине этот код, который работал несколько месяцев назад, перестал работать. Теперь я использую версию MATLAB 2011b и использовал 2013A раньше. Ничто другое не изменилось.
Я полагаю, что проблема с серийным общением, поскольку я могу заставить его работать с помощью IDE IDE Matlab и Arduino, открывая серийный монитор в 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;
}
}
}
. Решение
Для того, чтобы вовлечь Arduino над последовательным портом через MATLAB, кажется, нуждается в временной задержек ~ 2 секунды.Добавление задержки перед началом отправки данных через последовательную линию сделала трюк.
Другие советы
Я решил эту проблему, установив свой собственный последовательный терминатор (я использовал !
в качестве терминатора).А когда я отправляю последовательную команду, я использую !
в качестве терминатора.
set(arduino,'Terminator','!'); % setting my terminator
.
Тогда в моем коде:
test_free = 'mode=free,axis=1,dir=1,speed=50,pos=13245!';
fprintf(arduino,test_free);
.
Я думаю, что проблема в том, что Matlab ждет терминатора.Чем если нет полного заполнения, время ожидания выполняется и установлено на 2SEC.Вот почему выполнение возможно после задержки больше, чем время ожидания.