Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Управление прибором на AVR через COM-port компьютера
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
smk
Пробую создать программу для управления прибором с помощью ПК. Програму пишу в среде C++ Builder 6. Подключил библиотеку ComPort. Собственно по ней и вопрос. А в теме по AVR потому что девайс на AVR и еще потому что не знаю куда еще можно. Сам вопрос:
Вынося на поле Form1 любую из кнопок-компонент при попытке компиляции получаю для строки
/* Exception.CreateRes */ inline __fastcall EComPort(int Ident)/* overload */ : Sysutils::Exception(Ident) { }
сообщение об ошибке: [C++ Error] CPort.hpp(683): E2238 Multiple declaration for '_fastcall EComPort::EComPort(int)'
а для строки: __fastcall EComPort(int ACode);
сообщение об ошибке:[C++ Error] CPort.hpp(675): E2344 Earlier declaration of '_fastcall EComPort::EComPort(int)'

также для строки: typedef TBitmap TLedBitmap;
сообщение об ошибке: [C++ Error] CPortCtl.hpp(242): E2015 Ambiguity between 'TBitmap' and 'Windows::TBitmap'

Это у всех так? Помогите разобраться. Заранее спасибо!
=GM=
Цитата(smk @ Apr 3 2008, 19:44) *
Сам вопрос: вынося на поле Form1 любую из кнопок-компонент при попытке компиляции получаю для строки
сообщение об ошибке: [C++ Error] CPort.hpp(683): E2238 Multiple declaration for '_fastcall EComPort::EComPort(int)'
Это у всех так? Помогите разобраться. Заранее спасибо!

У вас же всё написано: Multiple declaration, значит несколько раз объявили.
defunct
Цитата(smk @ Apr 3 2008, 22:44) *
Это у всех так? Помогите разобраться. Заранее спасибо!

С компонентом не работал, а по работе с портом - все довольно просто - точно также как с файлом.
Почитайте тут:

http://bcbsql.narod.ru/pub/rabcomm.htm
sysel
Все эти компоненты для порта от лукавого...
По собственному опыту знаю, что потом как вылезет какой-нибудь нюанс использования, что придётся в конечном итоге всё руками переписывать.
Так что пишите сразу на WinAPI.

В дополнение, чтобы предостеречь от ошибок:
Работа с портом(ReadFile, WriteFile) должна осуществляться только в том потоке, который открыл этот порт (CreateFile).
gena_dj
Цитата(sysel @ Apr 4 2008, 10:40) *
Работа с портом(ReadFile, WriteFile) должна осуществляться только в том потоке, который открыл этот порт (CreateFile).

Это еще почему?
Можно открыть в одном потоке, а читать в другом.

Единственное, что нельзя делать - одновременно пытаться работать в двух разных потоках.
Axxel
Цитата(smk @ Apr 4 2008, 02:44) *
Это у всех так? Помогите разобраться. Заранее спасибо!

Если у вас установлен компонент от Dejan (TComPort)
то в ридми файле, там написано, что нужно закомментировать пару строчек в заголовочниках.
Ruslan Konovalov
Цитата(smk @ Apr 3 2008, 23:44) *
Пробую создать программу для управления прибором с помощью ПК. Програму пишу в среде C++ Builder 6. Подключил библиотеку ComPort. Собственно по ней и вопрос. А в теме по AVR потому что девайс на AVR и еще потому что не знаю куда еще можно. Сам вопрос:
Вынося на поле Form1 любую из кнопок-компонент при попытке компиляции получаю для строки
/* Exception.CreateRes */ inline __fastcall EComPort(int Ident)/* overload */ : Sysutils::Exception(Ident) { }
сообщение об ошибке: [C++ Error] CPort.hpp(683): E2238 Multiple declaration for '_fastcall EComPort::EComPort(int)'
а для строки: __fastcall EComPort(int ACode);
сообщение об ошибке:[C++ Error] CPort.hpp(675): E2344 Earlier declaration of '_fastcall EComPort::EComPort(int)'

также для строки: typedef TBitmap TLedBitmap;
сообщение об ошибке: [C++ Error] CPortCtl.hpp(242): E2015 Ambiguity between 'TBitmap' and 'Windows::TBitmap'

Это у всех так? Помогите разобраться. Заранее спасибо!


Зайдите на http://www.pcports.ru/
Может там найдете что нибудь.
bloodden
Вы, скорее всего, подключили инклюдом в нескольких файлах, а потом их подключили и.т.д. В итоге в одном самом главном smile.gif файле получилось несколько раз подключен один и тот же файл с ком портом вашим.
smk
Цитата
Если у вас установлен компонент от Dejan (TComPort)
то в ридми файле, там написано, что нужно закомментировать пару строчек в заголовочниках.

Не нашел где это написано... подскажите плз!
Axxel
пункт 7, C++ Builder notes
файл прикрепил.
gagik
Попробуй этот класс. Я его часто использую с AVR в Visual C++ 6.0 - все нормально работает.
smk
Цитата
использую с AVR в Visual C++ 6.0

интересует для C++ Builder 6.0

7. C++ Builder Notes
------------------------------------------------------------------------------
The .hpp file C++ Builder creates for cport.pas will have a bug in it.
The first time you compile a project, you will get one or two duplicate
definitions within the EComPort exception class. It seems to be safe to
delete or comment out the duplicates.

Also, the CPortCtl.HPP may have a bug in it. If you get an error about
the following being ambiguous;

typedef TBitmap TLedBitmap;

Change it to:

typedef Graphics::TBitmap TLedBitmap;

If someone knows how to fix these more cleanly, please post what you
find to the CPort Forum so that we can incorporate your findings in
future revisions.

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

Я закомментировал строчки, на которые указал компилятор. Начал компилировать... теперь надо как-то проверить работоспособность...
Axxel
Я проверял-работает smile.gif
smk
Цитата
Я проверял-работает


Разбираюсь с хелпом. А есть ли у Вас какойнить примерчик: обнаружить все порты-открыть порт-отправить пару байт-принять пару байт?
Andrew O. Shadoura
Цитата(gena_dj @ Apr 4 2008, 08:13) *
Это еще почему?
Можно открыть в одном потоке, а читать в другом.

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

Можно работать не только в разных потоках, но и в разных процессах при применении некоторой эквилибристики. Естественно, механизмы синхронизации никто не отменял.
Axxel
Цитата(smk @ Apr 12 2008, 01:41) *
А есть ли у Вас какойнить примерчик?

Есть один корявенький.... пользуйтесь smile.gif
smk
Цитата
Есть один корявенький.... пользуйтесь

Спасибо!
smk
А как передать байт (не строку)? Суть в том чтоб иметь возможность каждому биту присвоить какую-то функцию... Ну и самое главное - иметь возможность вести обмен в формате: #команда(1 байт)*параметр(1 байт), ну т.е. #111*256. А как вообще строится этот диалог? Как принято?
Axxel
Ну это как напишите, а как принято-изучайте стандартные протоколы smile.gif
Ну к примеру если протокол master-slave, то запрос от мастера-ответ подчиненного.
23322
приветствую.
моя тема
http://electronix.ru/forum/index.php?showtopic=38021&hl=

наверное у меня пока кривые руки. я приобрел контроллер
http://www.ldm-systems.ru/price_konstructors.htm
LDM-MP 2.01

даже читаю книжки. но с чего начать изготовление бегущей. кукую прогу нужно. опишите все для не осень понимающего ...
23322
актуально.
Axxel
Начни с изучения ДШ на МК в плате, разберись как подключать нагрузку к портам, напиши программку для мигания диодом для начала. Затем прочитай про принцип динамической индикации... и.т.д.
Хоть и ругают "общеизвестный курс", но для того чтобы написать программку мигания, собрать программатор, и понять в общих чертах, как программируется контроллер на С, можно его почитать (авр123.ру) smile.gif (потом все равно тебя поправят) Вопросы-то КОНКРЕТНЫЕ задавать нужно, начни с простого, здесь тебе все равно помогут. А "Актуально"-это извини, совсем не вопрос smile.gif
P.S. Я кстати тоже чайник-любитель smile.gif
23322
Шпак Ю А - Программирование На Языке C Для Avr И Pic Микроконтроллеров (2006).djvu
вот. что нашел в книжке ...
это мне поможет?

#include <avx/io.h>
#include <avr/dalay.h>
#include <stdio.h>


//Отображаемый номер
//Счетчик текущего светоиндикатора в режиме ох:


char n; //Отображаемый номер
char c; //Счетчик текущего светоиндикатора в режиме ожидания

int main (void)
{
UBRR = 25; //Скорость обмена через UART - 9600 бод
UCR = 0x18; /*Устанавливаем разряды ТХЕN и RХЕN для
активизации UART в режиме ввода/вывода через
выводы 0 и 1 порта D.
Разряд СНR9=0 - передача 8 бит данные */
DDFA = 0x00; //Все выводы порта А - входы
PORTA - OxFF; //Выводы порта А - нагруженные
DDKB = OxFF; //Все выводы порта В - выходы
while (1) //Бееконечный цикл
{
c = 1; //Начинаем с первого светоиндикатора
whie
(PINA == 0xFF) //До тех лор, пока не нажата кнопка...
{


if (c == 0) c = 1; //Если "точка" пробежала всю линейку
//индикаторов, то начинаем опять с первого светодиода
PORTB = ~c; //Загорается "бегущая точка"
_delay_loop_2(100); //Короткая задержка
n++; //Увеличиваем число, предназначенное к выводу
c = c << 1; //Сдвигаем "бегущую точку" влево
}
printf ("%d", n); //Если нажата кнопка, выводим число через
PORTB = ~n; //UART и отображаем его с помощью светодиодов
_delay_loop_2 (1000); //Длинная задержка
PORTB = 0xFF; //Гасим светодиоды
} }
radiohobbyt
Пробуй(изучай) WinAPI. То есть не всякие библиотеки. Суть- запускаешь процесс, в котором постоянно(в цикле)проверяшь, а не принято ли что-нибудь, в нем же и отпрвляешь в случае необходимости.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.