Вопрос по поводу отправки данных из монитора порта.

iddqd649
Offline
Зарегистрирован: 15.08.2012

 В общем ситуация такая. Есть Arduino Uno и еще одна мозговитая штучка. Именуется Jerome. подключил по USART, а со скетчем проблемы, т.к. всю жизнь учил php а шеф тут подкинул мне проблем с этим ардуино. В общем надо через монитор порта слать на эту штучку запрос по USART и получать ответ. Мне это чтоб хоть чуть-чуть разобраться как этот USART работает, а то из инструкций ничерта не понятно (мозги под другое заточены).

leshak
Offline
Зарегистрирован: 29.09.2011
leshak
Offline
Зарегистрирован: 29.09.2011

Вообщем "для работы" хватит и этого Serial. Но вот "для отладки" - желательно иметь два порта. Один для общения с устройством, другой - для общения с компом (команды там слать, выводить отладочную инфу и т.п.), но, так как у Uno только один аппаратный USART - второй прийдется делать програмно. Гуглите библиотеку SoftwareSerial которая позволяет создавать дополнительный USART (оно же Serial) порты на цифровых пинах.

Начинал-бы я со скетча который:

  1.  Создавал дополнительный порт, с именем, нампример jSerial.
  2. Все что приходит из него - отправлял в обычный Serial.
  3. Все что приходит из Serial - отправлять в jSerial

Вообщем сделать из ардуины "прозрачный мост" между модулем Serial Monitor на компе.

Далее открываем Serial монитор. Берем мануал по командам модуля и шлем ему их руками, смотрим что он отвечает. Когда мы выяснили какие команды нам нужны - начинаем писать их уже не руками, а с помощью самой ардуины jSerial.print("KOMANDA");

 

leshak
Offline
Зарегистрирован: 29.09.2011

>Начинал-бы я со скетча который:

Кстати пример на http://arduino.cc/hu/Reference/SoftwareSerial как раз и есть реализацией подобного "моста". Только переменную, они естественно назвали не jSerial, а mySerial.

iddqd649
Offline
Зарегистрирован: 15.08.2012

 Что-то ничерта я не понял, как сделать так, чтоб он писал не Godnight moon, а то, что я вбиваю в строку в мониторе.

 

iddqd649
Offline
Зарегистрирован: 15.08.2012

 Вообще не понимаю этот язык(

leshak, может поможете со скетчем. буду сильно благодарен.

 

 

leshak
Offline
Зарегистрирован: 29.09.2011

 >он писал не Godnight moon

Ну выкинте его. Только оно мешает? Наоборот. Просто видно что "скетч запустился". Скорости правильные. Good moning это же вам в монитор отправилось, а не модулю. Рассматиривайте эту строку как пример того как можно "выводить отладочный данные". Кодга нужно понять "что делает скетч". Не нужно? Ну просто закоментируйте эту строку.
А вот "Hello World" - может помешать. Оно отправится именно модулю. Который, естественно, такую команду не поймет.
Нужно ее закоментировать, и смотреть на нее как пример "отсылать команды модулю из скетча".

iddqd649 пишет:

а то, что я вбиваю в строку в мониторе.

loop() этим уже занимается.

iddqd649 пишет:

leshak, может поможете со скетчем

А я чем занимаюсь? Но писать скетч за вас - не буду. А то зарплату у шефа, который поставил задачу, получаете вы, а решать ее буду я? Да и не вижу я "что тут писать". Написать, еще раз, этот пример? Зачем? Он, вроде, уже делает то что вы хотели. Ну разве что одну строчку закоментить ("Hello world") которая в вашем случае "не в жилу".

DenFizzz
Offline
Зарегистрирован: 17.10.2012

 Уважаемый Leshak, подскажите, пожалуйста. В продожение темы. Знакомлюсь с Ардуино и с его языком. Я реализовал коммуникацию ардуины с одним прибором посредством Usart, к ардуине подключил графический LCD. При старте на дисплей начинает сыпаться инфа из прибора - тут все нормально. У прибора есть своя система команд. К примеру если с компьютера на него гипертерминалом подать строку @restart - понятно, что произойдет. Но если я подаю ардуиной по команде Serial.println("@restart"), то прибор пишет на дисплее ардуины unknown command. При сравнении того, что приходит на процессор прибора (при подаче команды @restart) от персонального компьютера с тем, что приходит по этой же команде от ардуины увидел разницу в последнем байте - 0xE5 и 0xEB соответственно. Совсем запутался. Может я не той командой отсылаю строку?

leshak
Offline
Зарегистрирован: 29.09.2011

 Хм.. немного странно. А скорости совпдают? Точно разница только в последнем байте?

Вся остальная строка нормальная? Если бы просто "разница в последнем байте", то причина понятна, а вот если эти E5 и EB - смущают.

Ладно, давайте пока закроем на них глаза и проверим более стандартный "грабли". Вместо println, заюзаем print

Попробуйте два таких варианта:

Serial.print("@restart\n");

или 

Serial.print("@restart\r");

Внимание, без без ln в конце.

DenFizzz
Offline
Зарегистрирован: 17.10.2012

 спасибо за быстрый ответ!

Скорости 100% совпадают, тем более из прибора то инфа нормально идет, на дисплее все корректно, один в один, как гипертерминал выдает. 

Ваши подсказки попробую завтра, на работе все под рукой, там и экспериментирую. 

Я вот подумал, может попробовать (если Ваши варианты не сработают) команду serial.write(buf,len)

а команду занесу в массив buf в бинарном формате? Ваше мнение - я прав?

leshak
Offline
Зарегистрирован: 29.09.2011

 Если не поможет, то сделайте вот такое

void setup(){
 Serial.begin(ВАША_СКОРОСТЬ);
}

void loop(){
  if(Serial.available()){
     byte ch=Serial.read();
     if(ch!=13 && ch!=10) Serial.write(ch);  else Serial.print(' ');
     Serial.print("=");
     Serial.print(ch,HEX);
     Serial.print(",");
     if(ch==13 || ch==10)Serial.println();
  }
}

Залейте в дуину. Пошлите в нее команду из терминала, и покажите тут что прийдет в ответ.

leshak
Offline
Зарегистрирован: 29.09.2011

DenFizzz пишет:

а команду занесу в массив buf в бинарном формате? Ваше мнение - я прав?

Что-бы туда "занести" - нужно значть что-же именно там должно быть "по феншую". То есть вначале нужно выснить, с точностью до байта что же именно шлет терминал (раз это работает). А уж зная это можно и через buff, если поизвращатся хочется и через print правильно послать :)

 

DenFizzz
Offline
Зарегистрирован: 17.10.2012

 вот у меня есть одна думка про скорость. у меня ардуина леонарда (т.е. я в ней работаю на serial1) и работает на 16МГц, а скорость мне нужна только 115200, так как с прибора так инфа идет и поменять там скорость я не могу. А давеча где-то читал, что на 16МГц при соединении 115200 накапливаемая ошибка довольно приличная... мне бы 14.7456МГц там ошибка 0, но боюсь что если сам махну кварц, то дуина перестанет работать...

Да, код Ваш попробую, отпишусь!

leshak
Offline
Зарегистрирован: 29.09.2011

 еще просто Serial.print("@restart") можно попробовать. Что-бы уж все варианты окончания строк перебрать.

А еще, если вы дуиновским терминалом пользуетесь, можно просто посмотреть что же у вас выставленно в терминале в качестве конца строки. В нижнем правом углу, чуть левее скорости, выпадающий списк Line Ending. Что в нем стоит?

DenFizzz
Offline
Зарегистрирован: 17.10.2012

leshak пишет:

DenFizzz пишет:

а команду занесу в массив buf в бинарном формате? Ваше мнение - я прав?

Что-бы туда "занести" - нужно значть что-же именно там должно быть "по феншую". То есть вначале нужно выснить, с точностью до байта что же именно шлет терминал (раз это работает). А уж зная это можно и через buff, если поизвращатся хочется и через print правильно послать :)

 

т.е. "тупой" перевод ASCII символов в бинарный формат результата не даст? 

leshak
Offline
Зарегистрирован: 29.09.2011

 >что на 16МГц при соединении 115200 накапливаемая ошибка довольно приличная

Не знаю .Я постоянно в 115200 ставил никогда проблем не видел. 

Кроме скорости, может еще "четность и проч". не совпадать... но давайте не лезть пока в эти дебри.

Вначале лучше побуквенно, в HEX вывести "че-там терминал шлет". Потом можно свою строку, таким же макаром вывести каждый символ (вдруг файл сохранился в какой-то дикой кодировке).

Сравнить. Вот если "совпадает каждый байт", а "все равно не пашет", тогда уж на скорости/четности/кабели и проч. смотреть.

DenFizzz
Offline
Зарегистрирован: 17.10.2012

leshak пишет:

 еще просто Serial.print("@restart") можно попробовать. Что-бы уж все варианты окончания строк перебрать.

А еще, если вы дуиновским терминалом пользуетесь, можно просто посмотреть что же у вас выставленно в терминале в качестве конца строки. В нижнем правом углу, чуть левее скорости, выпадающий списк Line Ending. Что в нем стоит?

у меня не чисто дуина. У меня olimexino-Atmega32U4 - определяется как Arduino Leonardo. Схемы сравнивал - суть одна, немного элементы обвески отличаются, ноне критично, при этом распиновка один-в-один. Я, кстати, библиотеку GLCD под нее ковырял долго, пока разобрался, как пинмэппинг для леонарды прописать, в последней версии библиотеки не было поддержки маппинга леонарды. Думал голову сломаю :)

DenFizzz
Offline
Зарегистрирован: 17.10.2012

leshak пишет:

 еще просто Serial.print("@restart") можно попробовать. Что-бы уж все варианты окончания строк перебрать.

А еще, если вы дуиновским терминалом пользуетесь, можно просто посмотреть что же у вас выставленно в терминале в качестве конца строки. В нижнем правом углу, чуть левее скорости, выпадающий списк Line Ending. Что в нем стоит?

в данный момент не имею возможности, только завтра с утра - все на работе...

Но я обязательно на все Ваши вопросы отвечу.

leshak
Offline
Зарегистрирован: 29.09.2011

 

DenFizzz пишет:

т.е. "тупой" перевод ASCII символов в бинарный формат результата не даст?

[/quote]

Совершенно верно. Эта разница существует "только для человека". Как ему удобней "писать-смотреть". В памяти строка

"ABC\0" и массив {0x41,0x42,0x43,0x00} будет выглядеть одинаково. В дизасемблере-байт кодах вы разницы увидеть не сможете.

DenFizzz
Offline
Зарегистрирован: 17.10.2012

leshak пишет:

 Если не поможет, то сделайте вот такое

void setup(){
 Serial.begin(ВАША_СКОРОСТЬ);
}

void loop(){
  if(Serial.available()){
     byte ch=Serial.read();
     if(ch!=13 && ch!=10) Serial.write(ch);  else Serial.print(' ');
     Serial.print("=");
     Serial.print(ch,HEX);
     Serial.print(",");
     if(ch==13 || ch==10)Serial.println();
  }
}

Залейте в дуину. Пошлите в нее команду из терминала, и покажите тут что прийдет в ответ.

вот здесь хочу пояснить на всякий случай, может я неправильно объяснил. я пытаюсь сделать так, чтобы мне управлять прибором не с помощью ПК(гипертерминал в частности), а с помощью ардуины. забить под нажатие кнопок определенные команды.

т.е. мне связка ардуина-ПК не нужна.

А... я понял, с помощью этого кода мы поймем, что в шестнадцатиричном формате получает ардуина по команде @restart от гипертерминала.

leshak
Offline
Зарегистрирован: 29.09.2011

DenFizzz пишет:

А... я понял, с помощью этого кода мы поймем, что в шестнадцатиричном формате получает ардуина по команде @restart от гипертерминала.

Совершенно верно. Мы играем в старую игру "найди 10-ть отличий". У нас есть набор байт которые приводят к желаемому результату (терминал посылает) и есть набор байт которые не приводят к желаемому результату (ардуина посылает). Задача - найти разницу. Тогда "послать ардуиной правильно" - станет тривиальной задачей.

Естественно это в предположении что сами данные у нас не искажаются в процессе передачи. То есть дело в данных, а не канале связи.

А еще-бы я посоветовал взять, в качестве терминальной программы что-то типа http://easyelectronics.ru/terminalnye-programmy.html

Лично я пользую первую из статьи. Не скажу что "она лучше", просто "первая и мне подошла" :)

Ей удобно смотреть "побайтово" что же именно высылает ардуина. В связке с каким-нибудь виртуальным-компортом/виртуальным нуль модемным кабелем - можно посмотреть и "что шлет какая-то программа в ком.порт".

Вообщем просто "инструмент". Можно и без него (играясь со скетчами как в примерах выше), но "подобраный инструментарий" очень сокращает время :)

 А еще проверте что вы "ДО команды" ничего не шлете. Может где-то выше по коду затесался какой-нибудь Serial.println("Device ready") и т.п.

А еще, особенно на 115200, при самом открытие порта/установки связи бывает пробегает пара "мусорных байтов"/"помех". Попробуйте послать команду два раза (с небольшой паузой). Возможно, все-таки, проблема не в самой команде, а в той что "ей предшествовало".

DenFizzz
Offline
Зарегистрирован: 17.10.2012

Уважаемый Leshak (к сожалению не знаю, как Вас зовут)! Огромное спасибо за Ваши советы. Сегодня все получилось, работает как часы. Проблемы была в том, что при включении ардуино плевал в порт мусор, и, отправляемая мной впоследствии команда, становилась больше ровно на тот самый мусор :). Простое добавление перед командой строки Serial1.print('\r'); решило задачу.

leshak
Offline
Зарегистрирован: 29.09.2011

DenFizzz пишет:

Уважаемый Leshak (к сожалению не знаю, как Вас зовут)!

"Хоть горшком назови, только в печь не ставь." ;)

Если присмотрется к нику - можно угадать (подсказка: в русском языке букву "ё" часто заменяеют не "e")

Но это не важно :) Я же сам выбрал этот ник :) Значит такое обращение меня вполне устраивает

DenFizzz пишет:

Огромное спасибо за Ваши советы. Сегодня все получилось, работает как часы. Проблемы была в том, что при включении ардуино плевал в порт мусор, и, отправляемая мной впоследствии команда, становилась больше ровно на тот самый мусор :). Простое добавление перед командой строки Serial1.print('\r'); решило задачу.

Рад что помогло. Ради вот таких слов и стараемся :)

Еще можно попробовать, перед/после Serial.begin() какую-то паузу воткнуть (delay(200) там). Авось избавит от мусора/наводок.  Serial.flush() попытатся сделать (смутно представляю чем это поможет, но "почему не попробовать?" :))

Наверное можно еще и "аппаратно" его придавить. Поднятуть TX пин (дуины) к земле резистором килоом на 10-ть. Но тут, возможно,   более "железно просветленные" подскажут как с этим боротся.

DenFizzz
Offline
Зарегистрирован: 17.10.2012

leshak пишет:

DenFizzz пишет:

Уважаемый Leshak (к сожалению не знаю, как Вас зовут)!

"Хоть горшком назови, только в печь не ставь." ;)

Если присмотрется к нику - можно угадать (подсказка: в русском языке букву "ё" часто заменяеют не "e")

Но это не важно :) Я же сам выбрал этот ник :) Значит такое обращение меня вполне устраивает

DenFizzz пишет:

Огромное спасибо за Ваши советы. Сегодня все получилось, работает как часы. Проблемы была в том, что при включении ардуино плевал в порт мусор, и, отправляемая мной впоследствии команда, становилась больше ровно на тот самый мусор :). Простое добавление перед командой строки Serial1.print('\r'); решило задачу.

Рад что помогло. Ради вот таких слов и стараемся :)

Еще можно попробовать, перед/после Serial.begin() какую-то паузу воткнуть (delay(200) там). Авось избавит от мусора/наводок.  Serial.flush() попытатся сделать (смутно представляю чем это поможет, но "почему не попробовать?" :))

Наверное можно еще и "аппаратно" его придавить. Поднятуть TX пин (дуины) к земле резистором килоом на 10-ть. Но тут, возможно,   более "железно просветленные" подскажут как с этим боротся.

Алексей, доброго времени суток!

Решил погрузиться, так сказать, в дебри. Написал следующий скетч:

#include <bender.h>
#include <glcd.h>
#include <glcd_Buildinfo.h>
#include <glcd_Config.h>
#include <fonts\SystemFont5x7.h>
#include <bitmaps\intro.h>
#include <SPI.h>
#define lenght 100


char stringUart[lenght+1];
Image_t icon;

int count;
void setup()
{

  GLCD.Init();
  icon = intro;
    introScreen();
  GLCD.SelectFont(SystemFont5x7);
  Serial1.begin(115200);
  Serial1.print("\r");
  GLCD.ClearScreen();
  delay(2000);
  Serial1.print("@restart\r");
  GLCD.CursorTo(0, 8);
  GLCD.SetTextMode(SCROLL_UP);
  
}

void loop()
{

  count = 0;
  do
  {
    while (Serial1.available()==0);

    stringUart[count] = Serial1.read();
    if (stringUart[count]=='\r'||stringUart[count]=='\n'||stringUart[count]=='\t'||stringUart[count]=='\0') break;
  }  
  while (++count < lenght);
  stringUart[count]=0;
  GLCD.println(stringUart);


}

void introScreen(){  
  GLCD.DrawBitmap(icon, 1,1);
  delay(5000);
  GLCD.ClearScreen(); 
}

 

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

Да и мой скетч может неправильно написан, можно Ваше заключение получить?

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

 Если теряется информация, значит Вы ее не успеваете принимать. Попробуйте увеличить кольцевой буфер последовательного порта (в файле hardware\arduino\cores\arduino\HardwareSerial.cpp константа SERIAL_BUFFER_SIZE) или снижайте скорость соединения.

P.S. Не знаю, как leshak, а меня зовут Алексей :) Рекомендую все же по нику обращаться - путаницы не будет :)))

DenFizzz
Offline
Зарегистрирован: 17.10.2012

AlexFisher пишет:

 Если теряется информация, значит Вы ее не успеваете принимать. Попробуйте увеличить кольцевой буфер последовательного порта (в файле hardware\arduino\cores\arduino\HardwareSerial.cpp константа SERIAL_BUFFER_SIZE) или снижайте скорость соединения.

P.S. Не знаю, как leshak, а меня зовут Алексей :) Рекомендую все же по нику обращаться - путаницы не будет :)))

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

Вопрос, сколько времени тратится процессором на передачу на LCD одного байта?

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Пока память не кончится :) Можно увеличить, наверно, до половины памяти... но лучше понемножку. Не думаю, что больше 256 - хорошая идея. Попробуйте увеличивать шагами по 32. 

DenFizzz
Offline
Зарегистрирован: 17.10.2012

AlexFisher пишет:

Пока память не кончится :) Можно увеличить, наверно, до половины памяти... но лучше понемножку. Не думаю, что больше 256 - хорошая идея. Попробуйте увеличивать шагами по 32. 

Ок. Пока дополнял последний пост, Вы уже успели ответить. Поэтому повторю вопрос здесь. И дополню его :)

Как вычислить сколько времени тратится процессором на отправку одного байта в LCD? Во время передачи в дисплей процессор обрабатывает входящую через Serial иннформацию? Или это возможно сделать только на прерываниях?

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

А ХЗ сколько потратится на передачу байта... от дисплея зависит. Напишите простенькую прогу для измерения производительности:

void loop()
{
  long int start=micros();
  for (int i=0; i<1000; i++)
  {
    //здесь посылаем байт или то, скорость посылки чего хотим измерить
  }
  long int time=micros()-start;
  Serial.print("Время одной операции (мкс):");
  Serial.println(time/1000.0);
}

 Входящий Serial работает по прерыванию, для этого и нужен буфер.

DenFizzz
Offline
Зарегистрирован: 17.10.2012

AlexFisher пишет:

 Если теряется информация, значит Вы ее не успеваете принимать. Попробуйте увеличить кольцевой буфер последовательного порта (в файле hardware\arduino\cores\arduino\HardwareSerial.cpp константа SERIAL_BUFFER_SIZE) или снижайте скорость соединения.

P.S. Не знаю, как leshak, а меня зовут Алексей :) Рекомендую все же по нику обращаться - путаницы не будет :)))

AlexFisher, спасибо за подсказку, сработало. По умолчанию размер буфера был 16, поставил 32 - этого хватило.

Kitam1n
Offline
Зарегистрирован: 11.04.2012

Господа, SOS!

Использую Arduino UNO(далее Arduino) для управления стороним МК(далее МК) используя SoftwareSerial.

Если предварительно запрограмировать Arduino, например:

mySerial.write((int)128);

mySerial.write(130);

то МК все понимает и отрабатывает как положено(притом не важно стоит "int" или нет).

Но главное, что необходимо управлять МК с компьютера в режиме реального времени, хочу использовать Arduino UNO в качестве моста USB<=>UART.

Загрузил пример от сюда: http://arduino.cc/en/Reference/SoftwareSerial

Пример простой и понятный, но не работает :(

Шлю в монитор команды (те же 128 или 130), МК глух.

Скорости совподают.

Что бы видить что отправляю заменил в скетче строки

void loop() // run over and over
{
  if (mySerial.available())
    Serial.write(mySerial.read());
  if (Serial.available())
    mySerial.write(Serial.read());
}

на:

void loop() // run over and over
{
  if (mySerial.available())
    Serial.write(mySerial.read());
  if (Serial.available())
  {
    mySerial.write(Serial.read());
    Serial.println(Serial.read());
  }
}

Смотрю в монитор и вижу что возвращаются не понятные цифры, совсем не то что отправлял, 10, 50...

В чем может быть проблема?

step962
Offline
Зарегистрирован: 23.05.2011

Kitam1n пишет:

Шлю в монитор команды (те же 128 или 130), МК глух.

Как понимать эту вашу строку? Как то, что вы ручками набиваете "128" (ну или "130") в Arduino Serial Monitor и затем, нажимая Enter, отправляете это дело микроконтроллеру?

Перво-наперво попробуйте разобраться в разнице между числом и его текстовым представлением - очень похоже, что у вас где-то здесь собака порылась.

Во-вторых, почитайте, как обрабатывают передаваемую им информацию функции Serial.print() и Serial.write() (ну и Serial.read() заодно - пригодится на будущее) и попробуйте уяснить для себя разницу между ними.

Ну а в-третьих, если хотите конкретного ответа, то и данные предоставляйте конкретные:

- не ссылку на скетч, на основе которого вы соорудили собственный скетч, а именно тот самый сооруженный вами собственный скетч;

- не свободное описание ваших действий и соответствующих реакций микроконтроллера а подробный и точный до последней буковки журнал ввода-вывода.

А пока  - недостаточно действительно полезной информации, которая помогла бы однозначно идентифицировать суть вашей проблемы.

Хотя ...

Kitam1n
Offline
Зарегистрирован: 11.04.2012

step962 пишет:

вы ручками набиваете "128" (ну или "130") в Arduino Serial Monitor и затем, нажимая Enter, отправляете это дело микроконтроллеру?

СПАСИБО!!!

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

Накидал простой исходник на С# в визуал студии который отправляет мои "128" и "130" в Com-порт и все заработало.

Я догадывался что дело в этом но мне казалось что не правильно был выставлен тип данных, поэтому отправляемые команды переводились то по таблице ASCII, то еще как то.

step962 пишет:

Перво-наперво попробуйте разобраться в разнице между числом и его текстовым представлением - очень похоже, что у вас где-то здесь собака порылась.

Правильно я понимаю что цифры отправленные в сириал-монитор воспринимаются как текст, разбиваются по символьно и уже каждый символ обрабатывается?

step962 пишет:

Во-вторых, почитайте, как обрабатывают передаваемую им информацию функции Serial.print() и Serial.write() (ну и Serial.read() заодно - пригодится на будущее) и попробуйте уяснить для себя разницу между ними.

Вот с разницей не очень понятно, не для програмиста описание на сайте весьма поверхостное.

print - передает как ASCII, т.е. это уже не число, а текст.

write - как бинарный код, т.е. допустим цифра 130 перводится в 001100010011001100110000.

(вот здесь есть переводчик в бинар http://php-zametki.ru/binary-text.html)

а read уже это считывает.

Так?

На будущее, реально ли отправлять мои 130 через сериал-порт? Как нужно слать или как как нужно изменить скетч что бы цифры отправленные в сериал-монитор так и отправлялись дальше? А не разберались по символам и переводились..?

 

Еще раз спасибо!

step962
Offline
Зарегистрирован: 23.05.2011

Kitam1n пишет:

 

СПАСИБО!!!

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

 

Да бога ради - используйте любой инструмент. Только делайте это, во-первых, с учетом особенностей используемого инструмента и, во-вторых, если просите помощи, то старайтесь с максимальной точностью описывать ситуацию. Ибо многие вещи, само собой разумеющиеся для вас, отнюдь не являются таковыми для тех людей, которые могли бы вам помочь (ну что тут поделаешь - они давно забыли о тех граблях, на которые тоже наступали в самом начале своего пути).

Это как с print()/write(). Вот вы пишете:

Цитата:

print - передает как ASCII, т.е. это уже не число, а текст.

write - как бинарный код, т.е. допустим цифра 130 перводится в 001100010011001100110000.

а в действительности:

print() передает число 130 как последовательность символов '1', '3' и '0', т.е. (в битах) 00110001 00110011 00110000 (пробелы вставлены для удобства восприятия).

write() передаст число 130 одним единственным байтом 0x82, т.е. (в битах) 10000010.

Цитата:

На будущее, реально ли отправлять мои 130 через сериал-порт? Как нужно слать или как как нужно изменить скетч что бы цифры отправленные в сериал-монитор так и отправлялись дальше? А не разберались по символам и переводились..?

Все реально - необходимо лишь научиться работать с имеющимися инструментами. 
В противном случае будете копировать куски кода из работающих скетчей и недоумевать, почему же они у вас не работают.

PS: а журнал ввода-вывода (ну хотя бы выдержку из него) вы так и не привели.

Kitam1n
Offline
Зарегистрирован: 11.04.2012

step962 пишет:

если просите помощи, то старайтесь с максимальной точностью описывать ситуацию

Буду стараться

step962 пишет:

делайте это, во-первых, с учетом особенностей используемого инструмента

Так а что делает Сериал-монитор? print() ?

Если так то как же мне отправить мои 130 если это в любом случае воспринимается как символы а не как цифры, да еще разбивается? Добавить в скетч функцию которая будет обратно склеивать символы и переводить их в число? Или слать в сериал такой символ который будет переведен в нужное мне число? для 130 по таблице ASCII это не лепый символ :(, если я вообще говорю о чем то хоть капельку близком к решению

step962 пишет:

PS: а журнал ввода-вывода (ну хотя бы выдержку из него) вы так и не привели.

Скажите где этот журнал взять? Я тут же приведу!

step962
Offline
Зарегистрирован: 23.05.2011

Kitam1n пишет:

Скажите где этот журнал взять? Я тут же приведу!

из Arduino Serial Monitor скопировать. Потом в пост вставить. Ну, и дополнить текст комментариями, поясняющими, какая порция информации от Arduino получена в ответ на ту или иную команду, отправленную в Arduino. Чтобы в результате можно было увидеть что-то вроде

       // вывод при запуске скетча
mBeg: 608
mEnd: 1633
vBuf: 630
sBuf: 579
      // ответ на команду sf400 (set frequency to 400 Hz)
Frequency is set to 400 Hz
      // ответ на команду gi (get information)
Frequency is  400
Trigger pin is  8
Start delay is  0
Scanmode is 0 (byte)

 

Kitam1n
Offline
Зарегистрирован: 11.04.2012

Так я не пользуюсь сериалмониторм больше, и запустить его не могу т.к. у меня программа (C# от visual studio) к COM-порту подключена.

step962
Offline
Зарегистрирован: 23.05.2011

Так что мешает в программе сделать вывод в файл??? Причем и выходной информации (то что в порт отправляется) и входной (то что из порта читается).

Kitam1n
Offline
Зарегистрирован: 11.04.2012

В VisualStudio? Отсутствие знаний о том как это сделать :(

А вообще эта информация конечно была бы очень полезна для отладки.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Да ну, это на Шарпе то? В сравнении с С++, Шарп намного проще.

Для начала хотя бы введите в cs файле слово File и посмотрите подсказку ;)

Это всякие delegate и события обрабатывать - есть некоторые проблемы, а записать в файл, поищите в интернете, найдете кучу примеров.

Я писал недавно монитор для библиотеки Firmata, вот это был гемор, споткнулся на проблемах чисто Шарповских. Либо плюну и на родном С++ напишу.

 

leshak
Offline
Зарегистрирован: 29.09.2011

>Отсутствие знаний о том как это сделать

А что же тут поделать кроме "приобретать".

System.IO.File.AppendAllText(logFilePath, stringFromSerial); // дописали в файла
Console.WriteLine(stringFromSerial); // вывели на экран если у нас консольная аппликух
System.Diagnostics.Trace.WriteLine(stringFromSerial); // вывели в окошко "Debug" студии, если мы отлаживаем эту аппликуху
Text1.Text+=stringFromSerial; // это если у нас какая-то формочка и на ней есть TextBox с именем Text1

Проблемы могут быть только с последней строкой. Обновлять визуальные элементы можно только из главного потока UI. А скорее всего желание будет обновить из какого-нибудь обработчика событий serial port-а, который, естественно в своем потоке запускается. Как решить эту проблему - зависит уже от того на чем вы формочку делали WinForms или WPF. Просто гуглите как обновлять UI из других потоков. Например для WPF может помочь статья http://msdn.microsoft.com/en-us/magazine/cc163328.aspx

Александр597
Offline
Зарегистрирован: 30.01.2016

AlexFisher пишет:

 Если теряется информация, значит Вы ее не успеваете принимать. Попробуйте увеличить кольцевой буфер последовательного порта (в файле hardware\arduino\cores\arduino\HardwareSerial.cpp константа SERIAL_BUFFER_SIZE) или снижайте скорость соединения.

P.S. Не знаю, как leshak, а меня зовут Алексей :) Рекомендую все же по нику обращаться - путаницы не будет :)))

а если увеличивать буфер то какое из двух значений увеличивать? в файле написаны две константы

 
  #define SERIAL_BUFFER_SIZE 16
#else
  #define SERIAL_BUFFER_SIZE 64
evgenii0904
Offline
Зарегистрирован: 29.03.2020

день добрый !

не могу разобраться с com portom при в воде 1 символа выдает мне 

данный который ввожу и по мимо "LINE FEED"

подскажите как исправить

да кстате использую arduino nano

..................................................

 

Moderator : пожалуйста, вставьте код правильно (возможно, новым сообщением в тему), 

 
 
...........................................................................
данные с порта  вводил 0 ,0, 1, 1, 2.
LED OFF
ERROR
LED OFF
ERROR
LED ON
ERROR
LED ON
ERROR
ERROR
ERROR