Com Port

Тема в разделе "Общие вопросы по С и С++", создана пользователем igorpromen2009, 14 дек 2010.

  1. igorpromen2009

    igorpromen2009 Гость

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

    miditriy Гость

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

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

    igorpromen2009 Гость

    Я использовал 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...
     
  4. igorpromen2009

    igorpromen2009 Гость

    Блин, точно, ребята, если кто будет сталкиваться с подобной ситуацией, обратите внимание на
    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. Сидел, счелкал что-то и вышло ничего себе даже!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     
Загрузка...

Поделиться этой страницей