Sida 1 av 2
Python Serial. Rs232 kommunikation Rfid iso18000 6B
Postat: 26 augusti 2015, 23:24:36
av jeja2000
Kanske dum fråga egentligen, men totalt stopp i hjärnan.
Om man har dokumenterat Host Packet:
Head 0xA0
Len 0x04
Address är tomt men enligt annat ställe 0xFF
Command 0x89
Repeat 0xFF
Check ?
Jag antar att dessa fälten motsvarar en byte, 8 bitar. Så långt inget konstigt.
Checksum verkar i C räknas ut genom att addera alla och köra en NOT +1
Skickar man alla bitarna i en sträng, eller var för sig.
Tacksam för en knuff i rätt riktning så löser det sej säkert.
Re: Python Serial. Rs232 kommunikation Rfid iso18000 6B
Postat: 27 augusti 2015, 00:10:31
av sodjan
Det bör vara minst ett frågetecken någonstans, ifall det är något du frågar.
> Jag antar att dessa fälten motsvarar en byte, 8 bitar. Så långt inget konstigt.
Ja, med de värdena som är angiva i hex så blir det ju bytes.
> Checksum verkar i C räknas ut genom att addera alla och köra en NOT +1
Det finns massor av metoder att räkna ut checksumma. Antingen behöver
du verifiera från någon dokumentation hur det görs just här, eller genom
att du har en känt korrekt transaktion där du kan testa din teori
kring checksumma och se om det stämmer.
> Skickar man alla bitarna i en sträng, eller var för sig.
Tja, det är ju en filosofisk fråga. På själva serielinan så kommer de
alltid att komma "var för sig". Hur du sedan löser det i din kod spelar
ju mindre roll. Gör det som är praktiskt och rätt utifrån vad koden
gör för övrigt, vilken miljl det körs i o.s.v.
> Tacksam för en knuff i rätt riktning så löser det sej säkert.
Börja med att ställa någon fråga, så får vi se...
Det står "Python" i rubriken, vad har det med detta att göra?
Re: Python Serial. Rs232 kommunikation Rfid iso18000 6B
Postat: 27 augusti 2015, 01:34:31
av jeja2000
Ja värdena är ju i hex.
Själva implementationen kommer ske i Python troligtvis.
Angående Checksum så beskrivs det i dokumentationen såhär:
Kod: Markera allt
unsigned char Checksum(unsigned char *uBuff, unsigned char *uBuffLen)
{
unsigned char i, uSum = 1;
for(i=0;i<uBuffLen;i++){
uSum = uSum + uBuff[i];
}
uSum = (~uSum) +1;
return uSum;
}
Då bör man väl skicka alla hexvärden i en lista/array till denna funktionen.
Vilken summerar värdena och sen kör en not + en på summan?
Re: Python Serial. Rs232 kommunikation Rfid iso18000 6B
Postat: 27 augusti 2015, 08:44:21
av sodjan
Dokumentation för vadå? Länk?
Är det något speciellt du ska implementera?
Men om du vill ha en checksumma enligt den C koden
så är det ju bara att skriva om det i Python. Men du kan
ju inte från oss om det är *rätt* checksumma, vi har ju
inte en susning om vad du håller på med.
Re: Python Serial. Rs232 kommunikation Rfid iso18000 6B
Postat: 27 augusti 2015, 09:20:36
av jeja2000
Ni kan få en länk till dokumentationen jag fått.
http://www.boxedsolutions.se/rfid-userguide.pdf
Min tanke är att implementera Rfid läsaren så att jag senare kan läsa Rfid taggar med Raspberry pi. Men nu under test och utveckling får det bli utveckling på min Ubuntu dator.
Re: Python Serial. Rs232 kommunikation Rfid iso18000 6B
Postat: 27 augusti 2015, 10:40:50
av sodjan
OK.
Den länken hade kunnat varit med från början.

Det sätter ju det hela i sitt rätta sammanhang.
Men då är det väl bara att köra enligt specifikationen.
Inte världens bästa datablad, men det bör fungera...

Re: Python Serial. Rs232 kommunikation Rfid iso18000 6B
Postat: 27 augusti 2015, 11:25:26
av jeja2000
Sorry, missade det.
Men om jag har fattat dokumentationen rätt. Så
Sätter man Head först sen längden, addressen, command, Data sist checksum
0xA0 0x04 0xFF 0x89 0xFF 0x2F
Det jag inte fattar med python är hur man räknar med char( en byte)
Nån som är python kunnig som vet om man manuellt behöver dra av 255 om värdet går över? I C har jag för mej att adderar man 1 till 255 om det är en char så blir det 1. Men Python verkar lägga ihop allt.
Re: Python Serial. Rs232 kommunikation Rfid iso18000 6B
Postat: 27 augusti 2015, 12:50:21
av sodjan
Det är väl bara att summera på och göra en "reminder" (% operatorn).
Kod: Markera allt
>>> a = 123 + 212 + 23 + 34 + 34 + 56 + 44 + 56
>>> print a
582
>>> b = a % 256
>>> print b
70
>>> c = 2 * 256 + 70
>>> print c
582
>>>
Så 70 är din checksumma före den sista operationen.
Re: Python Serial. Rs232 kommunikation Rfid iso18000 6B
Postat: 27 augusti 2015, 12:56:34
av Icecap
<språkpolis>
Remainder (betyder "Rest"/"Kvarvarande")
Inte Remeinder (betyder "komma ihåg"/"Påminna")
Men OK, det är ju ett bokstav det skiljer på...
</språkpolis>
Messerschmitt
Re: Python Serial. Rs232 kommunikation Rfid iso18000 6B
Postat: 27 augusti 2015, 13:10:59
av Jan Almqvist
<divisionsfritt alternativ>
bitvis and med 255.
</divisionsfritt alternativ>
Re: Python Serial. Rs232 kommunikation Rfid iso18000 6B
Postat: 27 augusti 2015, 15:17:35
av Icecap
Rent faktisk är det så att har man en byte som summationsvariabel behöver man inte göra mer, den är bara på 8 bit ändå. Men Python är ju inte så så det är klart att man måste AND'a med 255. Men i "vanliga" µC kan man oftast räkna med att en unsigned char är på 8 bit, det är dock något man måste kolla för att vara säker på!
Re: Python Serial. Rs232 kommunikation Rfid iso18000 6B
Postat: 27 augusti 2015, 18:30:55
av jeja2000
En fråga på Sodians Exempel bara för att mitt huvud ska hänga med.
Är beräkningen för hexadecimalt?
7B D4 17 22 22 38 2C 38
Så är jag helt med på 70 sen kommer väl om jag inte missförstått ~ operatorn alldeles för mycket.
checksum = (~70) +1
Borde inte NOT vända 1 och 0 binärt?
Så checksum = 185 + 1
alltså 186 decimalt. BA hexadecimalt?
Men i Python får jag ett negativt värde med ~operatorn. -71 Vilket såklart inte är en unsigned char.
Re: Python Serial. Rs232 kommunikation Rfid iso18000 6B
Postat: 27 augusti 2015, 18:39:10
av Jan Almqvist
<fulhack>
kolla om checksum är mindre än 0, i så fall lägg till 256.
-71 + 256 = 185
</fulhack>
Re: Python Serial. Rs232 kommunikation Rfid iso18000 6B
Postat: 27 augusti 2015, 19:07:39
av sodjan
> Är beräkningen för hexadecimalt?
Helt ointressant för mitt exempel. Beräkning som beräkning...
Det finns flera metoder att invertera bitarna, t.ex.:
Kod: Markera allt
>>> a = 70
>>> b = a ^ 255
>>> print bin(a), bin(b)
0b01000110
0b10111001
>>>
>>> a = 70
>>> b = 255 - a
>>> print bin(a), bin(b)
0b01000110
0b10111001
Så:
Kod: Markera allt
>>> a = 123 + 212 + 23 + 34 + 34 + 56 + 44 + 56
>>> checksum = ((a % 256) ^ 255) + 1
>>> print checksum, bin(a % 256), bin((a % 256) ^ 255), bin(checksum)
186 0b01000110 0b010111001 0b10111010
Re: Python Serial. Rs232 kommunikation Rfid iso18000 6B
Postat: 27 augusti 2015, 19:32:52
av jeja2000
Jo att det är ointressant för beräkningen är jag med på. Men det var mest för att se om jag tänkte rätt med min hexadecimala översättning av de decimala talen. Var kanske lite otydlig.
Jag får tacka för hjälpen hittills.
Nu räknar checksum rätt iallafall enligt demo programmet. Nästa steg är att få nån respons från enheten.