Проблема общаться через сериал в Ардуино из Матлаба

StackOverflow https://stackoverflow.com//questions/22025175

Вопрос

Обновление 2 : оказывается добавлением генеракодицетагкода после открытия последовательного порта было всем необходимым.

Обновление : Я могу вручную вводить код MATLAB в окно команд MATLAB, и он будет обновлять светодиоды, как и ожидалось, но я не могу вызвать мою функцию, которая делает это. Я попробую добавить задержки времени, возможно, буфер Arduino не может идти в ногу.

Я использую 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.Вот почему выполнение возможно после задержки больше, чем время ожидания.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top