На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
  
> Как программировать COM порт
    :wall: Как реализовать прием передачу последовательных данных через COM порт?
      Посмотри здесь
        Зачем усложнять себе жизнь? Не проще ли использовать готовый компонент?
        Например, TComPort 3.0
        работает с C Builder версии от 3 до 6 :D
        Использовать вообще очень просто
        ExpandedWrap disabled
          ComPort1->ShowSetupDialog(); // Диалог настроек COM-порта
          ComPort1->Open(); // Соединяемся
          ComPort1->WriteStr("Hello!"); // Пишем строку
          ComPort1->Close(); // Закрываем COM-порт

        и такъ далее
          Vovik Если есть желание можешь глянуть как осуществить последовательный прием-передачу посредством COM порта с использованием WinAPI на стр.7, тема "Работа с COM портом". Там есть небольшая прога с коментариями. :yes:
            програмируй сам, без компанентов, разберёшся - будешь мастером! поищи как програмируют через API функции, в нете есть статьи по программированию последовательных интерфейсов с помощью API функций. так и пиши в поисковиках. Тема интересная, и не такая уж сложная если разобраться. Пользуй статьи и MSDN, там описание API. Погляди CreateFile(), ReadFile(), WriteFile(), GetCommState(), структуры DCB, и ещё там несколько. а вообще в чём твоя задача?
              W_in_d тебе отличную ссылку кинул! (http://www.rs232.ru/doc002.html) респект ему. больше ничего и не надо, MSDN тока.
                Возникла следующая проблема при работе с нестандартным СOM устройством: данные от устройства поступают пакетами по 18 байт, потом пауза = времени передачи 2-ух байтов, затем следующая посылка... Данные в посылке произвольные двоичные, поэтому нельзя использовать XON, XOFF символы. Вопрос: как отследить начало (конец) посылки в среде Win32?
                  Vovik поделись знаниями - как продвигаеться работа с Com-портом. Чем пользуешься компонентом или WinApi?
                  А я тут с Чтением из порта встрял..... :wall:
                    Цитата makaka @
                    Возникла следующая проблема при работе с нестандартным СOM устройством: данные от устройства поступают пакетами по 18 байт, потом пауза = времени передачи 2-ух байтов, затем следующая посылка... Данные в посылке произвольные двоичные, поэтому нельзя использовать XON, XOFF символы. Вопрос: как отследить начало (конец) посылки в среде Win32?

                    И даже заголовка у пакете нет?
                    1. С помощью COMMTIMEOUTS настроить таймауты и читать данные блоками по 18 байт - контроллер COM-порта сам выровняется на границы блока данных. Недостаток - высокие требования к исполнению протокола.
                    2. Читать по одному байту и отсчитывать интервалы времени между байтами.
                    Оба варианта, естественно, надо делать в отдельном потоке.
                      Господа! Подскажите пожалуйста, че должна вернуть функция GetLastError, если я пытаюсь открыть уже открытый СОМ порт и получаю INVALID_HANDLE_VALUE от CreateFile. По логике должно возвращаться ERROR_ALREADY_EXISTS, хотя тоже сомнительно - ведь в вызове CreateFile при работе с коммуникационными устройствами параметр dwCreationDistribution устанавливается OPEN_EXISTING. Короче тот код, который выплевывает GetLastError при попытке открыть уже открытый в моем процессе порт или несуществующий физически - нигде не зарегестрирован. Описания стандартных системных кодов ошибок заканчивается на 6118L, а этот - 0x77F51502. Никак не пойму...
                        На счет кода ошибки фиг знает.

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

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

                        ExpandedWrap disabled
                          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 прав - пакет должен иметь заголовок.
                        Сообщение отредактировано: klumba -
                          А вот мне нужно обратиться в midlet к порту, на котором сидит bluetooth в сотке. Необходимо принимать и получать данные с gps приемника, обрабатывать их, формировать в sms, отправлять его на другую сотку, а там посылать по bluetooth на комп. Задача - врагу не пожелаешь. Это для диплома. Просьба ко всем, кто знает как делать хоть что-нибудь из перечисленного, поделиться толковым рабочим примером/исходником в j2me :wall:
                          M
                          Вообще-то на этом форуме есть раздел, посвященный Java.
                          Писать вопрос куда попало не следует.
                          Сообщение будет через некоторое время удалено
                          Сообщение отредактировано: trainer -
                            У меня типо подобное. Только надо принять сигнал с GPS приёмника - Com порта - разослать этот сигнал по локальной сети. Конечная система обрабатывает сигнал и пересылает к себе на порт. И приложение с GPS навигацией сможет работать на удалённом компьютере.
                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                            0 пользователей:


                            Рейтинг@Mail.ru
                            [ Script execution time: 0,0767 ]   [ 16 queries used ]   [ Generated: 19.03.24, 03:48 GMT ]