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++;
}
}
}
|