I would like to send and receive data between two PIC24F microcontrollers via RS485. Here i'm using SP3485 IC. I've set one microcontroller as
transmitter and another one has receiver. My microcontroller has 4 uart. One of the uart(here i use UART4) is connected with RS485 IC(SP3485) for both. As usual data pins 'A' to 'A' and 'B' to 'B' are connected. Below is the image shows which PIC24F pins are connected with RS485 IC. I'm transmitting data from one pic to another pic via RS485. In receiver side i've connected UART1 with hyperterminal for seeing the received data.The problem is While i print the received data in the hyperterminal it shows junk data. I've checked the UART1 its working fine.
Here i just post only UART4 initialize code.
init_processor()
{
TRISB = 0x46E0;
/******** pps for uart4 **************/
RPINR27bits.U4RXR = 4;
RPOR3bits.RP6R=21; //RP(6)R---> 6th pin of pic(RP6R has RPOR3)
// Init UART4
U4MODE = 0x8000;
U4STA = 0x0000; //Enable Transmission, Clear all flags
U4BRG = 25;
//IFS0bits.U1RXIF = 0; // Clear the Receive Interrupt Flag
//IEC0bits.U1RXIE = 1; // Enable Receive Interrupts
U4MODEbits.UARTEN = 1; // And turn the peripheral on
U4STAbits.UTXEN = 1;
//UART4
void uartsend4( char in_c)
{
while(U4STAbits.UTXBF == 1);
U4TXREG = in_c;
}
void uart4str( char *s)
{
while(*s!='\0')
{
uartsend4(*s);
s++;
}
}
char uartrec4()
{
while(U4STAbits.URXDA == 0);
if (U4STAbits.OERR)
U4STAbits.OERR = 0;
return U4RXREG;
}
}
main.c transmitter:
int main()
{
init_processor();
PORTBbits.RB5=1; //RB5 is RE/DE
while(1)
{
uart4str("Hello\r\n");
Delayms(1000);
}
return 0;
}
main.c receiver:
int main()
[![{
init_processor();
PORTBbits.RB5=0; //RB5 is RE/DE][1]][1]
while(1)
{
uart1str(uartrec4()); //printing received uart4 data in hyperterminal
Delayms(1000);
}
return 0;
}
Best Answer
I guess you have triple-checked the baud rates between the microcontrollers, as well as between receive uart1 and the hyperterminal.
The receive code is not correct:
Problem here is that uartRec4 receives one character. What happens is:
Remove your delayms(1000) from the receiver side. Ensure that you're using the same bandwidth both between pics and also on hyperterminal.
If still not work, try to split into parts:
Note that uart1str(uartrec4()) can also be problematic if the hw uart does not have a buffer (PICs do have a 2 byte receiver buffer, afaik). (The problem is that you're waiting for one byte, then while sending it out to uart1, another byte may arrive which you supposed to check for.)