Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.52/23: Рейтинг темы: голосов - 23, средняя оценка - 4.52
27 / 9 / 1
Регистрация: 26.04.2010
Сообщений: 279
1

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

12.11.2012, 20:00. Показов 4753. Ответов 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 Кб, 145 просмотров)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.11.2012, 20:00
Ответы с готовыми решениями:

Можно ли подключить библиотеки .lib и .dll?
Можно ли подключить библиотеки .lib и .dll? И если можно, то как это делается (среда NetBeanse)?

Работа с DLL/LIB библиотеками в С++
Добрый день, разбираюсь с библиотеками. 1.Статические библиотеки (Lib) - это уже транслированные...

Библиотеки glut.lib и glut32.lib не могу найти
Здравствуйте товарищи, помогите с очередной дилеммой. На днях начал изучать программирование,...

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

7
Модератор
3332 / 2116 / 343
Регистрация: 13.01.2012
Сообщений: 8,244
13.11.2012, 14:40 2
Цитата Сообщение от Max_92 Посмотреть сообщение
здесь нужно знать адреса
portid - идентификатор порта( полученный от TrComPortOpen )
Цитата Сообщение от Max_92 Посмотреть сообщение
что значит "получателя количества байтов в приемной очереди"
адрес ячейки памяти в которую будет записано количество байтов в очереди
Цитата Сообщение от Max_92 Посмотреть сообщение
организовать цикл, в котором попытки чтения байта из порта будут происходить до тех пор, пока он этот байт наконец не даст
думаю первый вариант больше соответствует вашей теме - как я понял имеется желание убедиться перед началом передачи что все данные ушли и (возможно) что нет входящих данных
0
27 / 9 / 1
Регистрация: 26.04.2010
Сообщений: 279
17.11.2012, 18:18  [ТС] 3
опрос очередей сделал. но теперь хотелось бы вывести сообщение в случае, если операции записи/считывания байта завершилась не успешно по какой-то причине. TRCOMERR_READ, оказывается, интовая переменная. но компилятор говорит что выражение типа if ( TRCOMERR_READ != 0) {ShowMessage("Ошибка считывания")} всегда true (или false, не помню, короче не меняется). в чём причина?
0
Модератор
3332 / 2116 / 343
Регистрация: 13.01.2012
Сообщений: 8,244
19.11.2012, 10:19 4
TRCOMERR_READ - это не переменная это константа
0
27 / 9 / 1
Регистрация: 26.04.2010
Сообщений: 279
19.11.2012, 12:34  [ТС] 5
vxg, в чём тогда её смысл? как узнать, произошла ли ошибка при передаче?
0
Модератор
3332 / 2116 / 343
Регистрация: 13.01.2012
Сообщений: 8,244
19.11.2012, 13:33 6
я так понимаю функции возвращают код ошибки или есть общая функция возвращающая код последней ошибки. во эту ошибку и анализируют - либо сравнивают с константой либо складывают по битам.
0
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
Модератор
3332 / 2116 / 343
Регистрация: 13.01.2012
Сообщений: 8,244
02.02.2013, 13:10 8
наверное либ файл другого формата - они для VS и BCB разные COFF и OMF
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.02.2013, 13:10

Помощь в написании контрольных, курсовых и дипломных работ здесь.

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

С++. Ping с использованием библиотеки icmp.dll
Задание: Создать приложение, реализующее функции, аналогичные утилите ping с использованием...

Клиент-Серверная программа с использованием dll -библиотеки
Дана такая задача: Разработать на Delphi клиент-серверное приложение. Клиентская часть состоит...

Как в VS 2015 устранить ошибку LNK 1104 cannot open file 'fltkd.lib wsock32.lib comct132.lib fltkjpegd.lib'?
как устранить ошибку LNK 1104 в visual studio community 2015? пункта C/C++ в properties нету ...


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

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

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