|
|
View previous topic :: View next topic |
Author |
Message |
tienchuan
Joined: 25 Aug 2009 Posts: 175
|
Problem when using 2 UART on PIC18F97J60 |
Posted: Mon Mar 19, 2012 10:12 pm |
|
|
Hi everyone !
I have a problem with RDA interrupt when using 2 UART (UART0 and UART2) on Pic 18F97J60.
My request is receive data on UART2 and send it through UART0.
I used Hyper Terminal to send data to Pic18 (UART2), and Pic18 send to PC (UART0) successed.
But when I connect between Pic18 and sensor, Pic18 send only ones string received from sensor and stop. If I reset Pic18, it send only ones string, too.
Please show me error in my problems.
Thanks all
Code: |
char user_str[11]="test,test,";
char gps_str[100]="";
char gps_str_send[80];
char gps_buffer[100]="";
int8 chk_gprs=0;
int8 index= 0;
#int_rda2
void ngat_gps(void)
{
char c1;
c1=fgetc(ID2);
switch(c1)
{
case '$': {
index=0;
}
break;
case 13: check_gprmc();
break;
default: {
gps_buffer[index]=c1;
index++;
}
break;
}
}
//------------------------------------------------------------------------------
void check_gprmc(void)
{
if ((gps_buffer[1]=='G')&&(gps_buffer[2]=='P')&&(gps_buffer[3]=='R')&&(gps_buffer[4]=='M')&&(gps_buffer[5]=='C'))
{
strcpy(gps_str,gps_buffer);
fprintf(ID1,gps_str);
}
else {};
} |
Config UART
Code: |
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7,bits=8,stop=1,parity=n,stream=ID1) //GPRS_PORT
#use rs232(baud=4800, xmit=PIN_G1, rcv=PIN_G2,bits=8,stop=1,parity=n,stream=ID2) //GPS_PORT |
_________________ Begin Begin Begin !!! |
|
|
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Tue Mar 20, 2012 12:30 am |
|
|
The problem is caused by calling fprintf(ID1,), apparently the output to the other UART, from the interrupt service routine. It can be expected to cause at least an overflow of receive UART, blocking further reception.
If not using UART TX-interrupts, which would be the most effective solution, fprintf(ID1,) must be called in the main loop. You can e.g. use a flag (a so-called semaphore) to inform the main loop about new data to transmit.
A basically more flexible solution, not necessarily required in the present case, would receive the data to a circular buffer (using two index variables next_in and next_out) and perform also the processing of received data in the main loop. See EX_SISR.C as circular buffer implementation example. |
|
|
dyeatman
Joined: 06 Sep 2003 Posts: 1934 Location: Norman, OK
|
|
Posted: Tue Mar 20, 2012 3:35 am |
|
|
They also need to add the ERRORS keyword to the RS232 setup lines. _________________ Google and Forum Search are some of your best tools!!!! |
|
|
tienchuan
Joined: 25 Aug 2009 Posts: 175
|
|
Posted: Sat Mar 24, 2012 8:17 pm |
|
|
FvM wrote: | The problem is caused by calling fprintf(ID1,), apparently the output to the other UART, from the interrupt service routine. It can be expected to cause at least an overflow of receive UART, blocking further reception.
If not using UART TX-interrupts, which would be the most effective solution, fprintf(ID1,) must be called in the main loop. You can e.g. use a flag (a so-called semaphore) to inform the main loop about new data to transmit.
A basically more flexible solution, not necessarily required in the present case, would receive the data to a circular buffer (using two index variables next_in and next_out) and perform also the processing of received data in the main loop. See EX_SISR.C as circular buffer implementation example. |
thanks for u answers.
I moved frintf() function go to main and it run well.
Thnks u very much.
Regards. _________________ Begin Begin Begin !!! |
|
|
tienchuan
Joined: 25 Aug 2009 Posts: 175
|
|
Posted: Sat Mar 24, 2012 8:18 pm |
|
|
dyeatman wrote: | They also need to add the ERRORS keyword to the RS232 setup lines.
|
Thank for your answer.
Regards _________________ Begin Begin Begin !!! |
|
|
|
|
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
|