Avatar billede lubker Nybegynder
02. november 2008 - 15:56 Der er 10 kommentarer og
1 løsning

Simpel RS232 kommunikation

Hej.
Jeg sidder og prøver at kigge på lidt rs232 kommunikation i c++ builder.

Jeg har fundet en masse eksempler med overførsel af en stregn, men hvordan kan dette gøres hvis der skal sendes og modtages en enkelt byte?

En der har et lille simpelt eksempel?
Avatar billede arne_v Ekspert
02. november 2008 - 16:13 #1
Eksemplerne sender vel et char array ?

Og en enkelt byte er et char array med 1 element.
Avatar billede lubker Nybegynder
02. november 2008 - 16:52 #2
Det er selvfølgelig rigtigt.
Jeg har testet nedenstående, hvor jeg nu har omskrevet den til at benytte int som parameter til afsendelsen.

Desværre kan jeg ikke kalde funktionen Tx udenfor funktionen initRS232 da ComPort ikke er initialiseret. Det er selvfølgelig rigtigt at den udelukkende er defineret i RS232init funktionen men hvordan kan jeg omgå dette?

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

void Tx(HANDLE Port, int data)
{
  DWORD Dummy;
  WriteFile(Port, &data, 1, &Dummy, 0);
  WriteFile(Port, "\r\n", 2, &Dummy, 0);
}

void Rx(HANDLE Port)
{
  char Buffer[128];
  DWORD Length, i;

  ReadFile(Port, Buffer, 128, &Length, 0);

}

void initRS232(void)
{
  DCB dcb;
  HANDLE ComPort = CreateFile("COM5", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);

  GetCommState(ComPort, &dcb);
  dcb.BaudRate = 9600;
  dcb.ByteSize = 8;
  dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
  dcb.fOutxCtsFlow = 1;
  SetCommState(ComPort, &dcb);
  SetTimeOut(ComPort, 1);

  Tx(ComPort, 0x22);
}
Avatar billede bertelbrander Novice
03. november 2008 - 00:05 #3
Man kunne f.eks:

HANDLE initRS232(void)
{
  DCB dcb;
  HANDLE ComPort = CreateFile("COM5", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);

  GetCommState(ComPort, &dcb);
  dcb.BaudRate = 9600;
  dcb.ByteSize = 8;
  dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
  dcb.fOutxCtsFlow = 1;
  SetCommState(ComPort, &dcb);
  SetTimeOut(ComPort, 1);
  return ComPort;
}

int main()
{
  HANDLE port = initRS232();
  Tx(port, 0x22);
}
Avatar billede lubker Nybegynder
03. november 2008 - 08:44 #4
Den var ikke helt glad for main loopet.

Istedet prøvede jeg at flytte
HANDLE port = initRS232();
Tx(port, 0x22);
til tx funktionen, hvilket egentlig fungerer ganske udmærket 1. gang denne benyttes.

Problemet ligger nok mest i at jeg ønsker en initialisering når programmet starter, og derefter kan kalde tx funktionen når der er behov for den.
Avatar billede lubker Nybegynder
03. november 2008 - 08:45 #5
Er løsningen at lukke forbindelsen så snart jeg er færdig med den og så oprette den igen, fremfor at lade den stå åben indtil programmet lukkes?
Avatar billede bertelbrander Novice
03. november 2008 - 18:13 #6
Du kan lave port (eller Comport fra initRS232) om til en global variabel, så du kan få adgang til den alle steder fra.

Det er ikke så smart at åbne og lukke porten igen og igen.
Avatar billede lubker Nybegynder
03. november 2008 - 19:21 #7
Nej, det mente jeg nok.
Men alt andet lige har jeg fået det til at køre som jeg ønsker.
I har begge været til hjælp, så hvis i lægger et svar kan i få lidt point.
Avatar billede bertelbrander Novice
03. november 2008 - 20:07 #8
Jeg samler ikke på point.
Avatar billede lubker Nybegynder
03. november 2008 - 21:49 #9
Det er bare i orden.
Du skal i hvert fald have mange tak for hjælpen.
Avatar billede arne_v Ekspert
03. november 2008 - 21:59 #10
Det er vist ikke mange point jeg har fortjent her.
Avatar billede lubker Nybegynder
04. november 2008 - 07:58 #11
Når ikke Bertel vil have dem, så ryger de afsted til dig.
Du har hjulpet så meget andre gange.
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