Toon posts:

Probleem I/O in C++

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Ik wil via een nulmodem kabel, via de printerpoort, tussen twee PC's
8 bits oversturen. Ik heb twee programma's geschreven in Visual C++.
De een geeft output, de ander leest de input.

Het probleem is nu dat er alleen maar 5 bits getallen over gestuurd kunnen
worden, dus getallen van 0 - 31. Een groter getal dan 32 levert weer het
getal 0 op etc.

Wie kan mij helpen met dit probleem? Bijgevoegd zijn beide C++ source codes

Alvast bedankt voor reacties,

groet,

Martijn

--------------------Output.cpp

#include <conio.h> //voor de functie: int _outp( unsigned short port, int databyte );
#include <stdio.h> //voor de functie: scanf("%d", &inval);
#include <iostream.h>



// Dit programma leest een getal in van het toetsenbord
// en stuurt het getal als een 8bits binair getal (unsigned short) naar LPT1

int main () {

int inval=0;

while ( inval <256) {

printf("Enter a value in decimal (256 to quit)>");
scanf("%d", &inval);

_outpd(0x378,inval);

}

_outpd(0x378, 0);

return 0;
}

----------------------Input.cpp

#include <conio.h> //voor de functie: int _inp();
#include <stdio.h> //voor de functie: printf();
#include <iostream.h>

// Dit programma leest de LPT1 poort uit
// als een 8 bits getal en drukt het resultaat af

int main (void) {

int inval;
int invalold;
int output2;

while (1) {

invalold = inval;
inval = _inpd(0x378+1);

output2 = (inval | 0x400) >> 3;

if (inval != invalold)
{
printf("Waarde is: %d \n", output2);
}

}

return 0;
}

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 11:02
Ten eerste: code tussen code-tags! (FAQ :Z)

Verder, zou de nulmodemkabel meer dan 5 bits moeten kunnen versturen en is dat het probleem of klopt dit en wil je een methode om alle bytes in stukjes van 5 bits te versturen?

In het laatste geval kun je het makkelijkst alle bytes in twee nibbles opdelen:
code:
1
2
3
  low=byte%15; high=byte>>4;
  ...
  byte=(high<<4)+low;

In dat geval maak je natuurlijk geen gebruik van de vijfde bit en gaat dus 20% van je bandbreedte verloren. Ik neem aan dat je zelf (met enige moeite) wel kan verzinnen hoe je dat op moet lossen. Je zou trouwens ook de vijfde bit als parity bit kunnen gebruiken. Dan heb je een excuus om je bytes in handige helften op te delen. :)

Verwijderd

Topicstarter
Bedankt voor je reactie.

Het probleem is dat ik niet weet hoe ik een hele byte kan versturen van de ene naar de andere PC. Dat komt omdat poort 379 op de eerste 3 bits geen data zet. Dus dan heb ik nog 5 bits over en die kan ik niet verdelen in 2 nibbles.

Heb jij enig idee wat er mis gaat? Of heb je misschien een voorbeeld?

Martijn

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 09-09 21:25

Creepy

Tactical Espionage Splatterer

null-modem kabel.. op de printerpoort?
* Creepy was onder de indruk dat een null-modem kabel altijd serieel was..

als je 8 bits data wilt versturen zul je het toch in twee keer moeten doen. Zoals hierboven ook al is aangegeven.
Je moet die 5 bits niet opdelen in nibbles, je moet je 8 bits data die je wilt versturen opdelen in 2 nibbles en dat nibble voor nibble via die 5 bits verzenden.

(dus eerst de low, en dan de high (of andersom. maakt niet uit eigenlijk als je ze toch zelf weer samenvoegt))

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 11:02
Als je per se 5 bits tegelijk wilt versturen, moet je bijhouden hoeveel je er al gehad hebt enzo. Ik zou dat (niet heel efficient) doen door de bytes op te splitsen in 8 bits en elke keer samen te voegen tot 5 bits.

Het versturen gaat dan ongeveer zo: (let op, code niet getest!)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
unsigned char byte, buf;
int buf_pos, byte_pos;

while(leesByteIn(&byte))
    for(byte_pos=0;byte_pos<8;--byte_pos)
    {
        buf|=((byte>>byte_pos)&1)<<(buf_pos++);
        if(buf_pos==5)
        {
            schrijfVijfBitsWeg(buf);
            buf_pos=0;
        }
    }

Aan jou de taak om de code te construeren die de bits weer bij elkaar voegt en de problemen op te lossen die ontstaan wanneer een laatste byte de buffer niet vol maakt.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 06-09 22:39
Waarom zou je maar vijf bits tegelijk kunnen versturen? Hoeveel datalijnen heeft een LPT poort dan?

Overigens lijkt het me verstandig dat je een andere dan een null-modem kabel neemt, aangezien deze bedoelt is voor een RS232 poort.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1