Отправка двойных данных из Matlab в Teensy 3.6 через microUSB

Я бьюсь о стену уже больше недели. Мой текущий проект заключается в использовании Teensy 3.6 для отправки данных по шине SPI на микросхему, которая эффективно будет генератором сигналов. Я сделал графический интерфейс в Matlab для управления этим генератором функций в «реальном времени», отправляя такие значения, как частота и амплитуда. В моем первоначальном случае я просто хочу вывести синусоидальную волну. для этого я использую встроенную математическую функцию sin и просто получаю амплитуду и частоту из Matlab. Однако, когда я отправляю свои данные, я ничего не получаю на выходе, но когда я жестко программирую значения, все работает нормально. Исходя из этого, я предполагаю, что неправильно отправляю данные ИЛИ неправильно их конвертирую при получении.

Мой порядок операций:

  1. отправить мою переменную в Teensy 3.6, используя fwrite в Matlab

    serialID = serial('COM5','BaudRate',115200);                    
    fopen(serialID);                           
    val = 2.55;
    fwrite(serialID, val, 'double');
    
  2. получение данных о Teensy 3.6 с помощью Serial.read()

    byte temp[8];
    
    for (int c = 0; c<8; c++){
        temp[c] =Serial.read();
    }
    
  3. преобразование массива байтов в двойной с помощью объединения

    double byteToDouble(byte DoubleInBytes[8]) {
        // Получает 8-байтовые значения и возвращает их в двойное значение
    
        union {
           double   Out;                                                      
           byte   In[8];                                                      
        } U ;
    
        for (int c = 0; c < 8; c++) {
            U.In[c] = DoubleInBytes[c];
        }
    
        return U.Out;
    }
    

Я не понимаю, что я делаю не так. Я пытался использовать последовательный монитор для мониторинга состояний переменных, но не могу использовать его, пока Matlab использует COM-порт.

Буду признателен за любые полезные советы.

, 👍-1

Обсуждение

Вы проверили порядок байтов? И читать, когда есть доступные данные, т.е. проверять Serial.available()., @Mikael Patel

Да, они оба с прямым порядком байтов. И да, я использовал Serial.available, чтобы узнать, доступны ли данные. В настоящее время я читаю данные и отправляю текст отладки в Matlab, чтобы увидеть, где я нахожусь в коде. Когда я жестко кодирую числа, я на самом деле все еще читаю данные, но не использую их, чтобы попасть в часть кода if(Serial.available())., @Ryne

Вы имеете в виду if (Serial.available() >= 8)., @Edgar Bonet

Я написал это неправильно, но не >= 8, а скорее if(Serial.available() > 0) Я просто хочу знать, что что-то готово к извлечению перед запуском., @Ryne


1 ответ


-1

Я получил больше информации об этой проблеме на форумах Arduino и смог ответить на нее там. Я публикую ссылку здесь, чтобы завершить этот пост рабочим ответом. Надеюсь, это поможет!

https://forum.arduino.cc/index.php?topic=598595.new #новый

Спасибо!

,