Работа с Com портами.

Handsoff

New member
10.04.2008
1
0
#1
Помогите плиззз надо пересылать данные через COM порт с одного компа на другой... Может у когонить есть наброски? :)
 

EugenOS

Active member
22.07.2007
27
0
#3
Если еще актуально.

Есть несколько способов.

Самый простой в том смысле что искать ничего не надо - открываем хелп и находим описание функции CreateFile. ( только "событий" (aka Events) не ждите. Там есть механизм, но он не сразу понятен, особенно с налета (называется OVARLAPPED режим)

Можно поискать компоненты в инете. Мне понравилось работать c TCommThread. А по исходникам стало понятно как нормально работать с портами.
 
O

ollleg

#4
ПОМОГИТЕ, ПОЖАЛУЙСТА. Мне нужно считать строку из COM2, но я не знаю как это делать, уже целый день гуглю по интернету. Находил пример с АПИ-функциями, но он отказался работать, может дадите мне ссылочку на какойнить компонент?
 
W

WoodooMan

#6
пакет компонентов - cport-3.10

а вот рабочий пример на апи:

Код:
int OpenPort(AnsiString NumPort, int Baud) {
DCB ComDcb;
COMMTIMEOUTS TimeOuts;
int ok;

hCOM = INVALID_HANDLE_VALUE;
memset( &ComDcb, '\0', sizeof(DCB) );

NumPort = "\\\\.\\COM" + NumPort;
hCOM = CreateFile(NumPort.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

ok = hCOM != INVALID_HANDLE_VALUE;

// "baud=115200 parity=N data=8 stop=1"
AnsiString Param = "baud=" + IntToStr(Baud) + " parity=N data=8 stop=1";
ok = ok && BuildCommDCB(Param.c_str(), &ComDcb );
ComDcb.fDtrControl = DTR_CONTROL_ENABLE;
ComDcb.fBinary = true;

ok = ok && SetCommState( hCOM, &ComDcb );
ok = ok && GetCommTimeouts( hCOM, &TimeOuts );
TimeOuts.ReadTotalTimeoutMultiplier = 10;
ok = ok && SetCommTimeouts( hCOM, &TimeOuts );

if ( (!ok) && (hCOM != INVALID_HANDLE_VALUE) )
return 0;
if (hCOM == INVALID_HANDLE_VALUE)
return 0;
return 1;
}

//---------------------------------------------------------------------------
// закрытие СОМ- порта
void ClosePort() {
if (hCOM != INVALID_HANDLE_VALUE) {
CloseHandle( hCOM );
}
}

//---------------------------------------------------------------------------
// поиск свободных портов
void FindComPort(TStrings *ComList) {
AnsiString S;
char name[15];
int ok;
DCB ComDcb;

for (int i = 1; i <= 10; i++) {
hCOM = INVALID_HANDLE_VALUE;
memset( &ComDcb, '\0', sizeof(DCB) );

ComDcb.fRtsControl = RTS_CONTROL_ENABLE;

S = (AnsiString)i;
strcpy(name, "\\\\.\\COM");
strcat(name, S.c_str());

hCOM = CreateFile( name, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL );
ok = hCOM != INVALID_HANDLE_VALUE;
if (ok) {
ComList->Add("COM" + S);
CloseHandle( hCOM );
}
}
}

//---------------------------------------------------------------------------
int GetFromPort(unsigned char *buf, int len) {
DWORD rTmp;
if (ReadFile(hCOM, buf, len, &rTmp, NULL ))
return rTmp;
return 0;
}

//---------------------------------------------------------------------------
int Send2Port(unsigned char *SBuf, int sP, bool F) {
DWORD sTmp;
int WFRet;
unsigned char Ch;
if(F) {
while(GetFromPort(&Ch, 1) > 0)
Application->ProcessMessages();
}

WFRet = WriteFile(hCOM, SBuf, sP, &sTmp, NULL );
return WFRet ? sTmp: 0;
}
 

EugenOS

Active member
22.07.2007
27
0
#8
до чего же обленился нынешний новичек - я ввел TCommThread в нигме и вторая ссылка была на сайт автора (вернее страничку на кодегеаре)
откуда можно скачать компонент.(вернее класс)
 
O

ollleg

#9
я ввел TCommThread в нигме и вторая ссылка была на сайт автора (вернее страничку на кодегеаре)
я не знаю что такое нигма, в гугле искал я TCommThread ничего не нашол