/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
COM1 eller 2 interface
Fra : Ukendt


Dato : 23-02-05 22:22

Hej

Jeg har lavet et C program (Borland C 3.1) til at interface mellem en PLC og
en Controller. Det hele pga. 4800 Baud og 9600 Baud så det skal lave lidt
hastighedskonvertering.
Programmet fungerer 100% perfekt ind til jeg skiftede PC'en (en 386) ud med
en moderne P4. Nu pisker programmet bare derudaf uden at vente. Jeg gætter
at hardwaren er inkompatibel med Borlands gamle DOS interrupt kald. Jeg
bruger "bioscom" kommandoen hvor jeg kan se at det er den der driller.
Findes der en nemt hurtig løsning til nyrere programmering?

Eller hvilken compiler kan jeg bruge hvor den kan kommunikere med de 2 com
porte uden at jeg skal lave alt for meget om?

Jeg smider lige sourcekoden med:

#include <bios.h>
#include <conio.h>
#include <stdio.h>
#include <time.h>

#define COM1 0
#define COM2 1
#define DATA_READY 0x100
#define TRUE 1
#define FALSE 0

#define SETTINGS1 ( 0xE0 | 0x03 | 0x00 | 0x00) // COM1 9600,8,n,1
#define SETTINGS2 ( 0xC0 | 0x03 | 0x00 | 0x00) // COM2 4800,8,n,1

char buf[30]; // buffer til hele kommandoer
int in1, in2, out1, out2, status1, status2, DONE = FALSE;
int i = 0;
int t = 0;


void prompt(void) // Venter p? at Servo melder tilbage med -->
{
do
{
status1 = bioscom(3, 0, COM1);
if (status1 & DATA_READY) // Svar fra SERVO
{
if ((out1 = bioscom(2, 0, COM1) & 0x7F) != 0)
{
textcolor(RED);
putch(out1);
bioscom(1, out1, COM2);
}
}
} while (out1 != '>');
}

void send(void)
{
int a;
bioscom(1, 0x5c, COM1); // '\'
bioscom(1, 0x20, COM1); // ' '
bioscom(1, 0x30, COM1); // '0'
bioscom(1, 0x0d, COM1); // CR
bioscom(1, 0x0a, COM1); // LF
prompt();

bioscom(1, 0x4d, COM1); // 'M'
bioscom(1, 0x4f, COM1); // 'O'
bioscom(1, 0x56, COM1); // 'V'
bioscom(1, 0x45, COM1); // 'E'
for (a=1; a<6; a++)
{
bioscom(1, buf[a], COM1);
}
prompt();

bioscom(1, 0x5c, COM1); // '\'
bioscom(1, 0x20, COM1); // ' '
bioscom(1, 0x32, COM1); // '1'
bioscom(1, 0x0d, COM1); // CR
bioscom(1, 0x0a, COM1); // LF
prompt();

bioscom(1, 0x4d, COM1); // 'M'
bioscom(1, 0x4f, COM1); // 'O'
bioscom(1, 0x56, COM1); // 'V'
bioscom(1, 0x45, COM1); // 'E'
for(a=1; a<6; a++)
{
bioscom(1, buf[a], COM1);
}
prompt();
}


void main(void)
{

clrscr();

bioscom(0, SETTINGS1, COM1);
bioscom(0, SETTINGS2, COM2);

printf("\n... COM1 - COM2 Fylde ...\n");


while (!DONE)
{
status1 = bioscom(3, 0, COM1);
if (status1 & DATA_READY) // Svar fra SERVO
{
if ((out1 = bioscom(2, 0, COM1) & 0x7F) != 0)
{
textcolor(RED);
putch(out1);
bioscom(1, out1, COM2);
}
}

if (kbhit())
{
if ((in1 = getch()) == '\x1B')
DONE = TRUE;
else
bioscom(1, in1, COM1); // sender p? COM1
}


status2 = bioscom(3, 0, COM2);

if (status2 & DATA_READY) // Svar fra PLC
if ((out2 = bioscom(2, 0, COM2) & 0x7F) != 0) // hvis der er data
{
textcolor(GREEN);
buf[i] = out2; // saml data op i buffer

if (out2 == 0x0A) // Slut p? streng
{
if (buf[1] <= '9' && buf[1] >= '0')
{
send(); // SEND MOVE COMMAND til begge
}
else
{
for (t=0; t<=i; t++) // Send hele bufferens indhold
{
putch(buf[t]);
bioscom(1, buf[t], COM1);
}
}
i = -1;
}
i++;
}
}
}



 
 
Bertel Brander (24-02-2005)
Kommentar
Fra : Bertel Brander


Dato : 24-02-05 00:10

Tom wrote:
> Hej
>
> Jeg har lavet et C program (Borland C 3.1) til at interface mellem en PLC og
> en Controller. Det hele pga. 4800 Baud og 9600 Baud så det skal lave lidt
> hastighedskonvertering.
> Programmet fungerer 100% perfekt ind til jeg skiftede PC'en (en 386) ud med
> en moderne P4. Nu pisker programmet bare derudaf uden at vente. Jeg gætter
> at hardwaren er inkompatibel med Borlands gamle DOS interrupt kald. Jeg
> bruger "bioscom" kommandoen hvor jeg kan se at det er den der driller.
> Findes der en nemt hurtig løsning til nyrere programmering?
>
> Eller hvilken compiler kan jeg bruge hvor den kan kommunikere med de 2 com
> porte uden at jeg skal lave alt for meget om?
>
> Jeg smider lige sourcekoden med:

Har jeg svaret på spørgsmålet en gang før?
Der findes ikke nogen nem hurtig måde at løse problemet,
du bliver nødt til at omskrive det til at bruge CreateFile,
ReadFile, WriteFile osv.
I stedet for textcolor bruger du SetConsoleTextAttribute.

Jeg kan godt forsøge at "oversætte" programmet.

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Søg
Reklame
Statistik
Spørgsmål : 177511
Tips : 31968
Nyheder : 719565
Indlæg : 6408590
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste