roboforum.ru

Технический форум по робототехнике.

Mega+Nano работа с сериал портом

Mega+Nano работа с сериал портом

olegsem » 18 июн 2011, 21:11

Добрый вечер, с Nano по seral.print на Mega вывожу строку следующего вида 26.00H,-127.00S#26.00H,-127.00S#26.00H,-127.00S#26.00H,-127.00S# и т.д. принимаю на Mega и транслирую на ком-порт компа, в Processing все нормуль получается и я эту строку раскладываю на две переменных и вывожу на экран компа следующим кодом:

void serialEvent (Serial port)
{
data = port.readStringUntil('#');
data = data.substring(0, data.length() - 3);
index = data.indexOf(",");
tempH = data.substring(0, index-2);
tempS = data.substring(index+1, data.length());
}

Тут все красиво и правильно получается и я вижу на компе заветные цифры)))

Так вот, к меге прикручен ks0108 (glcd.h) и на меге хочу из этой строки полученной по serial1 26.00H,-127.00S#26.00H,-127.00S# выщемить эти две переменные разделенные запятой, а # - конец строки, мне хотелось бы получить переменные в виде int = T1 и int = T2, чтобы выводить на ks0108. В общем нужно строку разложить на две переменные и,в принципе, не важно как.
Если кто сталкивался подскажите где читануть или лучше пример кода.
Возможно ли вообще такое закодить?

Re: Mega+Nano работа с сериал портом

olegsem » 19 июн 2011, 12:33

Упростил пока задачу и вывожу с Nano на Mega один параметр, допустим принимаю следующее значение 30.2#
Кусок кода который обрабатывает данные на Mega:

if (Serial1.available()) {
int inByte = Serial1.read();
Serial.print(inByte);
Serial.println(inByte - 48);

и в терминале вижу следующее:

513
480
46-2
502
35-13
513
480
46-2
502
35-13

т.е. 513 - это ASCII 51 = 3
480 - это ASCII 48 = 0
46-2 - это ASCII 46 = должна быть точка но выводит -2
502 - это ASCII 50 = 2
35-13 - это ASCII 35 = должен быть # но выводит -13

Пример ASCII из IDE отображает все символы правильно, как правильно отобразить символ из ASCII 35 если от него надо вычесть 48?)))

Re: Mega+Nano работа с сериал портом

Angel71 » 19 июн 2011, 20:30

вы когда си "изучали", момент с типами данных случаем не пропустили?

Re: Mega+Nano работа с сериал портом

olegsem » 19 июн 2011, 22:16

Решение может не самое удачное но пока только так получилось:
char inByte[32]; // Массив для строки в 32 символа

а здесь каждый символ по порядку (или в любой другой последовательности можно выводить куда угодно)
if (Serial1.available()) {
int i=0;
while (i<32){
inByte[i] = Serial1.read();
Serial.print(inByte[0]);
Serial.print(inByte[1]);
Serial.print(inByte[2]);
Serial.print(inByte[3]);
//Serial.print(inByte[4]);
//Serial.print(inByte[5]);
i++; }
GLCD.CursorTo(0, 0);
GLCD.print(inByte[0]);
GLCD.print(inByte[1]);
GLCD.print(inByte[2]);
GLCD.print(inByte[3]);

уже хоть что-то, теперь бы из inByte[0]+inByte[1]+inByte[2]+inByte[3] получить float, нужно как-то так что б вышло 2+9+.+2 = 29.2

Re: Mega+Nano работа с сериал портом

Angel71 » 19 июн 2011, 22:55

оно ни не удачное, оно... в общем совсем неудачное. вгоняете всё до символа # в буфер или всё сразу в буфер запихиваете. парсите, конвертируете в нужный тип и присваиваете соответствующим переменным. :) и всё это делаете посимвольно. и главное не использовать библиотечные функции по для парсинга и преобразования типов, а то вы так вечность будете стопориться на простеньких задачках.

Re: Mega+Nano работа с сериал портом

olegsem » 19 июн 2011, 23:27

Angel71 писал(а): вгоняете всё до символа # в буфер, парсите, конвертируете в нужный тип и присваиваете соответствующим переменным.

Можно примеры кода или ссылки для ардуиновсого C#? Особенно интересно про парсинг. Спасибо.

Re: Mega+Nano работа с сериал портом

Angel71 » 20 июн 2011, 01:49

можно было изначально написать за вас код. только вам уже пора учиться самому писать простые алгоритмы, пользоваться поисковиками и галопом не изучать язык.
парсинг интересен? разве что шутя, чтот на подобии
Код: Выделить всёРазвернуть
^[-+]?[0-9]\d{0,2}(\.\d{1,2})?%?$

и http://www.gammon.com.au/forum/?id=11063

Re: Mega+Nano работа с сериал портом

galex1981 » 20 июн 2011, 15:27

На С++ можно например так сделать:
Код: Выделить всёРазвернуть
   CString str1;
   str1 = "26.00H,-127.00S#26.00H,-127.00S#";
   int pos = str1.Find(',');//Найти первую запятую
   int T1 = atoi(str1.Mid(0,pos-1));//Вырезать первое число и из строки сконвертировать в int
   CString str2 =str1.Mid(pos+1,str1.Find('#')-pos-2);//Найти вхождение символа конца строки # и вырезать второе число
   int T2 = atoi(str2);//сконвертировать в int второе число


Re: Mega+Nano работа с сериал портом

olegsem » 20 июн 2011, 20:46

Вот спасибо, так более понятно.
Подскажите еще как в буфер впинуть данные до определенного символа, и выпихнуть потом в виде одной строки. Я не программист, изучаю Си для себя в рамках ардуины, поэтому плаваю пока на поверхности, потому что в литературе по ардуине такого нет и там тоже все поверхностно. Залезать глубоко в Си не могу по причине небольшого опыта в следствие этого не понимаю того, что вроде бы, для программиста очевидно, но я постепенно продвигаюсь вперед.
Вы ведь тоже когда-то с чего-то начинали же... и не получалось... но постепенно опыт и знания приходят.
Порекомендуйте пож. книги в которых си наиболее приближен к ардуиновсому, где на пальцах разжевано)))

Re: Mega+Nano работа с сериал портом

olegsem » 21 июн 2011, 13:28

Angel71, какой из комманд заявленных в кейворде для ардуины нужно обрабатывать ваш шуточный парсинг ^[-+]?[0-9]\d{0,2}(\.\d{1,2})?%?$ ???

keywords.txt
MatchState
Match
Target
GetMatch
GetCapture
GetResult
MatchCount
GlobalMatch
GlobalReplace

Какой из этих комманд провести поиск? какой разбивку строки на переменные?

Re: Mega+Nano работа с сериал портом

Grem » 21 июн 2011, 14:43

2ТС, вот вам кейворды для гугла - regex arduino

Re: Mega+Nano работа с сериал портом

olegsem » 21 июн 2011, 15:22

Понятно, видимо на Украине с таким не сталкивались если конкретно пояснить не могут))) Только умничать.
Не понимаю зачем писать это "вот вам кейворды для гугла - regex arduino" если нечего ответить..., просто встрять в разговор?

Re: Mega+Nano работа с сериал портом

Grem » 21 июн 2011, 15:39

Видимо не понятно кто здесь учится.
Хотите проверить мои знания? Окей, составьте нормальное тз, 50$ и 30 мин вашего ожидания.
Прежде чем дать кейворды для гугла, я сам посмотрел его выдачу и убедился, что там есть то, что вам надо по регэкспам.

Re: Mega+Nano работа с сериал портом

noonv » 21 июн 2011, 15:52

olegsem писал(а): если нечего ответить..., просто встрять в разговор?

чтобы научиться программировать - нужно программировать. у вас есть своя конкретная задача, так напишите своё решение. да - оно будет корявым и через какое-то время вы сами будете над ним смеяться, но это путь, который нужно пройти.
А обвинять всех, что вам не помогают - контрпродуктивно. Посылают в поисковик? может не нужно обижаться, а попробовать поискать?
:)

Re: Mega+Nano работа с сериал портом

olegsem » 21 июн 2011, 16:02

noonv, я привел свое решение выше и сам вижу что оно не самое удачное, попросил помочь хотя бы ссылками на примеры удачных решений...
Grem, если уж Вы нашли то что я ищу (как менее опытный я может быть просто этого не вижу) то почему бы не поделится ссылками вместо того что бы отправлять в поиск


Rambler\'s Top100 Mail.ru counter