Ok I had a quick look at the datasheet for the PIC16F877 and the ADC is 10 bit
I have not checked but I assume this line does the right thing and bring the high and low ADC results together
val= (ADRESH << 8) | ADRESL;
I am not sure why on earth you want this in a float rather than just carry it in a 16 bit integer. You are on a micro-controller stop playing with floats when you don't need they are incredibly slow on a micro avoid them like the plague.
So lets look at things logically
Val is 10 bits and so it goes between 0 and 1023
Next you need to multiply it by 325 so the largest number is 325x1023 = 332475
That result will fit into a long being 32 bits so I suggest you change val to a long.
You can then do the division but you just throw the decimals away anyhow keeping only 3 characters at end I can see so lets rewrite the whole lot. I am sure the division is supposed to be 1024 for 10 bits not 1023 but I will leave that to you.
I also can't for the life of me work out why you want to move the strings thru 2 buffers and your attempt at CR and LF will not work :=)
Try something like
unsigned long Val;
.... <snip> .....
Val = (ADRESH << 8) | ADRESL;
Val *= 325;
Val /= 1023;
ltoa(Val, &uart_rd, 10);
.... <snip> .......