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


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

Сообщений: 37


« : 22 Сентябрь 2011, 20:45:37 »

Здравствуйте.

Подскажите пожалуйста как работать с COM-портом.

Я просто не знаю с чего начать. Нужна ли какая нибудь библиотека? Если нужна, то какая и где её скачать....
У меня Builder 6

буду рад любой помощи. Пишите плиз на понятном и простом языке как и что делать
Записан
d7d1cd
Участник


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

Сообщений: 1005


« Ответ #1 : 22 Сентябрь 2011, 20:53:19 »

Можно работать без библиотек. А можно и с ними. Я работал без них используя функции WriteFile и ReadFile...
Посмотри тут https://cbuilder.ru/index.php/topic,7008
Записан
Sergey1985
Участник


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

Сообщений: 310


« Ответ #2 : 22 Сентябрь 2011, 22:55:53 »

Скачай себе книгу автор  Агурова П. Последовательные интерфейсы Практика программирования. Там все разжовано. Писать можно при помощи готовых компонент или на WinAPI функциях. Первый вариант более быстрый  второй - более гибкий. Наиболее удачный для новичка компонент на мой взгляд это cport247 можно также сказать с нета. Демки там по мойму тоже прилагаются.
Записан
Дмитрий Шарпей
Участник


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

Сообщений: 9

C# лучше нет на свете))


« Ответ #3 : 14 Октябрь 2011, 14:10:21 »

Нет. Чот все равно мало инфы для работы с ком портами. Вот я на C# буквально за одни день все сделал. Там есть сласс SerialPort. А здесь в это С++ нет. Саам пиши-предлагают. Или я чот не догнал-с.
Записан
Дмитрий Шарпей
Участник


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

Сообщений: 9

C# лучше нет на свете))


« Ответ #4 : 25 Октябрь 2011, 09:59:13 »

Мне надо программу срочно!..... 

Я дибил. Ну киньте исходничек. Плиз. СпАсите утопающего

Я уже стока прочитал...
Записан
POV
Участник


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

Сообщений: 640


« Ответ #5 : 25 Октябрь 2011, 12:06:04 »

Самое простое на мой взгляд - slycomm.
И работает приемлемо и исходники примитивные. Через месяц работы с ними сам все на API напишешь.. если потребуется.
« Последнее редактирование: 25 Октябрь 2011, 13:01:37 от POV » Записан
serg76
Участник


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

Сообщений: 575


« Ответ #6 : 25 Октябрь 2011, 12:21:28 »

ещё здесь глянь, пользуюсь больше трех лет, всё просто "как два байта переслать"
Записан
Дмитрий Шарпей
Участник


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

Сообщений: 9

C# лучше нет на свете))


« Ответ #7 : 25 Октябрь 2011, 15:12:58 »

             TCom com;
             com.SetPort(portsName);
             com.FlushCommPort();
             byte zapros[4] = {0x31, 0x01, 0xF0, 0xC5};
             byte answer[32];
             com.SendBuffer(zapros,4);
             com.TakeBytes(answer,strlen(answerCom1));


Кусок кода. Что не правильно? Почему в answer записывается всякая фигня.
Записан
serg76
Участник


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

Сообщений: 575


« Ответ #8 : 25 Октябрь 2011, 15:20:55 »

для уверености что туда хоть что то пишется, очищай answer[32] перед каждым запросом

Цитировать
Что не правильно?
что надо вообще?
Записан
Дмитрий Шарпей
Участник


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

Сообщений: 9

C# лучше нет на свете))


« Ответ #9 : 25 Октябрь 2011, 15:42:16 »

Да я очистил.
Потом в Debug - е(    ) я прошел по методу  TakeBytes();
  Вот в чем ошибка. - оказалось что v_hCom=Null // то есть это мой порт.
и как тогда организовывать открытие, чтобы v_hCom не был Null?
вот тот метод из класса com.h
int TCom::TakeBytes(BYTE *buffer, unsigned int MaxBytes)
{
    DWORD bytes_read=0;

    if(!ReadFile(v_hCom,buffer,MaxBytes,&bytes_read,NULL))
        MessageBox(NULL,"???????!","???? ?? ????????!",MB_OK);

    if(bytes_read < MaxBytes)
        buffer[bytes_read]='\0';

    return bytes_read;
}
Записан
serg76
Участник


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

Сообщений: 575


« Ответ #10 : 25 Октябрь 2011, 16:24:27 »

кусок рабочего кода, отправляет запрос 8 байт, получает ответ 17 байт, таймаут 18млсек
Код
  TCom port;
 int i,j;
 BYTE l[17];
 
 port.SetPortA("COM5");
 port.OpenPort();
 if(port.IfConnected())
 {
   port.SetBaund(38400);
   port.SendBuffer(mm,8);
 
   i=GetTickCount();
   j=0;
   while((j<17)&&(GetTickCount()-i<18))
   {
     l[j]=port.GetByte();
     j++;
   }
 }
 else
 {
   Application->MessageBox("порт закрыт","СОМ порт ошибка",MB_OK);
 }
 port.ClosePort();
Записан
Nikita
Участник


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

Сообщений: 476


« Ответ #11 : 25 Октябрь 2011, 20:19:15 »

Для работы с СОМ портом я пользуюсь вот такой библиотекой:
ComPort Library version 3.10
 for Delphi 3, 4, 5, 6, 7, 2005, 2006
 and C++ Builder 3, 4, 5, 6 
 by Dejan Crnila


Очень удобная и простая в использовании штука.

 в гугле она есть 
Записан
Дмитрий Шарпей
Участник


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

Сообщений: 9

C# лучше нет на свете))


« Ответ #12 : 26 Октябрь 2011, 09:32:03 »

Все пока вроде отлично.
Сергею - огромное спасибо!!!!!! И всем, кто неравнодушен остался к моим мучениям!!!!
И вопрос - А почему первый байт шлет ноль(от GetByte)
И еще - а как в HeX - ах отобразить ответ!... У меня а то в DEC пиШется.
А еще - нужны ли -
    // Установки таймаута
                 COMMTIMEOUTS    timeouts={0};
                 timeouts.ReadIntervalTimeout=50;
                 timeouts.ReadTotalTimeoutConstant=50;
                 timeouts.ReadTotalTimeoutMultiplier =10;
                 timeouts.WriteTotalTimeoutConstant = 50;
                 timeouts.WriteTotalTimeoutMultiplier =10;
                 if (!SetCommTimeouts(port,&timeouts))
                 {
                 //error occureed. Inform user
                 }

Никите - эти DLL - случайно не платные??

« Последнее редактирование: 26 Октябрь 2011, 09:57:48 от Дмитрий Шарпей » Записан
Nikita
Участник


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

Сообщений: 476


« Ответ #13 : 26 Октябрь 2011, 19:12:21 »

Никите - эти DLL - случайно не платные??

Библиотека бесплатная.

Во вложенном файле выложил её. Версия старая правда, новую не искал (а может и нет новой). На этой версии я свой проект делал.
Записан
Дмитрий Шарпей
Участник


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

Сообщений: 9

C# лучше нет на свете))


« Ответ #14 : 27 Октябрь 2011, 10:25:28 »

Вроде все ЗА работало Все огромнейшее спасибо!!! Отчветьте плиз на предыдущие ворпосы, Сергей. Или кто может.

Кому надо могу выслать прогу.) Пишите.
Мне помо(ГУ)гли - и я помогу.
Записан
serg76
Участник


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

Сообщений: 575


« Ответ #15 : 27 Октябрь 2011, 10:54:57 »

Цитировать
А почему первый байт шлет ноль
уст-во медленно отвечает, я подбирал задержку на глаз, но можно добавить if(port.BytesAvailable())

Цитировать
Установки таймаута
под себя настраивал

Цитировать
а как в HeX - ах отобразить
на форуме есть, смотри IntToHex
Записан
Дмитрий Шарпей
Участник


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

Сообщений: 9

C# лучше нет на свете))


« Ответ #16 : 27 Октябрь 2011, 13:52:22 »

А если заранее не известно, сколько байт мы получим??? Как получись число байт ответа?
Записан
serg76
Участник


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

Сообщений: 575


« Ответ #17 : 27 Октябрь 2011, 14:05:06 »

это уже от протокола обмена зависит

но обычно в ответе: 1й байт адрес уст-ва, 2й длина пакета

получаешь второй байт и подставляешь в условие выхода из цикла
Записан
Дмитрий Шарпей
Участник


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

Сообщений: 9

C# лучше нет на свете))


« Ответ #18 : 27 Октябрь 2011, 14:48:33 »

Нашел типо такого кода.

int TCom::CountReadByte(HANDLE hFile, wstring &output)
{
 DWORD BytesRead = 0, bufSize = 0;
 bufSize = GetFileSize(hFile, NULL);
 output.resize(bufSize/sizeof(WCHAR)+1);
 ReadFile(hFile, (WCHAR*)output.c_str(), bufSize, &BytesRead, NULL);
               Close(hFile);
output[bufSize/sizeof(WCHAR)] = 0;
 return BytesRead;
}


Но не пойму что за тип wstring? Потому как не компилилтся. Googlil, не помгло пока.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

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