|
|
View previous topic :: View next topic |
Author |
Message |
erpgc82
Joined: 02 May 2020 Posts: 73
|
RDM6300 replicating reads |
Posted: Sun Jul 04, 2021 2:18 pm |
|
|
Hi friends, can someone help me?
When I believe I've learned everything, complex problems arise. :\
I am using the RFID reader RDM6300, a very low cost and easy to use SERIAL reader, I believed it to be easy...
It Reads and replicates the reading of the same card many times.
I've tried dozens of possibilities and all, no matter how well it works, at some point the code replicates, and even the decimal calculation is incorrect.
Edit.: Most of the time it reads, reads and converts correctly! The code is rarely read replicated, including incorrectly calculating the conversion, but after clearing by the clear_card() function; the next code then reads correctly. my logic, IT MUST NOT BE GOOD.
See the code below:
Code: |
#include <18f46k22.h>
#case // important to use variables with the same name!
#use delay(internal=64Mhz)
#fuses INTRC_IO
#fuses PUT
#fuses BROWNOUT
#fuses NOLVP
#fuses NODEBUG
#fuses NOMCLR
#fuses CCP3E0
#fuses NOXINST
#fuses NOPBADEN
#fuses NOIESO
#fuses NOFCMEN
#use rs232(baud=9600, parity=N, xmit=PIN_D6, rcv=PIN_D7, bits=8, stop=1, ERRORS, stream=READER)
#use rs232(baud=9600, parity=N, xmit=PIN_C6, rcv=PIN_C7, bits=8, stop=1, ERRORS, stream=PC)
#bit tmr0if = 0xff2.2
#use standard_io (a)
#use standard_io (b)
#use standard_io (c)
#use standard_io (d)
#use standard_io (e)
#include "display_8bits18f46k22.c"
#define bkbhit (next_in!=next_out)
#define ckbhit (next_inPC!=next_outPC)
#define BUFFER_SIZE 64
#define BUFFER_SIZEPC 64
////////////////////////// Reader //////////////////////////////////
BYTE next_in = 0;
BYTE next_out = 0;
BYTE buffer [BUFFER_SIZE];
int8 barcode_buffer [10];
int8 rfidcod_buffer [15];
//////////////////////// PC/Software ///////////////////////////////
BYTE next_inPC = 0;
BYTE next_outPC = 0;
BYTE buffer_PC [BUFFER_SIZEPC];
int1 timer_Td = FALSE;
int1 rfid8_16 = FALSE;
int1 barcode = FALSE;
int1 card_reader = FALSE;
int decRFID8 = 0;
int tcode = 0;
int16 decRFID16 = 0;
void clear_card();
void convertHexDec();
void reader_CODE();
/*********************************************************************/
#INT_RDA
void serial_isr1()
{
int p;
buffer_PC[next_inPC]=fgetc(PC);
p=next_inPC;
next_inPC=(next_inPC+1)%BUFFER_SIZEPC;
if(next_inPC==next_outPC) next_inPC=p;
}
/*********************************************************************/
#INT_RDA2
void serial_isr()
{
int t;
buffer[next_in]=fgetc(READER);
t=next_in;
next_in=(next_in+1)%BUFFER_SIZE;
if(next_in==next_out) next_in=t;
}
/*********************************************************************/
BYTE bgetc()
{
BYTE c;
if(card_reader)
{
while(!bkbhit);
c=buffer[next_out];
next_out=(next_out+1)%BUFFER_SIZE;
}
if((c==0x03)&&(!barcode)) card_reader=FALSE;
if (barcode) return(c);
}
/*********************************************************************/
BYTE cgetc()
{
BYTE d;
while(!ckbhit);
d=buffer_PC[next_outPC];
next_outPC=(next_outPC+1)%BUFFER_SIZEPC;
return(d);
}
/*********************************************************************/
void main()
{
setup_oscillator(OSC_64MHZ|OSC_PLL_OFF);
int8 p;
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_8);
set_timer0(15536);
enable_interrupts(GLOBAL);
enable_interrupts(INT_RDA);
enable_interrupts(INT_RDA2);
// setup_timer_2(T2_DIV_BY_4,255,1);
// setup_ccp3(CCP_PWM|CCP_PULSE_STEERING_A);
display_ini();
while(TRUE)
{
if(timer_Td)
{
if(tmr0if)
{
tmr0if=0;
//set_timer0(11);
set_timer0(15536);
tcode++;
}
}
if((!card_reader )&&(!barcode)&&(tcode==80)) clear_card();
if((bkbhit)&&(!barcode)&&(card_reader))
{
p=bgetc();
if(((p==0x03)||(p==0x02)||(p=='0')||(p=='1')||(p=='2')||(p=='3')||(p=='4')||(p=='5')||(p=='6')||(p=='7')||(p=='8')||(p=='9'))&&((!barcode)&&(card_reader)))
{
rfidcod_buffer[0] = p; // STX // STX 0x02 START
rfidcod_buffer[1] = bgetc(); // 1º 7
rfidcod_buffer[2] = bgetc(); // 2º 1
rfidcod_buffer[3] = bgetc(); // 3º 0 // RS 0x30
rfidcod_buffer[4] = bgetc(); // 4º 0 // RS 0x30
rfidcod_buffer[5] = bgetc(); // 5º 7 // Decimal 122
rfidcod_buffer[6] = bgetc(); // 6º A // Decimal 122
rfidcod_buffer[7] = bgetc(); // 7º 3 // Decimal 14100
rfidcod_buffer[8] = bgetc(); // 8º 7 // Decimal 14100
rfidcod_buffer[9] = bgetc(); // 9º 1 // Decimal 14100
rfidcod_buffer[10] = bgetc(); // 10º 4 // Decimal 14100
rfidcod_buffer[11] = bgetc(); // 11º 2
rfidcod_buffer[12] = bgetc(); // 12º 8
rfidcod_buffer[13] = bgetc(); // ETX // ETX 0x03 STOP
rfidcod_buffer[11]=0; //
convertHexDec();
if(rfid8_16) fprintf(PC,"%03u%05Lu#\n\r",decRFID8,decRFID16);
else fprintf(PC,"%08Lu#\n\r",decRFID16);
reader_CODE();
}
}
}
}
/*********************************************************************/
void convertHexDec()
{
BYTE nibleA, nibleB, nible1, nible2, nible3, nible4;
if ((!card_reader)&&(!barcode))
{
nibleA = rfidcod_buffer[5];
if(nibleA=='A') nibleA=10;
if(nibleA=='B') nibleA=11;
if(nibleA=='C') nibleA=12;
if(nibleA=='D') nibleA=13;
if(nibleA=='E') nibleA=14;
if(nibleA=='F') nibleA=15;
if(nibleA=='0') nibleA=0;
if(nibleA=='1') nibleA=1;
if(nibleA=='2') nibleA=2;
if(nibleA=='3') nibleA=3;
if(nibleA=='4') nibleA=4;
if(nibleA=='5') nibleA=5;
if(nibleA=='6') nibleA=6;
if(nibleA=='7') nibleA=7;
if(nibleA=='8') nibleA=8;
if(nibleA=='9') nibleA=9;
nibleB = rfidcod_buffer[6];
if(nibleB=='A') nibleB=10;
if(nibleB=='B') nibleB=11;
if(nibleB=='C') nibleB=12;
if(nibleB=='D') nibleB=13;
if(nibleB=='E') nibleB=14;
if(nibleB=='F') nibleB=15;
if(nibleB=='0') nibleB=0;
if(nibleB=='1') nibleB=1;
if(nibleB=='2') nibleB=2;
if(nibleB=='3') nibleB=3;
if(nibleB=='4') nibleB=4;
if(nibleB=='5') nibleB=5;
if(nibleB=='6') nibleB=6;
if(nibleB=='7') nibleB=7;
if(nibleB=='8') nibleB=8;
if(nibleB=='9') nibleB=9;
nible1 = rfidcod_buffer[7];
if(nible1=='A') nible1=10;
if(nible1=='B') nible1=11;
if(nible1=='C') nible1=12;
if(nible1=='D') nible1=13;
if(nible1=='E') nible1=14;
if(nible1=='F') nible1=15;
if(nible1=='0') nible1=0;
if(nible1=='1') nible1=1;
if(nible1=='2') nible1=2;
if(nible1=='3') nible1=3;
if(nible1=='4') nible1=4;
if(nible1=='5') nible1=5;
if(nible1=='6') nible1=6;
if(nible1=='7') nible1=7;
if(nible1=='8') nible1=8;
if(nible1=='9') nible1=9;
nible2 = rfidcod_buffer[8];
if(nible2=='A') nible2=10;
if(nible2=='B') nible2=11;
if(nible2=='C') nible2=12;
if(nible2=='D') nible2=13;
if(nible2=='E') nible2=14;
if(nible2=='F') nible2=15;
if(nible2=='0') nible2=0;
if(nible2=='1') nible2=1;
if(nible2=='2') nible2=2;
if(nible2=='3') nible2=3;
if(nible2=='4') nible2=4;
if(nible2=='5') nible2=5;
if(nible2=='6') nible2=6;
if(nible2=='7') nible2=7;
if(nible2=='8') nible2=8;
if(nible2=='9') nible2=9;
nible3 = rfidcod_buffer[9];
if(nible3=='A') nible3=10;
if(nible3=='B') nible3=11;
if(nible3=='C') nible3=12;
if(nible3=='D') nible3=13;
if(nible3=='E') nible3=14;
if(nible3=='F') nible3=15;
if(nible3=='0') nible3=0;
if(nible3=='1') nible3=1;
if(nible3=='2') nible3=2;
if(nible3=='3') nible3=3;
if(nible3=='4') nible3=4;
if(nible3=='5') nible3=5;
if(nible3=='6') nible3=6;
if(nible3=='7') nible3=7;
if(nible3=='8') nible3=8;
if(nible3=='9') nible3=9;
nible4 = rfidcod_buffer[10];
if(nible4=='A') nible4=10;
if(nible4=='B') nible4=11;
if(nible4=='C') nible4=12;
if(nible4=='D') nible4=13;
if(nible4=='E') nible4=14;
if(nible4=='F') nible4=15;
if(nible4=='0') nible4=0;
if(nible4=='1') nible4=1;
if(nible4=='2') nible4=2;
if(nible4=='3') nible4=3;
if(nible4=='4') nible4=4;
if(nible4=='5') nible4=5;
if(nible4=='6') nible4=6;
if(nible4=='7') nible4=7;
if(nible4=='8') nible4=8;
if(nible4=='9') nible4=9;
decRFID16 = /*(int16)*/ ((4096 * nible1) + (256 * nible2) + (16 * nible3) + (1 * nible4));
if (rfid8_16) decRFID8 = ((16 * nibleA) + (1 * nibleB));
}
}
/*********************************************************************/
void reader_CODE()
{
timer_Td=TRUE;
display_pos_xy(9,2);
if(barcode) printf(write_display,"00%c%c%c%c%c%c",barcode_buffer[0],barcode_buffer[1],barcode_buffer[2],barcode_buffer[3],barcode_buffer[4],barcode_buffer[5]);
else
{
if(rfid8_16) printf(write_display,"%03u%05Lu",decRFID8,decRFID16);
else printf(write_display,"%08Lu",decRFID16);
}
}
/*********************************************************************/
void clear_card()
{
if ((!card_reader)&&(!barcode))
{
memset(buffer,0,BUFFER_SIZE+64);
card_reader=TRUE;
}
}
|
_________________ Gradually you will go far with persistence, will and determination!
Last edited by erpgc82 on Sun Jul 04, 2021 9:20 pm; edited 4 times in total |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9225 Location: Greensville,Ontario
|
|
Posted: Sun Jul 04, 2021 3:07 pm |
|
|
I had a quick scan of your code....
serious....
I did NOT see an ISR for the UART assigned to the PC port( RDA) BUT you've enabled the INT_RDA. That will, sooner or later 'get you' ! Either disable the interrupt or actually code an ISR. Course I am getting new glasses tomorrow, so maybe it's really there ??
also...
not serious...
you call the stream for the RFID reader 'READY'. Not a good choice of words, perhaps RFRDR or RFID_RDR ? Something more descriptive of what it's for.READY looks more like a positive response to something, gets old guys like me confused ....
Jay |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sun Jul 04, 2021 4:24 pm |
|
|
Your code doesn't compile. I got 21 errors. Fix that. |
|
|
erpgc82
Joined: 02 May 2020 Posts: 73
|
|
Posted: Sun Jul 04, 2021 4:28 pm |
|
|
Hello temtronic, thanks for your attention!
Edited, see changes
I found it unnecessary to put the interrupt "#INT_RDA" in sending to "PC", as the problem is related only to reading the RFID code.
The same problem that occurs is shown on Display or sent to PC.
Just my logic to prevent the reading from repeating is not being effective after a week of trying and dozens of attempts!
Thanks anyway, I'll keep trying... _________________ Gradually you will go far with persistence, will and determination!
Last edited by erpgc82 on Sun Jul 04, 2021 4:38 pm; edited 1 time in total |
|
|
erpgc82
Joined: 02 May 2020 Posts: 73
|
|
Posted: Sun Jul 04, 2021 4:33 pm |
|
|
PCM programmer wrote: | Your code doesn't compile. I got 21 errors. Fix that. |
Hello PCM Programmer, impossible, here it is working normally, the problem is only in the logic of avoiding the code to replicate.
Isn't it for lack of the #case directive?
I was very careful to post here all the functions and variable declarations necessary for understanding.
I just forgot to comment out "\\" enable_interrupts(INT_RDA);
edited, see the changes _________________ Gradually you will go far with persistence, will and determination! |
|
|
dyeatman
Joined: 06 Sep 2003 Posts: 1933 Location: Norman, OK
|
|
Posted: Sun Jul 04, 2021 5:07 pm |
|
|
Yes, some of it is #case related
Where is the routine: display_8bits18f46k22.c ?
Without complete compilable code how can anyone test your program? _________________ Google and Forum Search are some of your best tools!!!! |
|
|
erpgc82
Joined: 02 May 2020 Posts: 73
|
|
Posted: Sun Jul 04, 2021 5:19 pm |
|
|
dyeatman wrote: | Yes, some of it is #case related
Where is the routine: display_8bits18f46k22.c ?
Without complete compilable code how can anyone test your program? |
Hi dyeatman, as I said before, I posted with the intention of looking at it visually, so I didn't post about PC RDA interrupt.
That's why I didn't put all the functions I'm doing.
I'm still learning, I'm "playing" with readers, LCD, LEDs and I came across this problem, which makes RFID reading with the RDM6300 nothing functional!
See the file code below:
#include "display_8bits18f46k22.c"
Code: |
#define rs PIN_D4
#define en PIN_D5
#define data output_b
void display_cmd(int cmd)
{
data(cmd);
output_high(en);
output_low(en);
}
void display_send_byte(short int level, int data)
{
output_bit(rs,level);
delay_us(100);
display_cmd(data);
}
void display_pos_xy(int x, int y)
{
int address;
if (y!=1)
address=0xc0;
else
address=0x80;
address+= x-1;
display_send_byte(0,address);
}
void write_display(char c)
{
switch(c)
{
case '\f' : display_send_byte(0,1);
delay_us(1600);
break;
case '\n' :
case '\r' : display_pos_xy(1,2);
break;
case '\b' : display_send_byte(0,0x10);
break;
default : display_send_byte(1,c);
}
}
void display_ini()
{
output_low(rs);
delay_ms(16);
display_cmd(0x30);
delay_us(4500);
display_cmd(0x30);
delay_us(110);
display_cmd(0x30);
delay_us(45);
display_cmd(0x38);
display_cmd(0x01);
delay_us(1600);
display_cmd(0x0c);
display_cmd(0x06);
}
|
_________________ Gradually you will go far with persistence, will and determination! |
|
|
dyeatman
Joined: 06 Sep 2003 Posts: 1933 Location: Norman, OK
|
|
Posted: Sun Jul 04, 2021 6:14 pm |
|
|
Havng a complete compilable program allows the group to look at all the code
and alert you to what all we see. In some cases we also have the hardware
and can fully test it. For example the hex/decimal conversion can be
accomplished in a much "cleaner" way and we can show you ways to do that
in addition to the duplication issue. _________________ Google and Forum Search are some of your best tools!!!! |
|
|
erpgc82
Joined: 02 May 2020 Posts: 73
|
|
Posted: Sun Jul 04, 2021 6:26 pm |
|
|
dyeatman wrote: | Havng a complete compilable program allows the group to look at all the code
and alert you to what all we see. In some cases we also have the hardware
and can fully test it. For example the hex/decimal conversion can be
accomplished in a much "cleaner" way and we can show you ways to do that
in addition to the duplication issue. |
hi dyeatman, i just found the atoi() function that maybe could take a character and convert it to an integer, but it didn't work. Tried the int() option didn't work either!
I couldn't find a function that would convert 0xFF to 255, so I did it as "manual" as possible... but it worked.
From what I've learned so far, I should wait for a certain character, in this case 0x03 which would be the end of the code read or 0x02 which would be the beginning, and thus make a decision, the decision I made was to stop a 1-bit variable that I allowed another read.
I did this both in the function that handles the interrupt, and inside the while, and without success!
I'll keep trying, thanks! _________________ Gradually you will go far with persistence, will and determination! |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sun Jul 04, 2021 6:40 pm |
|
|
I'm still getting "Functions may not be nested" errors with your program.
If you want help, you need to post a compilable program |
|
|
dyeatman
Joined: 06 Sep 2003 Posts: 1933 Location: Norman, OK
|
|
Posted: Sun Jul 04, 2021 6:54 pm |
|
|
PCM programmer is correct. You are still missing a close parentheses
among a few other things for it to compile and all those need to be fixed.
In regard to your question:
I would wait for the start character (0x2) then loop to receive the
remainder of the characters coming from the reader with a routine similar
to the following (using x as the loop counter):
p=bgetc();
if (p >= '0' && p <= '9')
rfidcod_buffer[x] = (p - 48);
else
if (p >= 'A' && p <= 'F')
rfidcod_buffer[x] = (p - 55);
else
rfidcod_buffer[x] = p;
This approach would clean up your code considerably. And there are a few
more ways to do this. _________________ Google and Forum Search are some of your best tools!!!! |
|
|
erpgc82
Joined: 02 May 2020 Posts: 73
|
|
Posted: Sun Jul 04, 2021 9:19 pm |
|
|
dyeatman wrote: | PCM programmer is correct. You are still missing a close parentheses
among a few other things for it to compile and all those need to be fixed.
In regard to your question:
I would wait for the start character (0x2) then loop to receive the
remainder of the characters coming from the reader with a routine similar
to the following (using x as the loop counter):
p=bgetc();
if (p >= '0' && p <= '9')
rfidcod_buffer[x] = (p - 48);
else
if (p >= 'A' && p <= 'F')
rfidcod_buffer[x] = (p - 55);
else
rfidcod_buffer[x] = p;
This approach would clean up your code considerably. And there are a few
more ways to do this. |
hi dyeatman, i edited it again!
Now the code, small/clean, compiles this far for me!
There is enough to display on the display or send to PC.
Thanks for your tip, I'll try here a way to start reading, count the amount of characters and clean up. _________________ Gradually you will go far with persistence, will and determination! |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19504
|
|
Posted: Mon Jul 05, 2021 12:50 am |
|
|
Several little comments.
First use comments. You have some, but not enough to actually explain
what you are really doing. Comments are useful _to you_ when you come
back to code that you wrote ages ago. They then allow you to remember
what you were up to. Seriously, if I was marking this, you would get an
instant fail, for the lack of adequate comments....
Now there are some little faults. For example:
Code: |
setup_oscillator(OSC_64MHZ|OSC_PLL_OFF);
|
The OSC_PLL_OFF here actually does nothing. A good thing really, since
64MHz, _requires_ the PLL to be on. Get rid of this.
The 'glaring' thing though is this:
Code: |
p=bgetc();
if(((p==0x03)||(p==0x02)||(p=='0')||(p=='1')||(p=='2')||(p=='3')||(p=='4')||(p=='5')||(p=='6')||(p=='7')||(p=='8')||(p=='9'))&&((!barcode)&&(card_reader)))
{
|
The start of the packet from the chip is marked with 02. None of the
other characters are wanted. If the system has got out of sync, having
all these other characters accepted, will result in garbage being read.
Code: |
p=bgetc();
if((p==0x2))&&((!barcode)&&(card_reader)))
{
|
Is the correct code to identify the start of the packet.
As has already been pointed out your hex conversion code is appalling:
Code: |
int8 hexval(int8 chr)
{
if (chr>='0' && chr<='9')
return chr-'0'; //value is digit minus 48
if (chr>='A' && chr<='F')
return chr-('A'+10); //value here is digit minus 55
return 0;//invalid character
}
void convertHexDec(void)
{
unsigned int16 result=0;
unsigned int8 result8=0;
int digit;
if ((!card_reader)&&(!barcode))
{
for (digit=5;digit<7;digit++) //first two nibbles
{
result8*=16;
result8+=hexval(rfidcod_buffer[digit]);
}
for (digit=7;digit<11;digit++) //now the next four nibbles
{
result16*=16;
result16+=hexval(rfidcod_buffer[digit]);
}
//for each digit, convert the hex ASCII character to a numeric
//value, add to the result. Repeat for each digit, multiplying
//the total by 16 as we go.
decRFID16 = result16;
if (rfid8_16)
decRFID8 = result8;
}
}
|
Typed this untested, so I may well have an error, but the point is you
don't have to repeat code six times, instead use a subroutine. Also the
actual conversion from Hex ASCII to decimal is just a matter of a simple
subtraction, depending on whether the value is 0 to 9, or A to F.
Now as a long term 'comment', consider not using the % in the buffer
handling routines, or if you do add a remark to your definitions:
Code: |
#define BUFFER_SIZE 64
#define BUFFER_SIZEPC 64 //Beware these sizes _must_ be binary
//values 2,4,8,16 etc..
|
The % operator, the compiler is 'smart', and replaces with &(val-1), to
avoid a warning that you are using a division in the subroutine. However
it can't do this for non binary values.
The alternative code (avoiding this limitation) is:
Code: |
/*********************************************************************/
#INT_RDA
void serial_isr1()
{
int p;
buffer_PC[next_inPC]=fgetc(PC);
p=next_inPC;
if (++next_inPC)==BUFFER_SIZEPC)
nextinPC=0;
if(next_inPC==next_outPC) next_inPC=p;
}
|
This merrily copes with both binary and non binary buffer sizes. |
|
|
erpgc82
Joined: 02 May 2020 Posts: 73
|
|
Posted: Tue Jul 06, 2021 9:02 pm |
|
|
Ttelmah wrote: | Several little comments.
First use comments. You have some, but not enough to actually explain
what you are really doing. Comments are useful _to you_ when you come
back to code that you wrote ages ago. They then allow you to remember
what you were up to. Seriously, if I was marking this, you would get an
instant fail, for the lack of adequate comments....
Now there are some little faults. For example:
Code: |
setup_oscillator(OSC_64MHZ|OSC_PLL_OFF);
|
The OSC_PLL_OFF here actually does nothing. A good thing really, since
64MHz, _requires_ the PLL to be on. Get rid of this.
The 'glaring' thing though is this:
Code: |
p=bgetc();
if(((p==0x03)||(p==0x02)||(p=='0')||(p=='1')||(p=='2')||(p=='3')||(p=='4')||(p=='5')||(p=='6')||(p=='7')||(p=='8')||(p=='9'))&&((!barcode)&&(card_reader)))
{
|
The start of the packet from the chip is marked with 02. None of the
other characters are wanted. If the system has got out of sync, having
all these other characters accepted, will result in garbage being read.
Code: |
p=bgetc();
if((p==0x2))&&((!barcode)&&(card_reader)))
{
|
Is the correct code to identify the start of the packet.
As has already been pointed out your hex conversion code is appalling:
Code: |
int8 hexval(int8 chr)
{
if (chr>='0' && chr<='9')
return chr-'0'; //value is digit minus 48
if (chr>='A' && chr<='F')
return chr-('A'+10); //value here is digit minus 55
return 0;//invalid character
}
void convertHexDec(void)
{
unsigned int16 result=0;
unsigned int8 result8=0;
int digit;
if ((!card_reader)&&(!barcode))
{
for (digit=5;digit<7;digit++) //first two nibbles
{
result8*=16;
result8+=hexval(rfidcod_buffer[digit]);
}
for (digit=7;digit<11;digit++) //now the next four nibbles
{
result16*=16;
result16+=hexval(rfidcod_buffer[digit]);
}
//for each digit, convert the hex ASCII character to a numeric
//value, add to the result. Repeat for each digit, multiplying
//the total by 16 as we go.
decRFID16 = result16;
if (rfid8_16)
decRFID8 = result8;
}
}
|
Typed this untested, so I may well have an error, but the point is you
don't have to repeat code six times, instead use a subroutine. Also the
actual conversion from Hex ASCII to decimal is just a matter of a simple
subtraction, depending on whether the value is 0 to 9, or A to F.
Now as a long term 'comment', consider not using the % in the buffer
handling routines, or if you do add a remark to your definitions:
Code: |
#define BUFFER_SIZE 64
#define BUFFER_SIZEPC 64 //Beware these sizes _must_ be binary
//values 2,4,8,16 etc..
|
The % operator, the compiler is 'smart', and replaces with &(val-1), to
avoid a warning that you are using a division in the subroutine. However
it can't do this for non binary values.
The alternative code (avoiding this limitation) is:
Code: |
/*********************************************************************/
#INT_RDA
void serial_isr1()
{
int p;
buffer_PC[next_inPC]=fgetc(PC);
p=next_inPC;
if (++next_inPC)==BUFFER_SIZEPC)
nextinPC=0;
if(next_inPC==next_outPC) next_inPC=p;
}
|
This merrily copes with both binary and non binary buffer sizes. |
Hi Ttelmah, I accept your criticisms, they are constructive, thank you!
I started studying C programming with CCS in May 2020, my first contact with programming.
With simple programming, several "things" have already worked out and I was very happy. I don't know commercially, but testing here worked correctly. I still have a lot to learn.
That code of yours for Hexadecimal Decimal conversion didn't work. Can the CCS assess which character is smaller or larger than the other? I figured it was just whole numbers.
In my simple way, I have a great result. After the interrupt, inside the bgetc() function I do 2 checks.
Code: |
BYTE bgetc()
{
BYTE c;
if(card_reader)
{
while(!bkbhit);
c=buffer[next_out];
next_out=(next_out+1)%BUFFER_SIZE;
}
if((c==0x02)&&(!barcode)) countRFID++;
if((c==0x03)&&(!barcode)) card_reader=FALSE;
return(c);
}
|
This is the code provided by the RDM6300 reader (0x02)0900408F8147(0x03)
So I ordered a count variable to be incremented, every time I have the value 0x02, and I ordered the reader to be disabled if I have the value 0x03.
After that I call the Hexadecimal to Decimal conversion function, when I get to the function I check if countRFID is >=2 if it is, I delete "clean" everything related to reading the card, example x=0.
Finally, before sending it to the display or to the PC, I check if the 16-bit variable resulting from the conversion is != of 0. In other words, as the first time it reads correctly it is different from 0, the normal operation will be done, if it repeats the reading, and it is 0, it will not send anything to the Display or to the PC. _________________ Gradually you will go far with persistence, will and determination! |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19504
|
|
Posted: Wed Jul 07, 2021 12:43 am |
|
|
OK. Typed the code in. Two mistakes. I'd left out the 16 on a variable name,
and added 10 not subtracted it:
Code: |
int8 hexval(int8 chr)
{
if (chr>='0' && chr<='9')
return chr-'0'; //value is digit minus 48
if (chr>='A' && chr<='F')
return chr-('A'-10); //value here is digit minus 55
return 0;//invalid character
}
void convertHexDec(void)
{
unsigned int16 result16=0;
unsigned int8 result8=0;
int digit;
if ((!card_reader)&&(!barcode))
{
for (digit=5;digit<7;digit++) //first two nibbles
{
result8*=16;
result8+=hexval(rfidcod_buffer[digit]);
}
for (digit=7;digit<11;digit++) //now the next four nibbles
{
result16*=16;
result16+=hexval(rfidcod_buffer[digit]);
}
//for each digit, convert the hex ASCII character to a numeric
//value, add to the result. Repeat for each digit, multiplying
//the total by 16 as we go.
decRFID16 = result16;
if (rfid8_16)
decRFID8 = result8;
}
}
|
This is tested and works.
Sounds as if you move forwards. |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|