Avtor:
Miha Krejan
Uporabniški vmesnik je napisan s pomočjo okolja TURBO VISION za BORLAND C++ V 3.1. Okenska zasnova in podpora miške omogočata preprosto uporabo. Na voljo je izbira datoteke za izris, nastavljanje serijske komunikacije in snemanje nastavitev. Uporabnik je o dogajanju v programu obveščen preko sporočil o napakah.
Izgled TURBO VISION okolja
Izbira datoteke za izris
Nastavitev serijske komunikacije
HPGL ukazi se prenesejo iz datoteke na PC računalniku preko serijskega RS232 vmesnika na krmilnik risalnika. ASCII znaki se zapisujejo v vmesni pomnilnik v krmilniku. Risalnik je precej počasen, zato se vmesni pominlnik hitro napolni in zadnji znak je zavržen. Potrebno ga je ponovno poslati. Krmilnik po vsakem poslanem znaku pošlje nazaj kontrolni znak, ki pove ali je bil znak sprejet ali zavržen. Če program določen čas ne sprejme nobenega znaka, se javi napaka, da ne pride do zamrznitve programa ob izpadu komunikacije.3. RS232 KOMUNIKACIJADel programa v jeziku C++, ki pošilja datoteko krmilniku izgleda takole:
void Plot::handleEvent(TEvent& event) {
TDialog::handleEvent(event);
if (!PlotEnd) {
PChar = fgetc(fp); // Beri naslednji zna iz datoteke
if (AsyncOutByte(PChar)) { // Pošlji znak krmilniku
PlotFail = errFail; // Če pošiljanje ni uspešno
// uspešno javi napako
endModal(cmOK);
return;
}
if (AsyncWaitByte()) { // Čakaj na kontrolni znak
PlotFail = errNotRespond; // Če kontrolnega znaka ni
// javi napako
endModal(cmOK);
return;
}
switch (AsyncIn()) { // Preberi kontrolni
// znak
case 0xAA: // Znak je bil zavržen
fseek(fp, -1, SEEK_CUR); // Premakni se za 1 znak
// nazaj po datoteki
break;
case 0xFF: // Znak je bil uspešno
// sprejet
plotDone++; // Napredovanje
pb->update(); // Osveži prikazovalnik
// napredovanja
if (plotDone >= plotSize) { // Ali smo že prenesli
// celo datoteko?
PlotEnd = 1; // Konec prenašanja
endModal(cmOK);
return;
}
break;
default:
PlotFail = errIResponse; // Risalnik se ne odziva
// pravilno
endModal(cmOK);
return;
}
}
}
RS232 komunikacija je izvedena s pomočjo rutin za asinhrono komunikacijo za povezavo s C programskim jezikom. Osnovne funkcije za komunikacijo so:4. RUTINE ZA ASINHRONO KOMUNIKACIJOPrimer pošiljanja niza znakov na COM1 port (9600, 8-bitna beseda, 1 stop bit, brez paritete)
- int AsyncInit(int Port)
Zažene servisno prekinitveno rutino. Preden se vrnemo iz glavnega programa je obvezno treba poklicati funkcijo AsyncStop(). Funkcija vrne nič, če je inicializacija uspešna. Parameter 'Port' je COM port preko katerega želimo komunicirati. V datoteki 'ASYNC.H' so definirane konstante:COM1
COM2
COM3
COM4
- void AsyncStop(void)
Ustaviti servisno prekinitvene rutino.
- void AsyncClear(void)
Počisti notranji buffer.
- void AsyncOut(int c)
Pošlje znak preko COM port-a.
- int AsyncIn(void)
Vrne znak, ki je v notranjem buffer-ju ali pa NULL, če je buffer prazen.
- void AsyncHand(int handshake)
Postavi status kontrolnih linij. Konstante so definirane v 'ASYNC.H' in jih je mogoče kombinirati z | (ali) operatorjem.
Tipična nastavitev je:AsyncHand(DTR | RTS);
- void AsyncSet(int Baud, int Control)
Nastavitev hitrosti prenosa, parnosti, paritete in dolžine besede. Parameter 'Baud' je hitrost prenosa (..., 1200, 2400, 9600, ...). 'Control' pa je število, ki predstavlja parnost, pariteto in dolžino besede. Vse konstante so definirane v 'ASYNC.H'. Primer nastavitve:AsyncHand(9600, BITS8 | STOP_1 | NO_PARITY); /* hitrost 9600, 8-bitna beseda, 1 stop bit, brez paritete */
- int AsyncInStat(void)
Vrne število znakov v vhodnem buffer-ju.
- int AsyncOutStat(void)
Vrne število znakov v izhodnem buffer-ju.
- int AsyncStat(void)
Vrne stanje kontrolnih linij. Z uporabo & (in) in | (ali) operatorjev je mogoče izločiti željeno stanje. Konstante so definirane v 'ASYNC.H' in so standardne DCD, RI, in CTS. Vključena je tudi D_DCD (Delta-DCD) za detekcijo spremembe na kontrolnih linijah od zadnjega branja statusa.#include <stdio.h>
#include "async.h"char outstring[] = "Ta niz je bil poslan preko COM1";
void main() {
int i;
if (AsyncInit(COM1) != 0) {
AsyncStop();
printf("Napaka pri inicializaciji COM1\n");
return;
}
AsyncSet(9600, BITS8 | STOP_1 | NO_PARITY);
AsyncHand(DTR|RTS);
for (i = 0; i < strlen(outstring); i++) {/* --------------------------------------- */
/* Buffer je dejansko velik 512 znakov, */
/* zato v tem primeru ni nujno potrebno */
/* testitranje ali je v njem vec kot 10 */
/* znakov. Spodnja vrstica je le primer. */
/* --------------------------------------- */while (AsyncInStat() >= 10);
AsyncOut(outstr[i]);
}
AsyncStop()
}
Avtor rutin je David Kessner. Napisane so v zbirnem jeziku za intel 0x86 in so bile prevedene s pomočjo Turbo Assemberja. Zasnovane so na prekinitvah in delujejo v MS-DOS okolju. Testirane so bile tudi pod DOS oknom v okolju Windows 95/98. Potrebno je paziti da se jih v vsakem primeru uporablja samo v enem oknu.5. DODATKIModificirane rutine, ki so bile uporabljene pri tej nalogi:
Originalne rutine:
Izvorna koda programa PLOT.EXE za pošiljanje HPGL datoteke krmilniku:
PLOT.CPPIzvorna koda programa za risalnik v mikrokrmilniku:
PLOTER.ASM
Povezave:
Vse o grfičnih formatih za programerje
Wotsit's Format: The programmer's file formats and data formats resourceShareware in uporabni pripomočki za programerje (tu lahko najdete tudu asynlib2.zip)
Simtel.Net Worldwide Shareware Distribution NetworkBorland - programski jeziki
BORLAND INTERNATIONAL, INC.Motorola mikrokontrolerji (uporabljenega mikrokontrolerja ne boste našli, ker je zastarel)
Motorola-Microcontrollers (MCU)Turbo Vision FAQ
TVPlus: Home Page
Stran je uredil Miha Krejan
23. Marec 1999