|
|
View previous topic :: View next topic |
Author |
Message |
John_Lintern
Joined: 30 Sep 2004 Posts: 14
|
How to convert a char to an int ? |
Posted: Thu May 05, 2005 6:00 am |
|
|
I am receiving ASCII characters from the RS232 receive port.
An interrupt occurs to store the received string.
However, to calculate the checksum I need the received ASCII characters to be converted to an int.
The two lines of code....
Code: | EvenChkSum=RxBuffer[r]^EvenChkSum; |
and
Code: | OddChkSum=RxBuffer[r]^OddChkSum; |
keep producing the value 0x00.
Presumably this is because the array RxBuffer[] is declared as a char.
So How can I convert the char to an int ?
My program so far looks like this.....
Code: |
#include <16C74.h>
#device adc=8
#use delay(clock=20000000)
#fuses NOWDT,HS, PUT, NOPROTECT
#use rs232(baud=115200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8, BRGH1OK)
#define Odd 0
#define Even 1
int i;
int Get_Version[16]={0x1E,0x00,0x0C,0xD1,0x00,0x07,0x00,0x01,0x00,0x03,0x00,0x01,0x60,0x00,0x72,0xD5};
int r=0;
char RxBuffer[56];
int OddChkSum=0;
int EvenChkSum=0;
int1 ChkSumByte=Even;
#int_RDA
RDA_isr()
{
RxBuffer[r++]=getchar();
if (ChkSumByte==Even)
{
EvenChkSum=RxBuffer[r]^EvenChkSum;
ChkSumByte=Odd;
}
else
{
OddChkSum=RxBuffer[r]^OddChkSum;
ChkSumByte=Even;
}
}
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_counters(RTCC_INTERNAL,RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
enable_interrupts(INT_RDA); // enable RS232 receive data interrupt
enable_interrupts(GLOBAL); // enable all global interrupts
for (i=0;i<=56;i++)
{
RxBuffer[i]=0;
}
// initialise phones UART by sending 0x55 (ASCII 'U') 128 times
for (i=0;i<128;i++)
{
putc(0x55);
}
delay_ms(10);
for (i=0;i<=15;i++)
{
putc(Get_Version[i]);
}
do
{
}
while(TRUE);
}
|
|
|
|
rwyoung
Joined: 12 Nov 2003 Posts: 563 Location: Lawrence, KS USA
|
|
Posted: Thu May 05, 2005 7:23 am |
|
|
Code: | EvenChkSum=RxBuffer[r]^EvenChkSum; |
becomes
Code: | EvenChkSum=(int)RxBuffer[r]^EvenChkSum; |
But in your case, "int" is still 8-bits, same as "char".
Look at the LST file created by your compiler and check for problems there. If necessary you can use an intermediate variable to hold the buffer value if the pointer dereferncing is causing a problem.
By the way, I don't see where you are preventing your index variable "r" from running past the end of your RxBuffer array. You should have some kind of limit test or use a power-of-2 length array and do some modulus arithmetic to get "r" to roll around. _________________ Rob Young
The Screw-Up Fairy may just visit you but he has crashed on my couch for the last month! |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Sun May 08, 2005 8:48 am |
|
|
Code: | #int_RDA
RDA_isr()
{
RxBuffer[r++]=getchar();
if (ChkSumByte==Even)
{
EvenChkSum=RxBuffer[r]^EvenChkSum;
ChkSumByte=Odd;
}
else
{
OddChkSum=RxBuffer[r]^OddChkSum;
ChkSumByte=Even;
}
} | The 'r++' is causing your problems. A few lines later in the code your are refering to RxBuffer[r] which now points to an undefined value, by chance this was always zero in your tests.
Another bug: Code: | for (i=0;i<=56;i++)
{
RxBuffer[i]=0;
}
| You are clearing 57 bytes in a 56 byte RAM buffer...... Unpredicatble results will haunt you ! |
|
|
|
|
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
|