Avatar billede asgerm Nybegynder
11. marts 2005 - 08:51 Der er 4 kommentarer og
1 løsning

Hjælp til COM

Hej, jeg har et problem med nedenstående kode...

-----------------------------------------------------------------
#include <stdio.h>
#include <windows.h>
#include <conio.h>
#include <iostream>

char GlobalBuffer1[128], GlobalBuffer2[128], GlobalBuffers[128];
int i;
DWORD GlobalLength, GlobalDummy;

void SetTimeOut(HANDLE Port, int sec)
{
  COMMTIMEOUTS commtimeouts;
  GetCommTimeouts(Port, &commtimeouts);
  commtimeouts.ReadIntervalTimeout = MAXDWORD;
  commtimeouts.ReadTotalTimeoutMultiplier = 0;
  commtimeouts.ReadTotalTimeoutConstant = 0;
  SetCommTimeouts(Port, &commtimeouts);
}

void SendCom1()
{
  DCB dcb;
  HANDLE ComPort = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

  if(ComPort == INVALID_HANDLE_VALUE)
  {
      printf("Failed to open port nr 1\n");
  }

  GetCommState(ComPort, &dcb);
  dcb.BaudRate = 9600;
  dcb.ByteSize = 8;
  dcb.Parity = 0;
  dcb.StopBits = ONESTOPBIT;
  dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
  dcb.fOutxCtsFlow = 1;
  SetCommState(ComPort, &dcb);
  SetTimeOut(ComPort, 1);
 
  WriteFile(ComPort, GlobalBuffer2, strlen(GlobalBuffer2), &GlobalDummy, 0);
  for(i = 0; i < 128; i++)
  {
  GlobalBuffer2[i] = '\0';     
  }
  CloseHandle(ComPort);

}

void SendCom2()
{
  DCB dcb;
  HANDLE ComPort = CreateFile("COM2", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

  if(ComPort == INVALID_HANDLE_VALUE)
  {
      printf("Failed to open port nr 2\n");
  }

  GetCommState(ComPort, &dcb);
  dcb.BaudRate = 4800;
  dcb.ByteSize = 8;
  dcb.Parity = 0;
  dcb.StopBits = ONESTOPBIT;
  dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
  dcb.fOutxCtsFlow = 1;
  SetCommState(ComPort, &dcb);
  SetTimeOut(ComPort, 1);
 
  WriteFile(ComPort, GlobalBuffer1, strlen(GlobalBuffer1), &GlobalDummy, 0);
  for(i = 0; i < 128; i++)
  {
  GlobalBuffer1[i] = '\0';     
  }

  CloseHandle(ComPort);

}

void SendCom2s()
{
  DCB dcb;
  HANDLE ComPort = CreateFile("COM2", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

  if(ComPort == INVALID_HANDLE_VALUE)
  {
      printf("Failed to open port nr 2\n");
  }

  GetCommState(ComPort, &dcb);
  dcb.BaudRate = 4800;
  dcb.ByteSize = 8;
  dcb.Parity = 0;
  dcb.StopBits = ONESTOPBIT;
  dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
  dcb.fOutxCtsFlow = 1;
  SetCommState(ComPort, &dcb);
  SetTimeOut(ComPort, 1);
 
  WriteFile(ComPort, GlobalBuffers, strlen(GlobalBuffers), &GlobalDummy, 0); 
  CloseHandle(ComPort);

}

void ModtagerCom1()
{
  DCB dcb;
  HANDLE ComPort = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

  if(ComPort == INVALID_HANDLE_VALUE)
  {
      printf("Failed to open port nr 3\n");
  }

  GetCommState(ComPort, &dcb);
  dcb.BaudRate = 9600;
  dcb.ByteSize = 8;
  dcb.Parity = 0;
  dcb.StopBits = ONESTOPBIT;
  dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
  dcb.fOutxCtsFlow = 1;
  SetCommState(ComPort, &dcb);
  SetTimeOut(ComPort, 1);
 
  ReadFile(ComPort, GlobalBuffer1, 128, &GlobalLength, 0);
  CloseHandle(ComPort);
}

void ModtagerCom2()
{
  DCB dcb;
  HANDLE ComPort = CreateFile("COM2", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

  if(ComPort == INVALID_HANDLE_VALUE)
  {
      printf("Failed to open port nr 4\n");
  }

  GetCommState(ComPort, &dcb);
  dcb.BaudRate = 4800;
  dcb.ByteSize = 8;
  dcb.Parity = 0;
  dcb.StopBits = ONESTOPBIT;
  dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
  dcb.fOutxCtsFlow = 1;
  SetCommState(ComPort, &dcb);
  SetTimeOut(ComPort, 1);
 
  ReadFile(ComPort, GlobalBuffer2, 128, &GlobalLength, 0);
  CloseHandle(ComPort);

}
int main()
{
int DONE=0, in1;
char in2[128];

while(!DONE)
{
    ModtagerCom1();
    SendCom2();
   
    if(kbhit())
    {
      if ((in1 = getch()) == '\x1B')
        {
            DONE = 1;
        }
        else
        {
            putch(in1);
            GlobalBuffers[0] = in1;
            GlobalBuffers[1] = 0;
            SendCom2s();
        }       
    }
   
    ModtagerCom2();
    SendCom1();
}   
}
-----------------------------------------------------------------

Hvis man sender ordet "start" over COM1 så skulle hele ordet blive sendt videre til COM2, men der bliver kun udskrevet et tegn eller to... det er lidt forskelligt!

Jeg er på bar bund i henhold til hvor de manglende tegn bliver af!

I bund og grund er meningen med programmet at det skal kunne modtage et signal fra COM1 og sende til videre til COM2 på en anden PC og omvendt.

Skriv hvis jeg skal forklare det bedre! :D

MVH

  Fossy
Avatar billede segmose Nybegynder
11. marts 2005 - 16:49 #1
void ModtagerCom2()
{
  DCB dcb;
  HANDLE ComPort = CreateFile("COM2", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

... snip

CloseHandle(ComPort);

}

Du åbner den og så lukker du den igen omgående???
Avatar billede asgerm Nybegynder
14. marts 2005 - 07:16 #2
Hvis man fjener CloseHandle(ComPort); og man kører programmet så skriver den 'Failed to open port nr 3' og 'Failed to open port nr 4', CloseHandle lukker Com porten efter at den har udført sin funktion som er ReadFile eller WriteFile.
Avatar billede bertelbrander Novice
14. marts 2005 - 23:10 #3
Jeg tror at du skal åbne alle portene én gang når du starter programmet og lukke den lige ingen du lukker.

Jeg tror at du når at lukke porten inden den har fået skrevet det hele.

Hvis du fjerner CloseHandle(ComPort); kan den ikke åbne porten næste gang den kommer til funktionen, da man kun kan åbne porten én gang.
Avatar billede asgerm Nybegynder
23. marts 2005 - 08:09 #4
Hej jeg undskylder den lange svartid.

Jeg har fået en til at hjælpe mig, så hvis I smider et svar så får i nogle points! :O)

Men venlig hilsen
Fossy
Avatar billede asgerm Nybegynder
12. april 2005 - 12:15 #5
oki... så lukker jeg spørgsmålet!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester