PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Barcodscanner Protokoll



Daniel2412
18.05.2009, 13:58
Hallo!


Ich habe ein Problem mit einen Barcodescanner (MANHATTAN BARCODE SCANNER KONTAKT PS/2 für 49,95) den ich bei Conrad gekauft habe. Ich möchte diesen Scanner an einen PIC anschließen, verstehe aber das Protokoll des Scanners nicht. Ich habe 4 Versuche mit eine Oszilloskope gemacht und seltsames rausbekommen.

Für eine Dezimal
0
01010001001 00000111111 01010001001

1
00110100001 00000111111 00110100001

2
00111100011 00000111111 00111100011

3
00110010001 00000111111 00110010001

Kann mir jemand weiterhelfen??

Danke

vklaffehn
18.05.2009, 16:34
Moin!
Dem Namen nach würde ich sagen, der emuliert eine PS/2 Tastatur...
http://de.wikipedia.org/wiki/PS/2-Schnittstelle
http://www.computer-engineering.org/ps2protocol/
steht auch im Datenblatt :
http://www2.produktinfo.conrad.com/datenblaetter/950000-974999/967375-an-01-ml-Barcode_Scanner_Kontakt_PS2_de-en.pdf

Mfg Volker

Daniel2412
18.05.2009, 17:01
Sorry aber das hilft mir nicht so richtig weiter. Ich kann mit dem Protokoll nichts anfangen. Es sieht aus als wären es 3Byte allererdings zu 11 Bit. Das erste und das letzte Byte ist für die jeweilige Zahl gleich. Bei allen ist aber das Byte in der Mitte gleich. Solche dinge wie Endzeichen (Enter), Start/Stoppbit usw habe ich schon in den Einstellungen des Scanners rausgenommen.


Vielleicht hast du ja noch eine Idee zum entschlüsseln des Codes

Jaecko
18.05.2009, 17:10
Der Code würde aber (bis auf die 11 Bit) mit PS/2 bzw. dem von AT-Tastaturen zusammenpassen.
Dort werden beim kurzen Drücken einer Taste auch 3 Byte gesendet.
Beim Drücken der Scancode der Taste, beim Loslassen Break-Code sowie nochmal der Scancode der Taste, die losgelassen wurde.

vklaffehn
18.05.2009, 17:21
Moin!
Google sagt folgendes zu ps2 tastatur protokoll:

http://www.marjorie.de/ps2/ps2_protocol.htm
Da steht auch, wieso das 11 Bits sind

und hier steht noch was zum Tastaturprotokoll direkt.
http://www.marjorie.de/ps2/ps2_keyboard.htm

MfG
Volker

Jaecko
18.05.2009, 17:48
Verdammt... ich werd alt.... ich hab selber mal nen Treiber für ne Tastatur geschrieben und da warens tatsächlich auch 11 Bit pro "Byte"... jetzt fällts mir wieder ein...

Daniel2412
18.05.2009, 19:30
Danke für den Link zu Marjorie, aber so richtig klar ist es mir noch nicht.
In Abbildung 3 wird der Scancode für die Taste "Q" (15h) dargestellt. Und da ist mir was unklar. Die 15h kann ich im Scancode lesen aber die 15h ist doch nicht die Taste "Q". "Q" wäre doch 51h. Wenn ich es mal so hin nehme das "Q" die 15h ist, frag ich mich was dann mit den 4 Binärzahlen vor dem A im Alphabet ist. Was haben die dann für ein Zeichen? Und wo beginnen dann die Zahlen?


Irgendwie noch völlig unklar

Daniel2412
18.05.2009, 19:55
Hab jetzt die Scancodes gesehen. Dann kann ich ja weiter machen. Danke für die Mühe

Daniel2412
24.05.2009, 09:38
Ich hab doch noch ein paar Problem.

Ich schaffe es nicht das mehrere Zahlen im Barcode hintereinander ausgelesen werden. Scanne ich einen Barcode mit den Zahlen 12345 werden mir die ersten beiden Zahlen ausgegeben,für die 3 kommt ein schwarzes Feld (also quatsch) und 4,5 werden nicht mehr angezeigt. Cursor steht dann bei Stelle 4.


Hat jemand eine Idee zu meinem Problemen


//################## globale Variablen ##########
unsigned short zahlzaehler=0,k=0;
unsigned char werte[10];
//################## Funktions dekleration ######
unsigned char anzeige(char);
unsigned char lesen();

//################## Funktionen #################
unsigned char lesen()
{
unsigned char i,
scancode1=0,
scancode2=0;

while(PORTA.F4); // Warten auf Startbit
while(!PORTA.F4); // Ende Startbit
scancode1 = 0;
for(i=0; i<8; i++) // 8 Bits einlesen
{
while(PORTA.F4);
scancode1 |= (PORTA.F3);

if ( i<7)
{
scancode1 = (scancode1<<1);
}

while(!PORTA.F4); // gelesen, auf nächstes Bit warten
}

/* if(k==0)
{
scancode1 = 0xa2;
}
if(k==1)
{
scancode1 = 0x68;
}
if(k==2)
{
scancode1 = 0x78;
}
if(k==3)
{
scancode1 = 0x64;
} */
// scancode1 = 0x64;
scancode2 = 0;
scancode2.F0 = scancode1.F7;
scancode2.F1 = scancode1.F6;
scancode2.F2 = scancode1.F5;
scancode2.F3 = scancode1.F4;
scancode2.F4 = scancode1.F3;
scancode2.F5 = scancode1.F2;
scancode2.F6 = scancode1.F1;
scancode2.F7 = scancode1.F0;
return scancode2;
}

void anzeige(char code)
{
char ausgabe=0,i;
switch ( code )
{
case 0x45: ausgabe = 48; break; //0
case 0x16: ausgabe = 49; break; //1
case 0x1e: ausgabe = 50; break; //2
case 0x26: ausgabe = 51; break; //3
case 0x25: ausgabe = 52; break; //4
case 0x2e: ausgabe = 53; break; //5
case 0x36: ausgabe = 54; break; //6
case 0x3d: ausgabe = 55; break; //7
case 0x3e: ausgabe = 56; break; //8
case 0x46: ausgabe = 57; break; //9

case 0x1c: ausgabe = 65; break; //A
case 0x32: ausgabe = 66; break; //B
case 0x21: ausgabe = 67; break; //C
case 0x23: ausgabe = 68; break; //D
case 0x24: ausgabe = 69; break; //E
case 0x2b: ausgabe = 70; break; //F
case 0x34: ausgabe = 71; break; //G
case 0x33: ausgabe = 72; break; //H
case 0x43: ausgabe = 73; break; //I
case 0x3b: ausgabe = 74; break; //J
case 0x42: ausgabe = 75; break; //K
case 0x4b: ausgabe = 76; break; //L
case 0x3a: ausgabe = 77; break; //M
case 0x31: ausgabe = 78; break; //N
case 0x44: ausgabe = 79; break; //O
case 0x4d: ausgabe = 80; break; //P
case 0x15: ausgabe = 81; break; //Q
case 0x2d: ausgabe = 82; break; //R
case 0x1b: ausgabe = 83; break; //S
case 0x2c: ausgabe = 84; break; //T
case 0x3c: ausgabe = 85; break; //U
case 0x2a: ausgabe = 86; break; //V
case 0x1d: ausgabe = 87; break; //W
case 0x22: ausgabe = 88; break; //X
case 0x35: ausgabe = 89; break; //Y
case 0x1a: ausgabe = 90; break; //Z

case 0x49: ausgabe = 46; break; //.

}

//werte[zahlzaehler] = ausgabe;
LCD_Chr(1,(zahlzaehler+1),ausgabe);
zahlzaehler++;

//k++;
}

void main()
{
unsigned short i=0;

TRISA = 0xff; //input
PORTA = 0x00;
TRISB = 0; //output
PORTB = 0;
TRISC = 0;
PORTC = 0; //output

ADCON1 = 0x06; // alle digital

Lcd_Config(&PORTC, 3, 1, 2, 7, 6, 5, 4);
LCD_Cmd(LCD_CLEAR);
//LCD_Cmd(LCD_CURSOR_OFF );

INTCON = 0; // Disable all interrupts
Delay_ms(1000); // Wait for keyboard to finish
LCD_Cmd(LCD_CLEAR);
do {
/*
if (Button(&PORTA, 2, 30, 1) ) // Menueauswahl
{
while((PORTA & 0x04)==0x04);
enter = 1;

menue = rotary(enter);
}
*/

//lesen();


anzeige(lesen());

while(PORTA.F4); // Warten auf Paritybit
// if(PORTA.F3) parity=1; // Parity einlesen
while(!PORTA.F4); // Ende Paritybit
while(PORTA.F4); // Warten auf Stopbit
while(!PORTA.F4); // Ende Stopbit

// wegschmeißen der nächsten 22 bit, 0xf0 und nächsten 11 bit

for (i=0;i++;i<22)
{
while(PORTA.F4); // warten auf bit
while(!PORTA.F4); // Ende bit
}

/* if ((Button(&PORTA, 4, 1000, 1)) && (zahlzaehler > 0))
{
//for ( zahlzaehler=zahlzaehler;zahlzaehler==0;zahlzaehler--)
while(zahlzaehler > 0)
{
zahlzaehler--;
LCD_Chr(1,(zahlzaehler+1),werte[zahlzaehler]);
// Lcd_Out(2, 3, "Hello!");
delay_ms(50);

}
} */

} while (1);
}