Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++ Builder

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.67
Max_92
25 / 7 / 2
Регистрация: 26.04.2010
Сообщений: 205
#1

Работа с COM портом с использованием библиотеки TrComPort.dll (TrComPort_BCB.lib) - C++ Builder

12.11.2012, 20:00. Просмотров 3211. Ответов 7
Метки нет (Все метки)

Скачивал отсюда: ссылки на форумы запрещены
В Project1.cpp подключаем:
#pragma comment (lib, "TrComPort_BCB.lib");
#include "TrComPort.h"

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

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
int PortId, value, result;
LPDWORD input_queue = NULL;
 
 
//открытие порта
void __fastcall TForm2::Button1Click(TObject *Sender)
{
 
PortId = TrComPortOpen(6);// COM7
Edit1->Text = IntToStr(PortId);
if( TRCOM_SUCCEEDED(PortId) ) {
   ShowMessage("PortOpen success!");
   // порт открыт - устанавливаем параметры соединения
   TrComPortParameters params = {tcpmpBaudRate|tcpmpDefaultTimeout|tcpmpByteSize|tcpmpStopBits|tcpmpCheckParity|tcpmpParity|tcpmpEnableRtsControl|tcpmpEnableDtrControl,
                                   CBR_9600,           // 9600 бод
                                   5000,               // по умолчанию тайм-аут 5 с.
                                   8,                  // 8 бит
                                   ONESTOPBIT,         // 1 стоп-бит
                                   0,                  // без проверки четности
                                   NOPARITY,           // без бита четности
                                   RTS_CONTROL_DISABLE,// изначально RTS-off
                                   DTR_CONTROL_ENABLE};// изначально DTR-on
   result = TrComPortSetConfig(PortId,&params);
   if( TRCOM_SUCCEEDED(result) ) {
      // параметры заданы - устанавливаем управляющие сигналы(DTR-on, RTS-off)
      result = TrComPortSetControl(PortId, tcpscfSetDtr|tcpscfClearRts);
      if( TRCOM_SUCCEEDED(result) ) {
         // управляющие сигналы установлены
        
 
// что-нибудь делаем далее:
 
            //записываем байт данных в порт
            value = 244;
            TrComPortWriteByte(PortId, value, -1); }
 
            //считываем байт данных из порта
            result = TrComPortReadByte(PortId, -1);
 
 
 
      }
   }
        //закрытие порта
result = TrComPortClose(PortId);
   if ( TRCOM_SUCCEEDED(result) )
   {
   ShowMessage("PortClose success!");
   }
}
}
Всё замечательно работает.. Но:

1. Преподаватель задал организовать ОПРОС ГОТОВНОСТИ ПОРТА перед передачей. Порывшись в заголовочном файле, я нашёл вот эту функцию:

" Получение текущего количества байтов в приемной и передающей очередях порта
portid - идентификатор порта( полученный от TrComPortOpen )
input_queue - адрес получателя количества байтов в приемной очереди
( NULL, если значение не интересует )
output_queue - адрес получателя количества байтов в передающей очереди
( NULL, если значение не интересует ) */

DLLFUNC
INT
WINAPI
TrComPortGetQueue(INT portid, LPDWORD input_queue, LPDWORD output_queue); "

Как видно, здесь нужно знать адреса. Откуда их взять? К тому же не совсем понятно, что значит "получателя количества байтов в приемной очереди" ? Почему не самой приёмной очереди?

2. Допустим, если идея с опросом готовности обломалась, то можно попробовать организовать цикл, в котором попытки чтения байта из порта будут происходить до тех пор, пока он этот байт наконец не даст (т.е. пусть программа на это время подвиснет, не страшно). Другими словами, истёк таймаут (который выше равен 5 сек.), тупо заново вызывается та же функция TrComPortReadByte. Но для этого нужно использовать вот эту функцию (см. заголовочный файл):

// не удалось выполнить чтение
#define TRCOMERR_READ ((INT)-8)

или

// не удалось выполнить чтение - истек таймаут
#define TRCOMERR_READ_TIMEOUT ((INT)-10)

Здесь входной аргумент "(INT)-10". Что это значит?
0
Вложения
Тип файла: rar TrComPort.rar (28.5 Кб, 126 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.11.2012, 20:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Работа с COM портом с использованием библиотеки TrComPort.dll (TrComPort_BCB.lib) (C++ Builder):

C++ Builder 6 библиотеки d3d9.lib и d3dx9d.lib - C++ Builder
Здравствуйте. Сегодня пытался импортировать библиотеки d3d9.dll и d3dx9d.dll. Вроде всё получилось и у меня на руках библиотеки d3d9.lib и...

Импортировать библиотеки Lib - C++ Builder
Имеется набор библиотек от производителя на студию и vb. Собственно задача использовать их в builder'e. Взял библиотеки от студии в...

Файлы *.lib и *.dll - C++
Привет всем! Вот решил начать писать проект и задался вопросом: как использовать *.lib и *.dll файлы? Я даже не знаю что в этих файлах...

lib и def из dll - C++ Builder
Здравствуйте. Тема по созданию lib и def из dll неоднократно поднималась и обсуждалась, но прописав в командной строке implib...

Знает ли кто-нибудь хорошие бесплатные библиотеки для работы с Com портом? - C++ Builder
Интересует работа на очень низком уровне, не банальные приём\передача? Конкретно - управление линиями DTR, RTS, TX, опрос линии CTS, в...

Как из .dll получить .h и .lib ? - C++ Builder
Всем привет! Как из .dll библиотеки получить файлы .h и .lib ?

7
vxg
Модератор
3184 / 1987 / 227
Регистрация: 13.01.2012
Сообщений: 7,680
13.11.2012, 14:40 #2
Цитата Сообщение от Max_92 Посмотреть сообщение
здесь нужно знать адреса
portid - идентификатор порта( полученный от TrComPortOpen )
Цитата Сообщение от Max_92 Посмотреть сообщение
что значит "получателя количества байтов в приемной очереди"
адрес ячейки памяти в которую будет записано количество байтов в очереди
Цитата Сообщение от Max_92 Посмотреть сообщение
организовать цикл, в котором попытки чтения байта из порта будут происходить до тех пор, пока он этот байт наконец не даст
думаю первый вариант больше соответствует вашей теме - как я понял имеется желание убедиться перед началом передачи что все данные ушли и (возможно) что нет входящих данных
0
Max_92
25 / 7 / 2
Регистрация: 26.04.2010
Сообщений: 205
17.11.2012, 18:18  [ТС] #3
опрос очередей сделал. но теперь хотелось бы вывести сообщение в случае, если операции записи/считывания байта завершилась не успешно по какой-то причине. TRCOMERR_READ, оказывается, интовая переменная. но компилятор говорит что выражение типа if ( TRCOMERR_READ != 0) {ShowMessage("Ошибка считывания")} всегда true (или false, не помню, короче не меняется). в чём причина?
0
vxg
Модератор
3184 / 1987 / 227
Регистрация: 13.01.2012
Сообщений: 7,680
19.11.2012, 10:19 #4
TRCOMERR_READ - это не переменная это константа
0
Max_92
25 / 7 / 2
Регистрация: 26.04.2010
Сообщений: 205
19.11.2012, 12:34  [ТС] #5
vxg, в чём тогда её смысл? как узнать, произошла ли ошибка при передаче?
0
vxg
Модератор
3184 / 1987 / 227
Регистрация: 13.01.2012
Сообщений: 7,680
19.11.2012, 13:33 #6
я так понимаю функции возвращают код ошибки или есть общая функция возвращающая код последней ошибки. во эту ошибку и анализируют - либо сравнивают с константой либо складывают по битам.
0
Shadow_i
0 / 0 / 0
Регистрация: 27.01.2013
Сообщений: 10
02.02.2013, 11:02 #7
Помогите!!!
У меня вижуал си++ 2008 экспресс, и при загрузке либы
#pragma comment (lib, "TrComPort_BCB.lib")
вылазит ошибка :
1>LINK : fatal error LNK1104: не удается открыть файл "TrComPort_BCB.lib"
0
vxg
Модератор
3184 / 1987 / 227
Регистрация: 13.01.2012
Сообщений: 7,680
02.02.2013, 13:10 #8
наверное либ файл другого формата - они для VS и BCB разные COFF и OMF
0
02.02.2013, 13:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.02.2013, 13:10
Привет! Вот еще темы с ответами:

Имеется LIB, H, DLL. Надо 1 EXE - C++ Builder
Доброго дня! Прошу разъяснить ситуацию: 1. Использовал в проекте сторонний LIB,H, DLL... 2. В Builder 6.0 скомпиллировал и на...

Как и возможно ли создать lib и h из dll? - C++ Builder
Есть библиотека dll и больше ничего. Смогу ли я как-то сделать *.h и *.lib для того что бы подключить их к билдеру для работы с ними???

bass.dll ошибка при добавлении .lib - C++ Builder
При добавлении в проект библиотеки, при компиляции такая ошибка? как быть? А, и вот еще забыл написать

Как с помошью implib.exe из dll сделать lib - C++ Builder
Как с помошью implib.exe из dll сделать lib? Объясните идиоту пошагово, пожалуйста.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru