Организация передачи данных по 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-порту
К сожалению с матлабом я не знаком