Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 11.08.2010, 16:48   #1
Dimitr_88
Пользователь
 
Регистрация: 03.08.2010
Адрес: Харько
Сообщений: 11
Репутация: 10
По умолчанию Чтение данных с COM порта 232

Столкнуля с такой проблемой. Пишу прогу на С++ Билдер 6 и требуется считать данные с СОМ порта JS232 кажется. Как это можно реализовать? Опишите по возможности весь процесс. Заранее благодарю.
Dimitr_88 вне форума   Ответить с цитированием
Старый 11.08.2010, 16:56   #2
raxp
Профессионал
 
Регистрация: 29.09.2009
Сообщений: 9,742
Репутация: 3006
По умолчанию

весь процесс в MSDN ...из книжек: "Программирование аппаратных средств ПК" и множество других справочников.

...из форума, пользуемся поиском 1 2
__________________
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума   Ответить с цитированием
Старый 11.08.2010, 19:31   #3
Assemblerru
Форумчанин
 
Регистрация: 28.01.2010
Адрес: с Новая Деревня (Ставропольского края)
Сообщений: 224
Репутация: 21
По умолчанию

Уважаемый, действительно не так давно мне лично по этому вапросу помогли но по порту ЛПТ. Приведу листинг для билдера описан как класс с выводом 1 байта,какраз для СОМ порта. Если хочеш измениш да и провериш. Если смогёш то кинь личное сообшение с перекомпилированным кодом, да и что у тебя из этого получилось тоже опиши пожалуста....
Оформиш код как расширение .cpp

Код:
#include <vcl.h>
#pragma hdrstop

#include  <windows.h>
//---------------------------------------------------------------------------

/*
ZeroMemory (&dcb, sizeof (DCB));// не знает что ето такое
*/
//объявим структуру для асинхронной работы порта
OVERLAPPED over;
//для выделения сигнала
DWORD dwSignal;
//объявим структуру для конфигурации СОМ порта
DCB dcb;
//дескриптор порта
HANDLE hPortDat = NULL;
//переменная для чтения
char Data;
//==================================
//---------------------------------------------------------------------------
class MuClDataOutPort
{
private:

  //пишим функцию инициализации порта
 bool InnitPort ()
 {
   //открываем порт СОМ 1
   hPortDat = CreateFile ("COM1", GENERIC_READ|GENERIC_WRITE,
                                   0,NULL, OPEN_EXISTING, 
                                   FILE_FLAG_OVERLAPPED, NULL);
   if (hPortDat == INVALID_HANDLE_VALUE)//если порт не удалось открыть
    {
     CloseHandle (hPortDat);
     return false;//выходим из функции с ошибкой
	}
   //настраиваем параметры порта
  dcb.BaudRate = CBR_19200;//скорость передачи
 dcb.ByteSize = 8;//размер передачи
  dcb.StopBits = ONESTOPBIT;//один стоповый бит
  dcb.Parity = NULL;
  //проверяем на правильность настройки

   if ( !SetCommState ( hPortDat, &dcb))  //тоже не работает....
    {
     CloseHandle (hPortDat);
     return false;//выходим из функции с ошибкой
   }

  //если все выполнилось то возвращаем положительный результат
  return true;
 }
//----------------------------------------------------
//функция чтения одного байта данных
 BYTE ReadByteCOM ()
  {
  if (InnitPort ())
  {
	BYTE read = 0;
	DWORD dwByteRead = 0;
	  do
    {//читаем байт из порта
      if (!ReadFile (hPortDat, &read, sizeof (BYTE), &dwByteRead, NULL))
		 {return 0xFF;}
	}  while (!dwByteRead);
   return read;//возвращаем данные
  } 
 else
  {
   return 0xFF;
  }
 }
//------------------------------------------------------
//функция чтения одного байта данных
 bool WriteByteCOM (char bufer)
 {
  if (InnitPort ())
  {
   DWORD dwByteWrite = 0;
	if (!WriteFile(hPortDat, &bufer, sizeof(char), &dwByteWrite, NULL))
       {return false;}
  return true;//возвращаем сведение о выполнении
  }
 else
  {
   return false;
  }  
 }
//=============================================
//функция чтения массива данных
//=============================================
//=============================================
//=============================================
public:
//общая функция для работы с портом
 void GeneralCOMRead ()
 {
  //проверяем сигнал в линии
    if (dwSignal & EV_DSR)//данные готовы для чтения
      {
        //читаем байт из порта
	Data = ReadByteCOM ();
       //сохраняем байт куда-либо
     }
 }
//---------------------------------------------------------
 void GeneralCOMWrite (char InData)
 { 
  //проверяем сигнал в линии
     if (dwSignal & EV_CTS)//данные готовы для записи
     {
     //пердаем байт из вне и записываем его в порт
	 WriteByteCOM (InData);
     }
 }
//---------------------------------------------------------
 void CloseCOM ()
 {
   if (over.hEvent)
  {
   CloseHandle (over.hEvent);//закрываем объект событие
  }
  if (hPortDat)
  {
	CloseHandle (hPortDat);
   hPortDat = NULL;
  }
 }
};
#pragma package(smart_init)
__________________
всему свое время как зиме и весне
и каждому солнцу свой неба кусок

Последний раз редактировалось Assemblerru; 11.08.2010 в 19:35.
Assemblerru вне форума   Ответить с цитированием
Старый 30.08.2010, 10:08   #4
Dimitr_88
Пользователь
 
Регистрация: 03.08.2010
Адрес: Харько
Сообщений: 11
Репутация: 10
По умолчанию

С данным кодом считать нормально не получилось. Сделал по-своему:
HANDLE hCom = CreateFile("Com1",GENERIC_READ | GENERIC_WRITE,0,NULL, OPEN_EXISTING, 0, NULL);
if( hCom == INVALID_HANDLE_VALUE )
{
ShowMessage("Com port error");
CloseHandle(hCom);
} //if ( hCom == INVALID_HANDLE_VALUE )
else
{
DCB dcb;
GetCommState(hCom, &dcb);
dcb.BaudRate = CBR_9600;
dcb.fParity = false;
dcb.ByteSize = 8;
dcb.Parity = EVENPARITY;
dcb.StopBits = ONESTOPBIT ;
SetCommState(hCom,&dcb);
DWORD feedback = 0;
char buf[32];
ReadFile(hCom, buf, sizeof(buf), &feedback, NULL);
CloseHandle(hCom);
}
Считывание происходит в массив char buf[32].
Dimitr_88 вне форума   Ответить с цитированием
Старый 01.09.2010, 09:42   #5
Dimitr_88
Пользователь
 
Регистрация: 03.08.2010
Адрес: Харько
Сообщений: 11
Репутация: 10
По умолчанию

В предыдущем сообщении я выложил отрывок своего кода для считывания данных с ком-порта RS232. Все работает правильно, но очень медленно. Отрывок

ReadFile(hCom, buf, sizeof(buf), &feedback, NULL);
CloseHandle(hCom);

выполняется от 0,3 до 1 секунды!!! Кто-то знает почему так долго? Остальная часть кода(поиск нужной части полученных данных, перевод их в реальное число и построение графика) выполняется за 0,012с, так что тугость машины отбрасываем. Это связано с тем что это ком-порт? Или функция рид файл такая тугая? Есть ли какая-нибудь альтернатива(похожая функция или надо на ЮСБ перепаивать)?
Dimitr_88 вне форума   Ответить с цитированием
Старый 01.09.2010, 09:51   #6
raxp
Профессионал
 
Регистрация: 29.09.2009
Сообщений: 9,742
Репутация: 3006
По умолчанию

...на это влияют таймауты, размер буфера и установленная скорость ...поставь 115200, сравни
...USB даст большую скорость, PCI еще большую
__________________
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 01.09.2010 в 09:53.
raxp вне форума   Ответить с цитированием
Старый 01.09.2010, 09:59   #7
blob
Пользователь
 
Регистрация: 24.08.2010
Сообщений: 34
Репутация: 10
По умолчанию

Тут уже всё написали конечно, просто выложу этот класс, может кому будет полезно.
Вложения
Тип файла: rar rs232.rar (3.4 Кб, 390 просмотров)
blob вне форума   Ответить с цитированием
Старый 01.09.2010, 11:25   #8
Dimitr_88
Пользователь
 
Регистрация: 03.08.2010
Адрес: Харько
Сообщений: 11
Репутация: 10
По умолчанию

Поставить какую-либо скорость кроме 9600 не представляется возможным, т.к. весовой терминал, с которого происходит считывание через ком, расчитан только на эту скорость...((( Интересно послушать мнения на счет альтернативы для функции ридфайл...
Dimitr_88 вне форума   Ответить с цитированием
Старый 02.09.2010, 09:52   #9
Dimitr_88
Пользователь
 
Регистрация: 03.08.2010
Адрес: Харько
Сообщений: 11
Репутация: 10
По умолчанию

А как узнать длительность таймаута?
Dimitr_88 вне форума   Ответить с цитированием
Старый 02.09.2010, 09:59   #10
raxp
Профессионал
 
Регистрация: 29.09.2009
Сообщений: 9,742
Репутация: 3006
По умолчанию

ReadFile() и так API функция ...торможение считывания на компе также может быть связано с наличием таких процессов как антивирус, вирус, видео и т.п. загружающие процессор и железо вещи, также и настройкой самой оси.
__________________
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение com-порта на java danyamaster Фриланс 3 15.02.2013 14:09
Асинхронная обработка принятых данных от порта osandr Общие вопросы Delphi 3 02.06.2010 09:32
чтение с COM-порта в отдельном потоке не получается lexluter1988 Общие вопросы .NET 2 25.05.2010 20:40
Приём данных с com порта kyc0k Помощь студентам 3 28.03.2008 16:04
Как получить данные с COM-порта или другого любого порта? DeLure Общие вопросы C/C++ 5 20.09.2007 00:50


09:51.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.