Организация передачи данных по 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".
Вопросы - как организовать такую передачу данных, как формировать сообщения в канал и на другой стороне разбирать их. Как их не перепутать?
Покажите пожалуйста пример.
Нужны ли открывающие и закрывающие биты для таких сообщений?
Спасибо!
	 
	
	
	
		Re: Организация передачи данных по COM-порту
	
	
	
	
	
		Re: Организация передачи данных по COM-порту
	
	
		Windows 8.1. Но это наверное не главное. Мне бы пример такой передачи данных.
	 
	
	
	
		Re: Организация передачи данных по COM-порту
	
	
		Могу предложить скрипт по линукс
	 
	
	
	
		Re: Организация передачи данных по COM-порту
	
	
	
	
	
		Re: Организация передачи данных по COM-порту
	
	
	
	
	
		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);
  }
} 
 Почему не работает, можете подсказать?
	 
	
	
	
		Re: Организация передачи данных по COM-порту
	
	
		startsWith()
Описание:
Проверяет, начинается ли строка одним из символов, содержащихся во второй строке (String).
У Вас не один символ, а целых 3
	 
	
	
	
		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 порта и посылать туда данные?
	 
	
	
	
		Re: Организация передачи данных по COM-порту
	
	
		К сожалению с матлабом я не знаком
	 
	
	
	
		Re: Организация передачи данных по COM-порту
	
	
		Не в синтаксисе дело, а в алгоритме. Суть в том что в MATLAB нет тредов.
Вот мне нужно читать три переменные из Ардуины всегда, и когда я нажму на кнопочку в своей MATLAB программе, мне нужно отправить данные в сериал порт в Ардуину. Как это сделать?
Я за помощью обращаюсь к Вам.