Вопрос по поводу отправки данных из монитора порта.
- Войдите на сайт для отправки комментариев
Чт, 16/08/2012 - 12:07
В общем ситуация такая. Есть Arduino Uno и еще одна мозговитая штучка. Именуется Jerome. подключил по USART, а со скетчем проблемы, т.к. всю жизнь учил php а шеф тут подкинул мне проблем с этим ардуино. В общем надо через монитор порта слать на эту штучку запрос по USART и получать ответ. Мне это чтоб хоть чуть-чуть разобраться как этот USART работает, а то из инструкций ничерта не понятно (мозги под другое заточены).
http://arduino.ru/Reference/Serial
Вообщем "для работы" хватит и этого Serial. Но вот "для отладки" - желательно иметь два порта. Один для общения с устройством, другой - для общения с компом (команды там слать, выводить отладочную инфу и т.п.), но, так как у Uno только один аппаратный USART - второй прийдется делать програмно. Гуглите библиотеку SoftwareSerial которая позволяет создавать дополнительный USART (оно же Serial) порты на цифровых пинах.
Начинал-бы я со скетча который:
Вообщем сделать из ардуины "прозрачный мост" между модулем Serial Monitor на компе.
Далее открываем Serial монитор. Берем мануал по командам модуля и шлем ему их руками, смотрим что он отвечает. Когда мы выяснили какие команды нам нужны - начинаем писать их уже не руками, а с помощью самой ардуины jSerial.print("KOMANDA");
>Начинал-бы я со скетча который:
Кстати пример на http://arduino.cc/hu/Reference/SoftwareSerial как раз и есть реализацией подобного "моста". Только переменную, они естественно назвали не jSerial, а mySerial.
Что-то ничерта я не понял, как сделать так, чтоб он писал не Godnight moon, а то, что я вбиваю в строку в мониторе.
Вообще не понимаю этот язык(
leshak, может поможете со скетчем. буду сильно благодарен.
>он писал не Godnight moon
Ну выкинте его. Только оно мешает? Наоборот. Просто видно что "скетч запустился". Скорости правильные. Good moning это же вам в монитор отправилось, а не модулю. Рассматиривайте эту строку как пример того как можно "выводить отладочный данные". Кодга нужно понять "что делает скетч". Не нужно? Ну просто закоментируйте эту строку.
А вот "Hello World" - может помешать. Оно отправится именно модулю. Который, естественно, такую команду не поймет.
Нужно ее закоментировать, и смотреть на нее как пример "отсылать команды модулю из скетча".
а то, что я вбиваю в строку в мониторе.
loop() этим уже занимается.
leshak, может поможете со скетчем
А я чем занимаюсь? Но писать скетч за вас - не буду. А то зарплату у шефа, который поставил задачу, получаете вы, а решать ее буду я? Да и не вижу я "что тут писать". Написать, еще раз, этот пример? Зачем? Он, вроде, уже делает то что вы хотели. Ну разве что одну строчку закоментить ("Hello world") которая в вашем случае "не в жилу".
Уважаемый Leshak, подскажите, пожалуйста. В продожение темы. Знакомлюсь с Ардуино и с его языком. Я реализовал коммуникацию ардуины с одним прибором посредством Usart, к ардуине подключил графический LCD. При старте на дисплей начинает сыпаться инфа из прибора - тут все нормально. У прибора есть своя система команд. К примеру если с компьютера на него гипертерминалом подать строку @restart - понятно, что произойдет. Но если я подаю ардуиной по команде Serial.println("@restart"), то прибор пишет на дисплее ардуины unknown command. При сравнении того, что приходит на процессор прибора (при подаче команды @restart) от персонального компьютера с тем, что приходит по этой же команде от ардуины увидел разницу в последнем байте - 0xE5 и 0xEB соответственно. Совсем запутался. Может я не той командой отсылаю строку?
Хм.. немного странно. А скорости совпдают? Точно разница только в последнем байте?
Вся остальная строка нормальная? Если бы просто "разница в последнем байте", то причина понятна, а вот если эти E5 и EB - смущают.
Ладно, давайте пока закроем на них глаза и проверим более стандартный "грабли". Вместо println, заюзаем print
Попробуйте два таких варианта:
Serial.print("@restart\n");
или
Serial.print("@restart\r");
Внимание, без без ln в конце.
спасибо за быстрый ответ!
Скорости 100% совпадают, тем более из прибора то инфа нормально идет, на дисплее все корректно, один в один, как гипертерминал выдает.
Ваши подсказки попробую завтра, на работе все под рукой, там и экспериментирую.
Я вот подумал, может попробовать (если Ваши варианты не сработают) команду serial.write(buf,len)
а команду занесу в массив buf в бинарном формате? Ваше мнение - я прав?
Если не поможет, то сделайте вот такое
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(); } }Залейте в дуину. Пошлите в нее команду из терминала, и покажите тут что прийдет в ответ.
а команду занесу в массив buf в бинарном формате? Ваше мнение - я прав?
Что-бы туда "занести" - нужно значть что-же именно там должно быть "по феншую". То есть вначале нужно выснить, с точностью до байта что же именно шлет терминал (раз это работает). А уж зная это можно и через buff, если поизвращатся хочется и через print правильно послать :)
вот у меня есть одна думка про скорость. у меня ардуина леонарда (т.е. я в ней работаю на serial1) и работает на 16МГц, а скорость мне нужна только 115200, так как с прибора так инфа идет и поменять там скорость я не могу. А давеча где-то читал, что на 16МГц при соединении 115200 накапливаемая ошибка довольно приличная... мне бы 14.7456МГц там ошибка 0, но боюсь что если сам махну кварц, то дуина перестанет работать...
Да, код Ваш попробую, отпишусь!
еще просто Serial.print("@restart") можно попробовать. Что-бы уж все варианты окончания строк перебрать.
А еще, если вы дуиновским терминалом пользуетесь, можно просто посмотреть что же у вас выставленно в терминале в качестве конца строки. В нижнем правом углу, чуть левее скорости, выпадающий списк Line Ending. Что в нем стоит?
а команду занесу в массив buf в бинарном формате? Ваше мнение - я прав?
Что-бы туда "занести" - нужно значть что-же именно там должно быть "по феншую". То есть вначале нужно выснить, с точностью до байта что же именно шлет терминал (раз это работает). А уж зная это можно и через buff, если поизвращатся хочется и через print правильно послать :)
т.е. "тупой" перевод ASCII символов в бинарный формат результата не даст?
>что на 16МГц при соединении 115200 накапливаемая ошибка довольно приличная
Не знаю .Я постоянно в 115200 ставил никогда проблем не видел.
Кроме скорости, может еще "четность и проч". не совпадать... но давайте не лезть пока в эти дебри.
Вначале лучше побуквенно, в HEX вывести "че-там терминал шлет". Потом можно свою строку, таким же макаром вывести каждый символ (вдруг файл сохранился в какой-то дикой кодировке).
Сравнить. Вот если "совпадает каждый байт", а "все равно не пашет", тогда уж на скорости/четности/кабели и проч. смотреть.
еще просто Serial.print("@restart") можно попробовать. Что-бы уж все варианты окончания строк перебрать.
А еще, если вы дуиновским терминалом пользуетесь, можно просто посмотреть что же у вас выставленно в терминале в качестве конца строки. В нижнем правом углу, чуть левее скорости, выпадающий списк Line Ending. Что в нем стоит?
у меня не чисто дуина. У меня olimexino-Atmega32U4 - определяется как Arduino Leonardo. Схемы сравнивал - суть одна, немного элементы обвески отличаются, ноне критично, при этом распиновка один-в-один. Я, кстати, библиотеку GLCD под нее ковырял долго, пока разобрался, как пинмэппинг для леонарды прописать, в последней версии библиотеки не было поддержки маппинга леонарды. Думал голову сломаю :)
еще просто Serial.print("@restart") можно попробовать. Что-бы уж все варианты окончания строк перебрать.
А еще, если вы дуиновским терминалом пользуетесь, можно просто посмотреть что же у вас выставленно в терминале в качестве конца строки. В нижнем правом углу, чуть левее скорости, выпадающий списк Line Ending. Что в нем стоит?
в данный момент не имею возможности, только завтра с утра - все на работе...
Но я обязательно на все Ваши вопросы отвечу.
т.е. "тупой" перевод ASCII символов в бинарный формат результата не даст?
[/quote]
Совершенно верно. Эта разница существует "только для человека". Как ему удобней "писать-смотреть". В памяти строка
"ABC\0" и массив {0x41,0x42,0x43,0x00} будет выглядеть одинаково. В дизасемблере-байт кодах вы разницы увидеть не сможете.
Если не поможет, то сделайте вот такое
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 от гипертерминала.
А... я понял, с помощью этого кода мы поймем, что в шестнадцатиричном формате получает ардуина по команде @restart от гипертерминала.
Совершенно верно. Мы играем в старую игру "найди 10-ть отличий". У нас есть набор байт которые приводят к желаемому результату (терминал посылает) и есть набор байт которые не приводят к желаемому результату (ардуина посылает). Задача - найти разницу. Тогда "послать ардуиной правильно" - станет тривиальной задачей.
Естественно это в предположении что сами данные у нас не искажаются в процессе передачи. То есть дело в данных, а не канале связи.
А еще-бы я посоветовал взять, в качестве терминальной программы что-то типа http://easyelectronics.ru/terminalnye-programmy.html
Лично я пользую первую из статьи. Не скажу что "она лучше", просто "первая и мне подошла" :)
Ей удобно смотреть "побайтово" что же именно высылает ардуина. В связке с каким-нибудь виртуальным-компортом/виртуальным нуль модемным кабелем - можно посмотреть и "что шлет какая-то программа в ком.порт".
Вообщем просто "инструмент". Можно и без него (играясь со скетчами как в примерах выше), но "подобраный инструментарий" очень сокращает время :)
А еще проверте что вы "ДО команды" ничего не шлете. Может где-то выше по коду затесался какой-нибудь Serial.println("Device ready") и т.п.
А еще, особенно на 115200, при самом открытие порта/установки связи бывает пробегает пара "мусорных байтов"/"помех". Попробуйте послать команду два раза (с небольшой паузой). Возможно, все-таки, проблема не в самой команде, а в той что "ей предшествовало".
Уважаемый Leshak (к сожалению не знаю, как Вас зовут)! Огромное спасибо за Ваши советы. Сегодня все получилось, работает как часы. Проблемы была в том, что при включении ардуино плевал в порт мусор, и, отправляемая мной впоследствии команда, становилась больше ровно на тот самый мусор :). Простое добавление перед командой строки Serial1.print('\r'); решило задачу.
Уважаемый Leshak (к сожалению не знаю, как Вас зовут)!
"Хоть горшком назови, только в печь не ставь." ;)
Если присмотрется к нику - можно угадать (подсказка: в русском языке букву "ё" часто заменяеют не "e")
Но это не важно :) Я же сам выбрал этот ник :) Значит такое обращение меня вполне устраивает
Огромное спасибо за Ваши советы. Сегодня все получилось, работает как часы. Проблемы была в том, что при включении ардуино плевал в порт мусор, и, отправляемая мной впоследствии команда, становилась больше ровно на тот самый мусор :). Простое добавление перед командой строки Serial1.print('\r'); решило задачу.
Рад что помогло. Ради вот таких слов и стараемся :)
Еще можно попробовать, перед/после Serial.begin() какую-то паузу воткнуть (delay(200) там). Авось избавит от мусора/наводок. Serial.flush() попытатся сделать (смутно представляю чем это поможет, но "почему не попробовать?" :))
Наверное можно еще и "аппаратно" его придавить. Поднятуть TX пин (дуины) к земле резистором килоом на 10-ть. Но тут, возможно, более "железно просветленные" подскажут как с этим боротся.
Уважаемый Leshak (к сожалению не знаю, как Вас зовут)!
"Хоть горшком назови, только в печь не ставь." ;)
Если присмотрется к нику - можно угадать (подсказка: в русском языке букву "ё" часто заменяеют не "e")
Но это не важно :) Я же сам выбрал этот ник :) Значит такое обращение меня вполне устраивает
Огромное спасибо за Ваши советы. Сегодня все получилось, работает как часы. Проблемы была в том, что при включении ардуино плевал в порт мусор, и, отправляемая мной впоследствии команда, становилась больше ровно на тот самый мусор :). Простое добавление перед командой строки 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(); }Вопрос в следующем - в момент вывода строк на экран, в порт уже что-то приходит, соответственно, часть информации теряется. Как сделать буферизацию на время вывода изображения? Полученных мною азов языка не хватает, чтобы сообразить. Может у Вас есть ссылка на реализацию такого алгоритма, чтобы разобраться?
Да и мой скетч может неправильно написан, можно Ваше заключение получить?
Если теряется информация, значит Вы ее не успеваете принимать. Попробуйте увеличить кольцевой буфер последовательного порта (в файле hardware\arduino\cores\arduino\HardwareSerial.cpp константа SERIAL_BUFFER_SIZE) или снижайте скорость соединения.
P.S. Не знаю, как leshak, а меня зовут Алексей :) Рекомендую все же по нику обращаться - путаницы не будет :)))
Если теряется информация, значит Вы ее не успеваете принимать. Попробуйте увеличить кольцевой буфер последовательного порта (в файле hardware\arduino\cores\arduino\HardwareSerial.cpp константа SERIAL_BUFFER_SIZE) или снижайте скорость соединения.
P.S. Не знаю, как leshak, а меня зовут Алексей :) Рекомендую все же по нику обращаться - путаницы не будет :)))
Спасибо, попробую увеличить буфер. Скорость снижать не могу, подключаемый прибор работает тоько на заданной скорости. В каких пределах можно менять параметр буфера?ъ
Вопрос, сколько времени тратится процессором на передачу на LCD одного байта?
Пока память не кончится :) Можно увеличить, наверно, до половины памяти... но лучше понемножку. Не думаю, что больше 256 - хорошая идея. Попробуйте увеличивать шагами по 32.
Пока память не кончится :) Можно увеличить, наверно, до половины памяти... но лучше понемножку. Не думаю, что больше 256 - хорошая идея. Попробуйте увеличивать шагами по 32.
Ок. Пока дополнял последний пост, Вы уже успели ответить. Поэтому повторю вопрос здесь. И дополню его :)
Как вычислить сколько времени тратится процессором на отправку одного байта в LCD? Во время передачи в дисплей процессор обрабатывает входящую через Serial иннформацию? Или это возможно сделать только на прерываниях?
А ХЗ сколько потратится на передачу байта... от дисплея зависит. Напишите простенькую прогу для измерения производительности:
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 работает по прерыванию, для этого и нужен буфер.
Если теряется информация, значит Вы ее не успеваете принимать. Попробуйте увеличить кольцевой буфер последовательного порта (в файле hardware\arduino\cores\arduino\HardwareSerial.cpp константа SERIAL_BUFFER_SIZE) или снижайте скорость соединения.
P.S. Не знаю, как leshak, а меня зовут Алексей :) Рекомендую все же по нику обращаться - путаницы не будет :)))
AlexFisher, спасибо за подсказку, сработало. По умолчанию размер буфера был 16, поставил 32 - этого хватило.
Господа, SOS!
Использую Arduino UNO(далее Arduino) для управления стороним МК(далее МК) используя SoftwareSerial.
Если предварительно запрограмировать Arduino, например:
то МК все понимает и отрабатывает как положено(притом не важно стоит "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...
В чем может быть проблема?
Шлю в монитор команды (те же 128 или 130), МК глух.
Как понимать эту вашу строку? Как то, что вы ручками набиваете "128" (ну или "130") в Arduino Serial Monitor и затем, нажимая Enter, отправляете это дело микроконтроллеру?
Перво-наперво попробуйте разобраться в разнице между числом и его текстовым представлением - очень похоже, что у вас где-то здесь собака порылась.
Во-вторых, почитайте, как обрабатывают передаваемую им информацию функции Serial.print() и Serial.write() (ну и Serial.read() заодно - пригодится на будущее) и попробуйте уяснить для себя разницу между ними.
Ну а в-третьих, если хотите конкретного ответа, то и данные предоставляйте конкретные:
- не ссылку на скетч, на основе которого вы соорудили собственный скетч, а именно тот самый сооруженный вами собственный скетч;
- не свободное описание ваших действий и соответствующих реакций микроконтроллера а подробный и точный до последней буковки журнал ввода-вывода.
А пока - недостаточно действительно полезной информации, которая помогла бы однозначно идентифицировать суть вашей проблемы.
Хотя ...
вы ручками набиваете "128" (ну или "130") в Arduino Serial Monitor и затем, нажимая Enter, отправляете это дело микроконтроллеру?
СПАСИБО!!!
Вот я лох позорный, столько времени убил на это. А всего навсего нужно было слать не через монитор, а ведь он (сериал-монитор) мне и не нужен будет, просто пытался его использовать для отладки.
Накидал простой исходник на С# в визуал студии который отправляет мои "128" и "130" в Com-порт и все заработало.
Я догадывался что дело в этом но мне казалось что не правильно был выставлен тип данных, поэтому отправляемые команды переводились то по таблице ASCII, то еще как то.
Перво-наперво попробуйте разобраться в разнице между числом и его текстовым представлением - очень похоже, что у вас где-то здесь собака порылась.
Правильно я понимаю что цифры отправленные в сириал-монитор воспринимаются как текст, разбиваются по символьно и уже каждый символ обрабатывается?
Во-вторых, почитайте, как обрабатывают передаваемую им информацию функции Serial.print() и Serial.write() (ну и Serial.read() заодно - пригодится на будущее) и попробуйте уяснить для себя разницу между ними.
Вот с разницей не очень понятно, не для програмиста описание на сайте весьма поверхостное.
print - передает как ASCII, т.е. это уже не число, а текст.
write - как бинарный код, т.е. допустим цифра 130 перводится в 001100010011001100110000.
(вот здесь есть переводчик в бинар http://php-zametki.ru/binary-text.html)
а read уже это считывает.
Так?
На будущее, реально ли отправлять мои 130 через сериал-порт? Как нужно слать или как как нужно изменить скетч что бы цифры отправленные в сериал-монитор так и отправлялись дальше? А не разберались по символам и переводились..?
Еще раз спасибо!
СПАСИБО!!!
Вот я лох позорный, столько времени убил на это. А всего навсего нужно было слать не через монитор, а ведь он (сериал-монитор) мне и не нужен будет, просто пытался его использовать для отладки.
Да бога ради - используйте любой инструмент. Только делайте это, во-первых, с учетом особенностей используемого инструмента и, во-вторых, если просите помощи, то старайтесь с максимальной точностью описывать ситуацию. Ибо многие вещи, само собой разумеющиеся для вас, отнюдь не являются таковыми для тех людей, которые могли бы вам помочь (ну что тут поделаешь - они давно забыли о тех граблях, на которые тоже наступали в самом начале своего пути).
Это как с print()/write(). Вот вы пишете:
print - передает как ASCII, т.е. это уже не число, а текст.
write - как бинарный код, т.е. допустим цифра 130 перводится в 001100010011001100110000.
а в действительности:
print() передает число 130 как последовательность символов '1', '3' и '0', т.е. (в битах) 00110001 00110011 00110000 (пробелы вставлены для удобства восприятия).
write() передаст число 130 одним единственным байтом 0x82, т.е. (в битах) 10000010.
На будущее, реально ли отправлять мои 130 через сериал-порт? Как нужно слать или как как нужно изменить скетч что бы цифры отправленные в сериал-монитор так и отправлялись дальше? А не разберались по символам и переводились..?
PS: а журнал ввода-вывода (ну хотя бы выдержку из него) вы так и не привели.
если просите помощи, то старайтесь с максимальной точностью описывать ситуацию
Буду стараться
делайте это, во-первых, с учетом особенностей используемого инструмента
Так а что делает Сериал-монитор? print() ?
Если так то как же мне отправить мои 130 если это в любом случае воспринимается как символы а не как цифры, да еще разбивается? Добавить в скетч функцию которая будет обратно склеивать символы и переводить их в число? Или слать в сериал такой символ который будет переведен в нужное мне число? для 130 по таблице ASCII это не лепый символ :(, если я вообще говорю о чем то хоть капельку близком к решению
PS: а журнал ввода-вывода (ну хотя бы выдержку из него) вы так и не привели.
Скажите где этот журнал взять? Я тут же приведу!
Скажите где этот журнал взять? Я тут же приведу!
из 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)Так я не пользуюсь сериалмониторм больше, и запустить его не могу т.к. у меня программа (C# от visual studio) к COM-порту подключена.
Так что мешает в программе сделать вывод в файл??? Причем и выходной информации (то что в порт отправляется) и входной (то что из порта читается).
В VisualStudio? Отсутствие знаний о том как это сделать :(
А вообще эта информация конечно была бы очень полезна для отладки.
Да ну, это на Шарпе то? В сравнении с С++, Шарп намного проще.
Для начала хотя бы введите в cs файле слово File и посмотрите подсказку ;)
Это всякие delegate и события обрабатывать - есть некоторые проблемы, а записать в файл, поищите в интернете, найдете кучу примеров.
Я писал недавно монитор для библиотеки Firmata, вот это был гемор, споткнулся на проблемах чисто Шарповских. Либо плюну и на родном С++ напишу.
>Отсутствие знаний о том как это сделать
А что же тут поделать кроме "приобретать".
Проблемы могут быть только с последней строкой. Обновлять визуальные элементы можно только из главного потока UI. А скорее всего желание будет обновить из какого-нибудь обработчика событий serial port-а, который, естественно в своем потоке запускается. Как решить эту проблему - зависит уже от того на чем вы формочку делали WinForms или WPF. Просто гуглите как обновлять UI из других потоков. Например для WPF может помочь статья http://msdn.microsoft.com/en-us/magazine/cc163328.aspx
Если теряется информация, значит Вы ее не успеваете принимать. Попробуйте увеличить кольцевой буфер последовательного порта (в файле hardware\arduino\cores\arduino\HardwareSerial.cpp константа SERIAL_BUFFER_SIZE) или снижайте скорость соединения.
P.S. Не знаю, как leshak, а меня зовут Алексей :) Рекомендую все же по нику обращаться - путаницы не будет :)))
а если увеличивать буфер то какое из двух значений увеличивать? в файле написаны две константы
день добрый !
не могу разобраться с com portom при в воде 1 символа выдает мне
данный который ввожу и по мимо "LINE FEED"
подскажите как исправить
да кстате использую arduino nano
..................................................
Moderator : пожалуйста, вставьте код правильно (возможно, новым сообщением в тему),