|
|
View previous topic :: View next topic |
Author |
Message |
Cotino
Joined: 30 Jan 2014 Posts: 2
|
PIC 18f4520 and rs232 |
Posted: Thu Jan 30, 2014 3:59 am |
|
|
Hi, i'm on a project where i need to communicate between a Xbee and a pic 18f4520, so i need to use the rs232.
I plugged the pic to my pc to try if the rs232 works. I can send data, but i can't receive ...
I can write with printf from the pic, but i don't really know how to receive. scanf doesn't exist, gets doesn't work.
I searched for 2 days on google, but i didn't find anything, so i hope you can help me. I just need to receive a string or a character and store it in a buffer.
Code: |
#include <18f4520.h>
#define BUFFER 50
#fuses XT,NOWDT,NOLVP
#use delay(clock=4M)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, stream=PC)
void main()
{
unsigned char i = 0;
char buff[BUFFER];
for(i=0;i<=BUFFER;i++)
buff[i] = 0x00;
gets(buff);
} |
|
|
|
ezflyr
Joined: 25 Oct 2010 Posts: 1019 Location: Tewksbury, MA
|
|
Posted: Thu Jan 30, 2014 7:12 am |
|
|
Hello,
With all due respect, if you've 'searched for 2 days' and not found any help then may I suggest that embedded development is NOT a good hobby or
profession for you?
I did a forum search using the word 'Xbee', and found NINETY THREE threads here on the forum that discuss the Xbee is some way or another.
About half of them had some good/relevant information in them. There is also at least one thread that is being discussed RIGHT NOW in the forum
that is related to Xbee communications!
My point? My point is that help is out there if you make any attempt at all to find it, but if you can't/won't then I suspect you are in for a lot of frustration.
Good Luck!
John |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9245 Location: Greensville,Ontario
|
|
Posted: Thu Jan 30, 2014 7:25 am |
|
|
re :Xbee communications....
There are 2 different methods
1) the default simple,dumb and slow(1 Xbee<->PIC or PC)
2) the better,faster method using API(network,any# of xbees !!)
You need to tell us which mode you're using.I'm using the API mode.
Your program will never work if using API mode as the data stream from Xbee is NOT <CR> delimited.
You should tell us the Xbee module you're using. All Xbees are 3V devices but if attached to a 'board', it might be 5V compatible.Also they are TTL units NOT RS232, so hardware configuration is critical !
hth
jay |
|
|
rikotech8
Joined: 10 Dec 2011 Posts: 376 Location: Sofiq,Bulgariq
|
|
Posted: Thu Jan 30, 2014 7:27 am |
|
|
First think, in every cycle you assign the value of 0x00 to youre buffer.
If you want to receive string trough RS232 the function 'gets(string)' is very apropriate. But, you have to debug the data you have received. for example:
Code: |
//processor config...
#define led pin_a0
#include <string.h>
void main()
{
char test_str[7]="LED_ON";
char string[30];
gets(string);
if(strcmp(str,test_str)) //if both strings(str & test_str) match
output_high(led);
else // if they dont match
output_low(led);
}
|
also see
https://drive.google.com/file/d/0B_EYtdS7J5eKZ1RaeEt4a2hlQnM/edit?usp=sharing
chapter 6.6 _________________ A person who never made a mistake never tried anything new. |
|
|
Cotino
Joined: 30 Jan 2014 Posts: 2
|
|
Posted: Fri Jan 31, 2014 9:06 am |
|
|
Indeed, programming on pic is not a hobby, basically i program in c++, but i don't chose my assignments.
I need a simple communication. At 5pm i send a message to the pic to activate the sensors.
The problem is that i get stuck inside the gets, i run the debugger then send a message, but it never get past the gets.
I tried getc, it works but only detects the first char. |
|
|
ezflyr
Joined: 25 Oct 2010 Posts: 1019 Location: Tewksbury, MA
|
|
Posted: Fri Jan 31, 2014 10:48 am |
|
|
Hi Cotino,
Many CCS programmers, including myself, avoid the 'gets()' function because you can get 'trapped' in the function (as you are finding!) if the
incoming data is not what you expect. At a minimum you must realize that 'gets()' will wait (forever, if necessary) for a 'CR' to be received.
A better way to do things is to read from the UART character-by-character, and then parse and process the data as it arrives. The *best* technique is
to use an 'interrupt driven circular receive buffer' as demonstrated in the example program 'ex_sisr.c'.
Good Luck!
John |
|
|
Humberto
Joined: 08 Sep 2003 Posts: 1215 Location: Buenos Aires, La Reina del Plata
|
|
Posted: Fri Jan 31, 2014 12:45 pm |
|
|
As said hundreds of times, use the "errors" operator whenever making use of hardware UART. This is mandatory when using the
hardware UART, unless your code is able to handle errors. Without this, if a character is received into the UART buffer waiting to be read,
with the next char arived the UART will hung because the buffer has only 2 char deep.
Humberto |
|
|
|
|
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
|