Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Borland C++ Builder/Turbo C++ Explorer > Как программировать COM порт


Автор: Vovik 14.01.06, 08:02
:wall: Как реализовать прием передачу последовательных данных через COM порт?

Автор: W_in_d 15.01.06, 12:37
Посмотри здесь

Автор: BuG2BuG 15.01.06, 15:47
Зачем усложнять себе жизнь? Не проще ли использовать готовый компонент?
Например, TComPort 3.0
работает с C Builder версии от 3 до 6 :D
Использовать вообще очень просто
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    ComPort1->ShowSetupDialog(); // Диалог настроек COM-порта
    ComPort1->Open(); // Соединяемся
    ComPort1->WriteStr("Hello!"); // Пишем строку
    ComPort1->Close(); // Закрываем COM-порт

и такъ далее

Автор: bigelow 16.01.06, 08:53
Vovik Если есть желание можешь глянуть как осуществить последовательный прием-передачу посредством COM порта с использованием WinAPI на стр.7, тема "Работа с COM портом". Там есть небольшая прога с коментариями. :yes:

Автор: diman 17.01.06, 03:13
програмируй сам, без компанентов, разберёшся - будешь мастером! поищи как програмируют через API функции, в нете есть статьи по программированию последовательных интерфейсов с помощью API функций. так и пиши в поисковиках. Тема интересная, и не такая уж сложная если разобраться. Пользуй статьи и MSDN, там описание API. Погляди CreateFile(), ReadFile(), WriteFile(), GetCommState(), структуры DCB, и ещё там несколько. а вообще в чём твоя задача?

Автор: diman 17.01.06, 03:21
W_in_d тебе отличную ссылку кинул! (http://www.rs232.ru/doc002.html) респект ему. больше ничего и не надо, MSDN тока.

Автор: makaka 11.04.06, 14:16
Возникла следующая проблема при работе с нестандартным СOM устройством: данные от устройства поступают пакетами по 18 байт, потом пауза = времени передачи 2-ух байтов, затем следующая посылка... Данные в посылке произвольные двоичные, поэтому нельзя использовать XON, XOFF символы. Вопрос: как отследить начало (конец) посылки в среде Win32?

Автор: /*---Женёк---*/ 12.04.06, 02:29
Vovik поделись знаниями - как продвигаеться работа с Com-портом. Чем пользуешься компонентом или WinApi?
А я тут с Чтением из порта встрял..... :wall:

Автор: Seva 12.04.06, 05:15
Цитата makaka @
Возникла следующая проблема при работе с нестандартным СOM устройством: данные от устройства поступают пакетами по 18 байт, потом пауза = времени передачи 2-ух байтов, затем следующая посылка... Данные в посылке произвольные двоичные, поэтому нельзя использовать XON, XOFF символы. Вопрос: как отследить начало (конец) посылки в среде Win32?

И даже заголовка у пакете нет?
1. С помощью COMMTIMEOUTS настроить таймауты и читать данные блоками по 18 байт - контроллер COM-порта сам выровняется на границы блока данных. Недостаток - высокие требования к исполнению протокола.
2. Читать по одному байту и отсчитывать интервалы времени между байтами.
Оба варианта, естественно, надо делать в отдельном потоке.

Автор: chizh52 12.04.06, 09:58
Господа! Подскажите пожалуйста, че должна вернуть функция GetLastError, если я пытаюсь открыть уже открытый СОМ порт и получаю INVALID_HANDLE_VALUE от CreateFile. По логике должно возвращаться ERROR_ALREADY_EXISTS, хотя тоже сомнительно - ведь в вызове CreateFile при работе с коммуникационными устройствами параметр dwCreationDistribution устанавливается OPEN_EXISTING. Короче тот код, который выплевывает GetLastError при попытке открыть уже открытый в моем процессе порт или несуществующий физически - нигде не зарегестрирован. Описания стандартных системных кодов ошибок заканчивается на 6118L, а этот - 0x77F51502. Никак не пойму...

Автор: klumba 12.04.06, 12:28
На счет кода ошибки фиг знает.

Цитата Seva @
1. С помощью COMMTIMEOUTS настроить таймауты и читать данные блоками по 18 байт - контроллер COM-порта сам выровняется на границы блока данных. Недостаток - высокие требования к исполнению протокола.
2. Читать по одному байту и отсчитывать интервалы времени между байтами.
Оба варианта, естественно, надо делать в отдельном потоке.

Засинхронизировать по времени порт очень трудно. А читать по одному байту долго на мой взгляд. Мой совет использовать функцию ClearCommError, где один из параметров адрес на структуру COMSTAT, где в свою очередь есть поле cbInQue которое содержит количество байт не считанных из буффера. код типа таков:

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    DWORD dwValue;
    COMSTAT stat;
    byte *buf;
     
    while(){
       // сдесь можно подождать WaitCommEvent
       ClearCommError(hFile, &dwValue, &stat);
       if(stat.cbInQue == 0) continue;
       buf = new BYTE[stat.cbInQue];
       ReadFile(hFile, buf, stat.cbInQue, &dwValue, &ov_read);
       ...
       delete buf;
    }

Далее можно byf добавлять в большой buf и обрабатывать (разбивать на 18б блоки). Но так как размер пакета фиксирован в том что я написал, я смысла мало вижу :D.
А вообще Seva прав - пакет должен иметь заголовок.

Автор: VladimirTemirtau 12.04.06, 12:48
А вот мне нужно обратиться в midlet к порту, на котором сидит bluetooth в сотке. Необходимо принимать и получать данные с gps приемника, обрабатывать их, формировать в sms, отправлять его на другую сотку, а там посылать по bluetooth на комп. Задача - врагу не пожелаешь. Это для диплома. Просьба ко всем, кто знает как делать хоть что-нибудь из перечисленного, поделиться толковым рабочим примером/исходником в j2me :wall:
M
Вообще-то на этом форуме есть раздел, посвященный Java.
Писать вопрос куда попало не следует.
Сообщение будет через некоторое время удалено

Автор: /*---Женёк---*/ 12.04.06, 16:52
У меня типо подобное. Только надо принять сигнал с GPS приёмника - Com порта - разослать этот сигнал по локальной сети. Конечная система обрабатывает сигнал и пересылает к себе на порт. И приложение с GPS навигацией сможет работать на удалённом компьютере.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)