Com Port

  • Автор темы igorpromen2009
  • Дата начала
I

igorpromen2009

#1
Ребята, подскажите в решении проблемы:
Написал прогу для связи двух компов по rs-232. На компе с windows 98 все работает, а на компе с ХР нет?! Программа создавалась в Code Gear RAD STUDIO 2007 Builder C++
 
M

miditriy

#2
В 98х виндах можно напрямую к портам обращаться, в XP нужно использовать CreateFile, WriteFile, ReadFile, поищи в нете, по СОМ порту много информаци и готовых примеров, в свое время много с СОМ портом поработал и на Делфи и на Си
Исходники на работе завтра поищу, но не обещаю, очень давно это было.

Не проще по сети законнектиться?
 
I

igorpromen2009

#3
Я использовал CreateFile, WriteFile и ReadFile,
у меня что-то с флагами, может, не правильно?!
вот:
C++:
TForm1 *Form1;
HANDLE Port= CreateFile("COM2", GENERIC_READ|GENERIC_WRITE,0,NULL,
OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);
OVERLAPPED over;
DWORD n, m;

COMSTAT curstat;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{ typedef _DCB TDCB;

TDCB lpDCB;
if (!GetCommState(Port,&lpDCB))
{ShowMessage("Порт не открывается");	}
lpDCB.BaudRate=CBR_9600;
lpDCB.ByteSize=8;
lpDCB.Parity=NOPARITY;
lpDCB.StopBits=1;
lpDCB.fBinary=true;

if (!SetCommState(Port,&lpDCB))
{ShowMessage("Параметры порта не установлены"); }

_COMMTIMEOUTS lpCT;
GetCommTimeouts(Port,&lpCT);
lpCT.ReadIntervalTimeout=100;
lpCT.ReadTotalTimeoutMultiplier=200;
lpCT.ReadTotalTimeoutConstant=200;
lpCT.WriteTotalTimeoutConstant=200;
lpCT.WriteTotalTimeoutMultiplier=200;
SetCommTimeouts(Port,&lpCT);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
char *S_form="10001X110011000XXXX1";	

FlushFileBuffers(Port);

if (!WriteFile(Port,S_form,strlen(S_form),&n,&over))
{ ShowMessage("ошибка при записи в буфер");}
else ShowMessage("В порт записано "+IntToStr(n)+" байт");
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)
{
char *S1="101010101010101010101"; 
char *S= "010110101010101010010";	

AnsiString a;
DWORD lpEvtMask;
SetCommMask(Port,EV_RXCHAR);
char buffer[21];
memset(buffer,0,21);
WaitCommEvent(Port,&lpEvtMask,&over);

if (ReadFile(Port,buffer,21,&m,&over))
{
for (int i = 0; i < 20; i++) {
a[i]=buffer[i];
}
Memo2->Lines->Add(a);
if (a==S)
{ FlushFileBuffers(Port);

if (!WriteFile(Port,S,strlen(S),&m,&over)) { ShowMessage("ошибка при записи в буфер");}
else ShowMessage(" В порт записано "+IntToStr(m)+" байт");


}
else
{ FlushFileBuffers(Port);

if (!WriteFile(Port,S1,strlen(S1),&m,&over)) { ShowMessage("ошибка при записи в буфер");}
else ShowMessage("В порт записано "+IntToStr(m)+" байт");
}
}

else
Memo2->Lines->Add("Нет чтения");

просто очень нужно на com...
 
I

igorpromen2009

#4
Блин, точно, ребята, если кто будет сталкиваться с подобной ситуацией, обратите внимание на
HANDLE Port= CreateFile("COM2", GENERIC_READ|GENERIC_WRITE,0,NULL,
OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0); Если вместо FILE_FLAG_OVERLAPPED поставить NULL то все заработает!!!!!!!!!!!!

Да и не забываем кто работает в Builder объявлять overlapped в глобале:what?:


p.s. Сидел, счелкал что-то и вышло ничего себе даже!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!