|
|
View previous topic :: View next topic |
Author |
Message |
pingice
Joined: 04 May 2013 Posts: 4
|
Problem with 18f44k22's dual uart |
Posted: Sat May 04, 2013 3:07 am |
|
|
I am now using 18f44k22 with two pairs of UART where the first pair is to connect to xbee and the 2nd pair is for gsm. But i encounter problem when i use the two pairs of uart together. The PIC work well when i use only one pair of it for gsm, the sms received is as expected, the header declaration is:
Code: | #use rs232(UART2,baud=9600, parity=N,bits=8, xmit=PIN_D6, rcv=PIN_D7, errors, stream=GSM)
|
but when i add in the declaration of 2nd pair of uart:(only the header, i haven't even add in the coding for the xbee part)
Code: | #use rs232(UART1,baud=9600, parity=N,bits=8, xmit=PIN_C6, rcv=PIN_C7, errors, stream=XBEE)
#use rs232(UART2,baud=9600, parity=N,bits=8, xmit=PIN_D6, rcv=PIN_D7, errors, stream=GSM) |
I have problem with the sms received, the sms can only be sent out when ON the circuit for twice. and the sms received will be overlapped, meaning that, the content in a single sms is double of the message that should be received.. any idea what cause this to be happened? thanks.
Last edited by pingice on Sat May 04, 2013 9:12 am; edited 1 time in total |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19549
|
|
Posted: Sat May 04, 2013 3:29 am |
|
|
You _are_ hopefully using fgetc, fputc, and kbhit(stream)?.
Once two UART's are declared, you need to be using these throughout. Otherwise how can the compiler know which port to use?.
Best Wishes |
|
|
pingice
Joined: 04 May 2013 Posts: 4
|
|
Posted: Sat May 04, 2013 3:54 am |
|
|
Thanks for the reply..
Yes, i include fgetc, fputc, and kbhit(stream) in my coding. What do you mean by "how can the compiler know which port to use"? I tried the coding that include the xbee part (not only header) too, the same thing happend. Once I used 2nd pairs of the uart, the sms received will be overlapped and only sent out on the 2nd time. what will be the possible causes?
The coding:
Code: | # Include <18f44k22.h>
# Use delay (clock = 1000000)
#fuses NOLVP,NOWDT,NOPROTECT,NOBROWNOUT, NOWRT
#use rs232(UART1,baud=9600, parity=N,bits=8, xmit=PIN_C6, rcv=PIN_C7, force_sw, errors, stream=XBEE)
#use rs232(UART2,baud=9600, parity=N,bits=8, xmit=PIN_D6, rcv=PIN_D7, force_sw, errors, stream=GSM)
#include <stdlib.h>
char a;
int e =1;
int p =0;
int o=0;
void send_num1()
{
fprintf(GSM, "at+cmgs=\"xxxxxxxxxxx\"\r\n");
delay_ms(500);
}
void main ()
{
fprintf(GSM, "ate0\r\n");
delay_ms(2000);
fprintf(GSM, "at+cmgf=1\r\n");
delay_ms(2000);
while (true)
{
if ((INPUT (PIN_A2)==0))
{
if (p==0)
{
send_num1();
fprintf(GSM,"Pole ID:0003\r\nPower Down\r\nLocation: xxxx");
putc(26);
delay_ms(1000);
p=1;//
}
}
{
if (kbhit(XBEE))
{
a = getc(XBEE);
if (a=='A')
{
if (e==0)
{
send_num1();
fprintf(GSM,"Pole ID:0001\n\fPower Down \n\fLocation: xxxx");
putc(26);
e=1;
}
}
}
}
}
}
|
Last edited by pingice on Sat May 04, 2013 9:11 am; edited 1 time in total |
|
|
ezflyr
Joined: 25 Oct 2010 Posts: 1019 Location: Tewksbury, MA
|
|
Posted: Sat May 04, 2013 6:05 am |
|
|
Hi,
There are a number of issues with the code you posted, at least one of which might explain the problem you are reporting.
Here are some suggestions:
1. Move your #use delay statement after your #fuses statement. This is the correct order.
2. Remove the 'force_sw' directive from your #use rs232 statements. Why in the world you added that code between your 1st and 2nd posts is totally beyond me. Why did you do that?
3. Substitute 'fputc' for 'putc' in you code. You stated that you had used streams with all serial functions, but this is not true!
4. Your 'send_num()' routine is weird. You should have a 'Send_SMS()' routine instead that sends the whole message instead of breaking it up like you do now. The only thing that changes in this routine will be the actual text that is being sent. You can pass the text to your subroutine, or you can set a 'MsgID' variable, and use Switch to select the proper message to send, like this:
Code: |
switch (MsgID)
{
Case 0: //Send AC Power Restored Msg!
fprintf(ADH8066, "AC Power Restored ");
break;
|
5. Use the 'Code' buttons when posting your code!
John |
|
|
dyeatman
Joined: 06 Sep 2003 Posts: 1934 Location: Norman, OK
|
|
Posted: Sat May 04, 2013 8:42 am |
|
|
Also, you don't need the UARTx designations and the pin numbers in
the USE_RS232 statement, one or the other but not both.
Code: | #use rs232(UART1,baud=9600, parity=N,bits=8, errors, stream=XBEE)
#use rs232(UART2,baud=9600, parity=N,bits=8, errors, stream=GSM)
|
Should be all you need. _________________ Google and Forum Search are some of your best tools!!!! |
|
|
|
|
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
|