Отправка двойных данных из Matlab в Teensy 3.6 через microUSB
Я бьюсь о стену уже больше недели. Мой текущий проект заключается в использовании Teensy 3.6 для отправки данных по шине SPI на микросхему, которая эффективно будет генератором сигналов. Я сделал графический интерфейс в Matlab для управления этим генератором функций в «реальном времени», отправляя такие значения, как частота и амплитуда. В моем первоначальном случае я просто хочу вывести синусоидальную волну. для этого я использую встроенную математическую функцию sin и просто получаю амплитуду и частоту из Matlab. Однако, когда я отправляю свои данные, я ничего не получаю на выходе, но когда я жестко программирую значения, все работает нормально. Исходя из этого, я предполагаю, что неправильно отправляю данные ИЛИ неправильно их конвертирую при получении.
Мой порядок операций:
отправить мою переменную в Teensy 3.6, используя fwrite в Matlab
serialID = serial('COM5','BaudRate',115200); fopen(serialID); val = 2.55; fwrite(serialID, val, 'double');
получение данных о Teensy 3.6 с помощью Serial.read()
byte temp[8]; for (int c = 0; c<8; c++){ temp[c] =Serial.read(); }
преобразование массива байтов в двойной с помощью объединения
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-порт.
Буду признателен за любые полезные советы.
@Ryne, 👍-1
Обсуждение1 ответ
Я получил больше информации об этой проблеме на форумах Arduino и смог ответить на нее там. Я публикую ссылку здесь, чтобы завершить этот пост рабочим ответом. Надеюсь, это поможет!
https://forum.arduino.cc/index.php?topic=598595.new #новый
Спасибо!
- Serial.availableForWrite против Serial.flush
- Отправка последовательных данных в прерывании
- Вложенный цикл
- Чтение строки, разделенной запятыми
- Почему люди используют 115200 вместо 9600?
- Получение шестнадцатеричных данных с терминала
- Преобразование из ASCII uint8_t в строку
- Ошибка 'Serial' was not declared in this scope
Вы проверили порядок байтов? И читать, когда есть доступные данные, т.е. проверять Serial.available()., @Mikael Patel
Да, они оба с прямым порядком байтов. И да, я использовал Serial.available, чтобы узнать, доступны ли данные. В настоящее время я читаю данные и отправляю текст отладки в Matlab, чтобы увидеть, где я нахожусь в коде. Когда я жестко кодирую числа, я на самом деле все еще читаю данные, но не использую их, чтобы попасть в часть кода if(Serial.available())., @Ryne
Вы имеете в виду
if (Serial.available() >= 8)
., @Edgar BonetЯ написал это неправильно, но не >= 8, а скорее if(Serial.available() > 0) Я просто хочу знать, что что-то готово к извлечению перед запуском., @Ryne