C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Работа с внешним устройством  (Прочитано 9775 раз)
avos
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 34


« : 20 Сентябрь 2007, 12:13:26 »

Как обучить свою программу общаться с внешним устройством, в частности с контролером?

Может делал кто-то что-то подобное... Очень надо!
Записан
Rius
Давний друг


Сказали спасибо: +116/-5
Offline

Сообщений: 753


« Ответ #1 : 20 Сентябрь 2007, 12:44:01 »

а что именно вы подразумеваете под этим широким понятием "контроллер"   ?
Записан
avos
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 34


« Ответ #2 : 20 Сентябрь 2007, 13:20:15 »

Я имею в виду микроконтроллер фирмы Atmel серии AVR.
Вообщем, мне надо передать из своей программы команду, которая будет выполняться в контроллере... допустим, загораться лампочка; или же наоборот - чтобы программа на компьютере определяла горит ли лампочка или потухла.
Микроконтроллер поддерживает протокол передачи информации USAR(USART)
Записан
Rius
Давний друг


Сказали спасибо: +116/-5
Offline

Сообщений: 753


« Ответ #3 : 20 Сентябрь 2007, 13:41:16 »

так, а что именно не получается? со стороны контроллера или пк?
Записан
avos
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 34


« Ответ #4 : 20 Сентябрь 2007, 13:49:13 »

Относительно контроллера - там всё просто и поняино. А вот как это реализовать в C++Builder'е?
Записан
Rius
Давний друг


Сказали спасибо: +116/-5
Offline

Сообщений: 753


« Ответ #5 : 20 Сентябрь 2007, 14:09:00 »

подключить к программе любой класс для работы с com-портом (например этот), или если охота самому писать - Serial Communications in Win32.
открыть порт, записать данные, считать (по событию) пришедшие данные и т.д.
...
закрыть порт
Записан
avos
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 34


« Ответ #6 : 20 Сентябрь 2007, 14:17:00 »

А нету другой ссылки?  Я просто с зоны .kg выхожу - открыть не получаеться
 
 
Записан
Rius
Давний друг


Сказали спасибо: +116/-5
Offline

Сообщений: 753


« Ответ #7 : 20 Сентябрь 2007, 14:27:16 »

файлы приложены
Записан
avos
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 34


« Ответ #8 : 20 Сентябрь 2007, 14:40:20 »

Ага, спасибо!
А теперь можно поподробней вот с этого места:
открыть порт, записать данные, считать (по событию) пришедшие данные и т.д.
...
закрыть порт

Если не трудно, то пример какой-нибудь простой написать...
Записан
Rius
Давний друг


Сказали спасибо: +116/-5
Offline

Сообщений: 753


« Ответ #9 : 20 Сентябрь 2007, 15:11:01 »

очень приблизительный пример, даже можно сказать, что так делать нельзя...
но посмотреть отправку/приём можно.

из настроек указал только имя порта, а надо было ещё чётность/скорость/стопбиты...
« Последнее редактирование: 20 Сентябрь 2007, 16:16:25 от Rius » Записан
avos
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 34


« Ответ #10 : 20 Сентябрь 2007, 15:36:28 »

Спасибо огромное! Посмотрю. Попробую.
« Последнее редактирование: 20 Сентябрь 2007, 15:42:12 от avos » Записан
avos
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 34


« Ответ #11 : 08 Октябрь 2007, 16:01:26 »

Наконец-то до интернета добрался...
Вообщем у меня получилось  принимать и получать элементарные вещи, но что-то не получаеться разобраться до конца . Как заставить программу ожидать приёма посылки контроллера? И по поводу протокола у меня большой вопрос. Как, например, самому выставлять скорость... и тому подобное?
Записан
Rius
Давний друг


Сказали спасибо: +116/-5
Offline

Сообщений: 753


« Ответ #12 : 08 Октябрь 2007, 16:56:27 »

всё это описано в Serial Communication in Win32, если вы программируете микроконтроллеры, то с литературой на английском уже встречались
Код:
#if defined(USE_OVERLAPPED)
memset(&frame.bufRecv, 0xaa, 10);
//Sleep(mem_ops_delay);

overlapped.hEvent = CreateEvent(NULL, true, true, NULL);
SetCommMask(FHandle, EV_RXCHAR);
//ожидать события приёма байта (это и есть перекрываемая операция)
DWORD mask = 0;
WaitCommEvent(FHandle, &mask, &overlapped);
signal = WaitForSingleObject(overlapped.hEvent, 2000);//приостановить поток до прихода байта
if(signal == WAIT_OBJECT_0)         //если событие прихода байта произошло
{
if(GetOverlappedResult(FHandle, &overlapped, &temp, true)) //проверяем, успешно ли завершилась
{
//перекрываемая операция WaitCommEvent
if((mask & EV_RXCHAR)!=0) //если произошло именно событие прихода байта
{
Sleep(200);
ClearCommError(FHandle, &temp, &comstat); //нужно заполнить структуру COMSTAT
btr = comstat.cbInQue;                          //и получить из неё количество принятых байтов
if(btr)                          //если действительно есть байты для чтения
{
//ReadFile(COMport, bufrd, btr, &temp, &overlapped);     //прочитать байты из порта в буфер программы
//ReadFile(FHandle, &frame.bufRecv, btr, (unsigned long*)&BufferLength, &overlapped);
ReadFile(FHandle, &frame.bufRecv, frame.nMustRecv, (unsigned long*)&BufferLength, &overlapped);
int len = BufferLength;
frame.nRecv = BufferLength;
}
}
}
}
BOOL bRes = CloseHandle(overlapped.hEvent);//перед выходом из потока закрыть объект-событие
#else
Sleep(mem_ops_delay);
memset(&frame.bufRecv, 0xaa, 10);
ReadFile(FHandle, &frame.bufRecv, 64, (unsigned long*)&BufferLength, NULL);
int len = BufferLength;
sprintf(buf, "TxRx: data received    -> %d bytes", len);
WriteDebugLog(buf);
sprintf(buf, "TxRx: data received    -> ");
for(int i=0; i {
sprintf(buf2, "%2x ", frame.bufRecv[i]);
strcat(buf, buf2);
}
WriteDebugLog(buf);
frame.nRecv = BufferLength;
#endif


для настроек порта в компоненте имеются соответствующие свойства:
Код:
__property TBaudRate BaudRate ={read=FBaudRate,write=SetBaudRate,default=br9600};
__property TParity Parity ={ read=FParity,write=SetParity,default=paNone};
__property TStopBits StopBits ={ read=FStopBits,write=SetStopBits,default=sb10};
__property TDataBits DataBits ={ read=FDataBits,write=SetDataBits,default=da8};
где
Код:
enum  TBaudRate {br110, br300, br600, br1200, br2400, br4800, br9600, br14400,
    br19200, br38400, br56000, br57600, br115200, br128000, br256000};
enum  TParity {paNone, paOdd, paEven, paMark, paSpace};
enum  TStopBits { sb10, sb15, sb20};
enum  TDataBits {da4, da5, da6, da7, da8};
« Последнее редактирование: 22 Ноябрь 2007, 19:08:21 от Rius » Записан
Faster
Участник


Сказали спасибо: +0/-2
Offline

Сообщений: 160


« Ответ #13 : 09 Октябрь 2007, 06:36:45 »

Привет .... я был в приколе когда вопрос читал ...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.059 секунд. Запросов: 19.