Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 11
  1. #1
    Пользователь Аватар для SpaceQuester
    Регистрация
    25.01.2016
    Возраст
    41
    Сообщений
    23
    Вес репутации
    114

    По умолчанию Организация передачи данных по COM-порту

    Всем привет!

    Подскажите с огранизацией протокола передачи данных по COM-порту.
    Есть Arduino Nano (со своим скетчем) и PC (например реализация в MATLAB, это не суть важно).
    Arduino считывает данные с трёх аналоговых пинов (по типу analogRead(A0)) и непрерывно передаёт в Serial COM-порт.
    Это:
    1) управляющее напряжение источника питания фотоумножителя (положительные 0-5 Вольт)
    2) реальное напряжение источника питания (оно через инвертор ОУ от 0 до минус 800 Вольт конвертируется в положительные 0-5 Вольт)
    3) питания с выхода фотоумножителя (оно через инвертор ОУ от 0 до минус 40 Вольт конвертируется в положительные 0-5 Вольт)
    Т.е. с Ардуино на PC в COM-порт отдаётся три потока с цифрами напряжений, их нужно как то разделять при приёме на PC.
    С PC на Ардуино в COM-порт тоже может придти информация для выставления уровня ШИМ.
    Т.е. эта информация должна разбираться только в скетче Ардуины.

    На ум приходит такое решение. С Ардуины идут непрерывно пакеты в виде "SupplyControlVoltage:2,35", "SupplyOutputVoltage:3,86" и "PTMVoltage:1,67"
    С компа может придти например: "FromPCSupplyControlVoltage:1,89".

    Вопросы - как организовать такую передачу данных, как формировать сообщения в канал и на другой стороне разбирать их. Как их не перепутать?
    Покажите пожалуйста пример.
    Нужны ли открывающие и закрывающие биты для таких сообщений?

    Спасибо!

  2. #2
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    55
    Сообщений
    13,382
    Вес репутации
    10

    По умолчанию Re: Организация передачи данных по COM-порту

    У Вас ПК с какой ОС?

  3. #3
    Пользователь Аватар для SpaceQuester
    Регистрация
    25.01.2016
    Возраст
    41
    Сообщений
    23
    Вес репутации
    114

    По умолчанию Re: Организация передачи данных по COM-порту

    Windows 8.1. Но это наверное не главное. Мне бы пример такой передачи данных.

  4. #4
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    55
    Сообщений
    13,382
    Вес репутации
    10

    По умолчанию Re: Организация передачи данных по COM-порту

    Могу предложить скрипт по линукс

  5. #5
    Пользователь Аватар для SpaceQuester
    Регистрация
    25.01.2016
    Возраст
    41
    Сообщений
    23
    Вес репутации
    114

    По умолчанию Re: Организация передачи данных по COM-порту

    Окей, жду

  6. #6
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    55
    Сообщений
    13,382
    Вес репутации
    10

    По умолчанию Re: Организация передачи данных по COM-порту

    Здесь обсуждение http://cyber-place.ru/showthread.php?t=1310

  7. #7
    Пользователь Аватар для SpaceQuester
    Регистрация
    25.01.2016
    Возраст
    41
    Сообщений
    23
    Вес репутации
    114

    По умолчанию Re: Организация передачи данных по COM-порту

    Таак, теперь начинаются вопросы.
    У меня формат команды такой: CV:1234
    Короче, буквы, двоеточие, цифры. Я их ловлю в сериал порте.

    Есть скрипт простейший, суть которого: если первые буквы равны тому что мне нужно, то отсечь их, а остальные цифры перевести в int и далее работать с ними.
    PHP код:
    void setup() {
      
    Serial.begin(9600);
    }
    void loop() {

      
    String input "";

      while (
    Serial.available())
      {
        
    input input + (char)(Serial.read());
        
    Serial.print(input);
      }

      if (
    input.startsWith("CV:")) {
        
    String Voltage =  input.substring(2);
        
    Voltage.trim();
        
    int Vol Voltage.toInt();
        
    Serial.print(Vol);
      }

    Почему не работает, можете подсказать?

  8. #8
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    55
    Сообщений
    13,382
    Вес репутации
    10

    По умолчанию Re: Организация передачи данных по COM-порту

    startsWith()

    Описание:
    Проверяет, начинается ли строка одним из символов, содержащихся во второй строке (String).

    У Вас не один символ, а целых 3
    Последний раз редактировалось Chip; 04.03.2016 в 00:07.

  9. #9
    Пользователь Аватар для SpaceQuester
    Регистрация
    25.01.2016
    Возраст
    41
    Сообщений
    23
    Вес репутации
    114

    По умолчанию Re: Организация передачи данных по COM-порту

    С кодом на стороне Ардуины всё в порядке, вот он:
    Код:
    boolean dataReady = 0;
    char incomingChar;
    char typeMessage;
    String input = "";
    
    int defaultValueC4900ControlVoltage = 1; //[0:255]
    int FromPCValueC4900ControlVoltage = defaultValueC4900ControlVoltage;
    
    void setup()
    {
      Serial.begin(9600);
    }
    
    void loop()
    {
    
      while (Serial.available())
      {
        incomingChar = (char)Serial.read();
    
        if (incomingChar == 'F' /*|| incomingChar == 'C'*/)
        {
          dataReady = 0;
          typeMessage = incomingChar;
          input = "";
    
          continue;
        }
    
        //Serial.print("typeMessage:");
        //Serial.println(typeMessage);
    
        if (incomingChar != '!' && (typeMessage == 'F' /*|| typeMessage == 'C'*/))
        {
          input += incomingChar;
        }
        else
        {
          dataReady = 1;
        }
      }
    
      if (dataReady == 1 && typeMessage == 'F')
      {
        FromPCValueC4900ControlVoltage = input.toInt();
        Serial.print("FromPCValueC4900ControlVoltage:");
        Serial.println(FromPCValueC4900ControlVoltage);
        dataReady = 0;
        typeMessage = NULL;
      }
    
      /*if (dataReady == 1 && typeMessage == 'C')
      {
        int Vol = input.toInt();
        Serial.print("VolC:");
        Serial.println(Vol);
        dataReady = 0;
        typeMessage = NULL;
      }*/
    
      analogWrite(9, FromPCValueC4900ControlVoltage); // Необходимо подбирать коэффициэнт [0:255]
      
      int sensorRealValueC4900ControlVoltage = analogRead(A0); // [0:1023]
      //float realC4900ControlVoltage = sensorValueC4900ControlVoltage * (5.0 / 1023.0);
      Serial.print("C");
      Serial.print(sensorRealValueC4900ControlVoltage);
      Serial.println("!");
    
      int sensorSupplyOutputVoltage = analogRead(A1); // [0:1023]
      Serial.print("O");
      Serial.print(sensorSupplyOutputVoltage);
      Serial.println("!");
    
      int sensorPhotomultiplierOutputVoltage = analogRead(A2); // [0:1023]
      Serial.print("P");
      Serial.print(sensorPhotomultiplierOutputVoltage);
      Serial.println("!");
    }
    Ардуина считывает только команды F1234! и отдаёт C1234! O1234! P1234! Всё идеально работает. Теперь следующий вопрос - а как мне из MATLAB в режиме реального времени и считывать данные из COM порта и посылать туда данные?

  10. #10
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    55
    Сообщений
    13,382
    Вес репутации
    10

    По умолчанию Re: Организация передачи данных по COM-порту

    К сожалению с матлабом я не знаком

Страница 1 из 2 12 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •