Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.05.2010, 12:43   #1
Assemblerru
Форумчанин
 
Регистрация: 28.01.2010
Сообщений: 224
По умолчанию работа с портом

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

2 вопрос как все это проделать для ЛПТ порта
всему свое время как зиме и весне
и каждому солнцу свой неба кусок
Assemblerru вне форума Ответить с цитированием
Старый 02.05.2010, 19:33   #2
Assemblerru
Форумчанин
 
Регистрация: 28.01.2010
Сообщений: 224
По умолчанию

посматрите код почему он возвращает мне ошибку:
подключаемый файл с функциями;
#include <windows.h>
//---------------------------------------------------------------------------

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

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

//если все выполнилось то возвращаем положительный результат
return true;
}
//---------------------------------------------------------------------------
//функция чтения одного байта данных
bool WriteByteCOM (char bufer)
{
if (InnitPort () == true)
{
DWORD dwByteWrite = 0;
if (!WriteFile(hCom_1, &bufer, sizeof(char),
&dwByteWrite, NULL))
{return 0;}
return true;//возвращаем сведение о выполнении
}
else
{ return false;}
}
//---------------------------------------------------------------------------
//функция для записи одного байта
char ReadByte_COM ()
{
if (InnitPort () == true)
{
char bufer = 0x00;
DWORD dwByteWrite = 0;
do
{//читаем байт из порта
if (!ReadFile (hCom_1, &bufer, sizeof (char),
&dwByteWrite, NULL))
{return 0;}
} while (!dwSignal);
return bufer;
}
else
{
return 0xFF;
}
}
//---------------------------------------------------------------------------
void CloseCOM ()
{
if (over.hEvent)
{
CloseHandle (over.hEvent);//закрываем объект событие
}
if (hCom_1)
{
CloseHandle (hCom_1);
hCom_1 = NULL;
}
}
============================
рабочий файл:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if ( InnitPort ())
{
Label1 ->Caption = "работает";
}
else
{
Label1 ->Caption = "ашипка";
}

if ( WriteByteCOM (0xFF))
{
Label1 ->Caption = "работает";
}
else
{
Label1 ->Caption = "ашипка";//возрашает именно эту строку с ошибкой
}
CloseCOM ();
}
всему свое время как зиме и весне
и каждому солнцу свой неба кусок

Последний раз редактировалось Assemblerru; 02.05.2010 в 19:35.
Assemblerru вне форума Ответить с цитированием
Старый 02.05.2010, 20:31   #3
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

1- ответ:
Код:
typedef struct _DCB { // dcb  
    DWORD DCBlength;           // Размер DCB
    DWORD BaudRate;            // Скорость пересылки данных в бодах; 
                               // текущая скорость в бодах 
    DWORD fBinary: 1;          // binary mode, no EOF check 
                               // двоичный режим , не проверять конец 
                               // данных (по умолчанию значение = 1)
    DWORD fParity: 1;          // Включить проверку четность (по умолчанию
                               // значение = 1)
    DWORD fOutxCtsFlow:1;      // CTS управление потоком выхода 
    DWORD fOutxDsrFlow:1;      // DSR управление потоком выхода 
    DWORD fDtrControl:2;       // DTR Тип управления потоком скорости 
                               // передачи данных
    DWORD fDsrSensitivity:1;   // DSR sensitivity (чувствительность)
    DWORD fTXContinueOnXoff:1; // XOFF continues Tx (стоп-сигнал 
                               // продалжает выполнение)
    DWORD fOutX: 1;            // XON/XOFF out flow control (СТАРТ-  
                               // СИГНАЛ / СТОП-СИГНАЛ для управления 
                               // выходящим потоком (по умолчанию
                               // значение = 1)
    DWORD fInX: 1;             // XON/XOFF in flow control (СТАРТ-
                               // СИГНАЛ / СТОП-СИГНАЛ для управления 
                               // входящим потоком (по умолчанию
                               // значение = 1)
    DWORD fErrorChar: 1;       // enable error replacement (включить 
                               // проверку погрешностей по умолчанию=1)
    DWORD fNull: 1;            // enable null stripping (отвергать
                               // пустой поток данных (по умолчанию=1))
    DWORD fRtsControl:2;       // RTS управление потоком данных
    DWORD fAbortOnError:1;     // abort reads/writes on error  
                               // (проверять операции чтения/записи 
                               // по умолчанию=1)
    DWORD fDummy2:17;          // reserved ЗАРЕЗЕРВИРОВАНО 
    WORD wReserved;            // not currently used НЕ ДЛЯ 
                               // ИСПОЛЬЗОВАНИЯ 
    WORD XonLim;               // transmit XON threshold (порог 
                               // чувствительности старт-сигнала)
    WORD XoffLim;              // transmit XOFF threshold (порог
                               // чувствительности стоп-сигнала)
    BYTE ByteSize;             // Бит в байте  (обычно 8)
    BYTE Parity;               // 0-4=no,odd,even,mark,space 
                               // (четность байта)
    BYTE StopBits;             // 0,1,2 = 1, 1.5, 2 (стоповые биты)
    char XonChar;              // Tx and Rx XON character (вид
                               // старт сигнал в потоке)
    char XoffChar;             // Tx and Rx XOFF character (вид
                               // стоп сигнал в потоке)
    char ErrorChar;            // error replacement character (какой     
                               // сигнал погрешности,его вид)
    char EofChar;              // end of input character (сигнал 
                               // окончания потока)
    char EvtChar;              // received event character  РЕЗЕРВ
    WORD wReserved1;           // reserved; do not use НЕ ДЛЯ 
                               // ИСПОЛЬЗОВАНИЯ
} DCB;
2 - ответ: с LPT портом не совсем так работают
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 03.05.2010, 21:59   #4
Assemblerru
Форумчанин
 
Регистрация: 28.01.2010
Сообщений: 224
По умолчанию

а теперь как этим кодом воспользовться если через функции

bool WriteByteCOM (char bufer)
{
DWORD dwByteWrite = 0;
if (!WriteFile(hCom_1, &bufer, sizeof(char),
&dwByteWrite, NULL))
{return 0;}
return true;//возвращаем сведение о выполнении
}
всему свое время как зиме и весне
и каждому солнцу свой неба кусок
Assemblerru вне форума Ответить с цитированием
Старый 03.05.2010, 22:21   #5
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Код:
//настраиваем параметры порта
dcb.BaudRate = CBR_19200;//скорость передачи
dcb.ByteSize = 8;//размер передачи
dcb.StopBits = ONESTOPBIT;//один стоповый бит

//А как указать на проверку четности и как от нее отказаться
dcb.fparity = 1;
Код:
function SetCommStatus(Baud: Integer): Boolean;
var DCB: TDCB;
begin
 with DCB do begin
  DCBlength:=SizeOf(Tdcb);
  BaudRate := Baud;
  Flags:=12305;
  wReserved:=0;
  XonLim:=600;
  XoffLim:=150;
  ByteSize:=8;
  Parity:=0;
  StopBits:=0;
  XonChar:=#17;
  XoffChar:=#19;
  ErrorChar:=#0;
  EofChar:=#0;
  EvtChar:=#0;
  wReserved1:=65;
 end;
 Result:= SetCommState(Com, DCB)
end;

function opencom(comPort:string; InQueue,OutQueue,Baud: LongInt): Boolean;
begin
 comport:= uppercase(comport);
 if Com > 0 then closecom;
 Com:= CreateFile(PChar(comPort),
  GENERIC_READ or GENERIC_WRITE,
  0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
 Result:= (Com > 0) and SetCommTiming and
 SetCommBuffer(InQueue,OutQueue) and
 SetCommStatus(Baud)
end;
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 04.05.2010, 13:26   #6
Assemblerru
Форумчанин
 
Регистрация: 28.01.2010
Сообщений: 224
По умолчанию

Ну а на С++ как это перевести
всему свое время как зиме и весне
и каждому солнцу свой неба кусок
Assemblerru вне форума Ответить с цитированием
Старый 04.05.2010, 13:51   #7
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...а чего тут переводить, у вас же выше все написано, API он и в африке API вам нужно было всего-лишь правильно заполнить структуру DCB/
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 04.05.2010, 21:12   #8
Assemblerru
Форумчанин
 
Регистрация: 28.01.2010
Сообщений: 224
По умолчанию

А всетаки посмотрите мой код который я написал:
//объявляем переменные и новый класс:
#include <vcl.h>
#pragma hdrstop

#include <windows.h>
//объявим структуру для конфигурации СОМ порта
DCB dcb;
//дескриптор порта
HANDLE hCom_1 = NULL;
//для выделения сигнала
DWORD dwSignal;
//объявим структуру для асинхронной работы порта
OVERLAPPED over;
//----------------------------------------------------------------
class MuClDataOutPort
{
private:
//пишим функцию инициализации порта СОМ1
bool InnitPort (char* DataPort)
{
//открываем порт СОМ 1
hCom_1 = CreateFile (DataPort, GENERIC_READ|GENERIC_WRITE,
0,NULL, OPEN_EXISTING,
FILE_FLAG_OVERLAPPED, NULL);
if (hCom_1 == INVALID_HANDLE_VALUE)//если порт не удалось открыть
{
CloseHandle (hCom_1);
return false;//выходим из функции с ошибкой
}
//настраиваем параметры порта
dcb.BaudRate = CBR_19200;//скорость передачи
dcb.ByteSize = 8;//размер передачи
dcb.StopBits = ONESTOPBIT;//один стоповый бит
dcb.Parity = NULL;
//проверяем на правильность настройки

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

//если все выполнилось то возвращаем положительный результат
return true;
}
public:
//функция чтения одного байта данных
bool WriteByte (unsigned char bufer, char* Data)
{
if (InnitPort (Data))
{
DWORD dwByteWrite = 0;
if (!WriteFile(hCom_1, &bufer, sizeof(char),
&dwByteWrite, NULL))
{return false;}
return true;//возвращаем сведение о выполнении
}
else
{ return false;}
}
};
#pragma package(smart_init)
===================================
в другом приложении используем методы класса:
===================================
#include "С\..."//типа путь к файлу где описан класс
MuClDataOutPort myClass;
//а теперь по событию нажатия кнопки расположенной на форме пишим следующий код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (myClass.WriteByte (0x12, "COM1"))
{
Label1 ->Caption = "ура работает";
return;
}
Label1 ->Caption = "ашипка";
myClass.ClosePort();
}
//----------------------------------------------------------------
Мой вопрос почему почему в метку выводится
Label1 ->Caption = "ашипка";вроде все правильно описал
//----------------------------------------------------------------
всему свое время как зиме и весне
и каждому солнцу свой неба кусок
Assemblerru вне форума Ответить с цитированием
Старый 04.05.2010, 21:39   #9
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...начнем с того, чтобы не заморачиваться с заполнением структуры DCB, это можно поручить самой системе через GetCommState()
Код:
 DCB dcb;
 GetCommState(hCom_1, &dcb);

 dcb.BaudRate = CBR_115200;
 dcb.ByteSize = 8;
 dcb.StopBits = ONESTOPBIT;
 dcb.fParity = 0;
 SetCommState(hCom_1, &dcb);

 COMMTIMEOUTS timeouts;
 timeouts.ReadIntervalTimeout = 1;
 timeouts.ReadTotalTimeoutConstant = 1;
 timeouts.ReadTotalTimeoutMultiplier = 0;
 timeouts.WriteTotalTimeoutConstant = 10;
 timeouts.WriteTotalTimeoutMultiplier = 0;
 SetCommTimeouts(hCom_1, &timeouts);
далее посылаем байт и проверяем прием:
Код:
 OVERLAPPED o;
 o.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
	
 // тестовый байт для проверки устройства
 const BYTE TEST_BYTE[]  = {0, 0x12};
 DWORD bytesCount;

 WriteFile(hCom_1, &TEST_BYTE[0], 2, &bytesCount, &o);

 DWORD error = GetLastError();
 if(error ==  ERROR_IO_PENDING){
	DWORD result = WaitForSingleObject(o.hEvent, 50);
	if(result == WAIT_TIMEOUT){
		CloseHandle(hCom_1);
		return FALSE;
	}
 }else{
 CloseHandle(hCom_1);
 return FALSE;
 }

 Sleep(50);

 BYTE receivedByte[128] = {0};
 ReadFile(hCom_1, &receivedByte[0], 128, &bytesCount, &o);
 error = GetLastError();
 if(error == ERROR_IO_PENDING){
	DWORD result = WaitForSingleObject(o.hEvent, 200);
	if(result == WAIT_TIMEOUT){
		CloseHandle(hCom_1);
		return FALSE;
	}else{
		BOOL replyFound = false;
	                       for(int i=0; i<128 && !replyFound; i++){
			replyFound = (receivedByte[i] == 0x12);
		}
	CloseHandle(hCom_1);
	///return replyFound; // возвращаем
   }
 }else{
 CloseHandle(hCom_1);
 return FALSE;
}
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 04.05.2010 в 21:48.
raxp вне форума Ответить с цитированием
Старый 05.05.2010, 17:35   #10
Assemblerru
Форумчанин
 
Регистрация: 28.01.2010
Сообщений: 224
По умолчанию

А посмотрите еше вот что он работает и не выдает ошибок... Мне кажится что удалось собрать сведения о работе порта.
#include <windows.h>
char Data;
//==================================
//глобальные переменные
//------------------------------------------
//объявим структуру для конфигурации СОМ порта
DCB dcb;
/*
ZeroMemory (&dcb, sizeof (DCB));// не знает что ето такое
//дескриптор порта
*/
HANDLE hCom_1 = NULL;
//------------------------------------------
//объявим структуру для асинхронной работы порта
OVERLAPPED over;
//------------------------------------------
//для выделения сигнала
DWORD dwSignal;

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

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

//если все выполнилось то возвращаем положительный результат
return true;
}
/*Теперь когда порт открыт и настроен, нужно настроить
обработку сигналов DSR и CTS.
*/
//пишим функцию настройки событий
bool SetEventCOM ()
{
//настраиваем мониторинг порта
if (!SetCommMask (hCom_1, EV_DSR|EV_CTS))
//если не удалось настроить порт
{
CloseHandle (hCom_1);
return false;//выходим из функции с ошибкой
}
//создаем объект событие
over.hEvent = CreateEvent ( NULL, FALSE, FALSE, NULL);
if (over.hEvent)
{
//при неудачи выходим из функции с ошибкой
CloseHandle (hCom_1);
return false;//выходим из функции с ошибкой
}
//если все выполнилось то возвращаем положительный результат
return true;
}
//функция чтения одного байта данных
BYTE ReadByteCOM ()
{
BYTE read = 0;
DWORD dwByteRead = 0;
do
{//читаем байт из порта
if (!ReadFile (hCom_1, &read, sizeof (BYTE), &dwByteRead, NULL))
{return 0;}
} while (!dwByteRead);
return read;//возвращаем данные
}
//=================================== ==========
//функция чтения массива данных
//=================================== ==========
//функция чтения одного байта данных
bool WriteByteCOM (char bufer)
{
DWORD dwByteWrite = 0;
if (!WriteFile(hCom_1, &bufer, sizeof(char), &dwByteWrite, NULL))
{return 0;}
return true;//возвращаем сведение о выполнении
}
//функция для записи одного байта
char ReadByte_COM ()
{
char bufer = 0x00;
DWORD dwByteWrite = 0;
do
{//читаем байт из порта
if (!ReadFile (hCom_1, &bufer, sizeof (char), &dwByteWrite, NULL))
{return 0;}
} while (!dwSignal);
return bufer;
}
//общая функция для работы с портом
void GeneralCOMRead ()
{
//проверяем сигнал в линии
if (dwSignal & EV_DSR)//данные готовы для чтения
{
//читаем байт из порта
Data = ReadByte_COM ();
//сохраняем байт куда-либо
}

}
void GeneralCOMWrite ()
{
//проверяем сигнал в линии
if (dwSignal & EV_CTS)//данные готовы для записи
{
//пердаем байт из вне и записываем его в порт
WriteByteCOM (Data);
}

}
void CloseCOM ()
{
if (over.hEvent)
{
CloseHandle (over.hEvent);//закрываем объект событие
}
if (hCom_1)
{
CloseHandle (hCom_1);
hCom_1 = NULL;
}
}
всему свое время как зиме и весне
и каждому солнцу свой неба кусок
Assemblerru вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с com портом Валера777 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 05.12.2009 00:06
Работа с com портом albles Общие вопросы C/C++ 2 16.11.2009 15:15
Работа c COM-портом doniyor Общие вопросы Delphi 12 27.07.2009 11:16
Работа с COM-портом jovanny Помощь студентам 2 03.05.2009 18:06
работа с COM портом ShAzat Общие вопросы Delphi 8 28.05.2008 20:08