![](templates/subSilver/images/CCSLogo.jpg) |
![CCS C Software and Maintenance Offers](templates/subSilver/images/forumAd6.jpg) |
View previous topic :: View next topic |
Author |
Message |
greg shipley Guest
|
RS232 comm problems. |
Posted: Fri Aug 17, 2007 9:58 am |
|
|
I am using a 16F876 to receive and send data to a AT compatable PC port at 19200Baud 8-N-1.
I am using the KBHIT() to get the char. If another char comes in before the first one is read, it locks up my communication and the PIC is not able to get data until power is cycled.
Is there a way to get around this without using interrupts? Ignoring the extra char would be ok.
Greg |
|
![](templates/subSilver/images/spacer.gif) |
Ttelmah Guest
|
|
Posted: Fri Aug 17, 2007 10:07 am |
|
|
Add 'ERRORS' to your RS232 dclaration. The compiler wll then automatically clear the 'overrun' error which otherwise will hang the UART.
Best Wishes |
|
![](templates/subSilver/images/spacer.gif) |
PIT Guest
|
A problem. |
Posted: Tue Sep 11, 2007 8:14 am |
|
|
I have the same problem.
But when I add the ERRORS on my program, every time the 'overrun' error comes in, it resets my program!
Is this normal?
If it´s not, is there a way to solve this?
I´m using PIC16F877.
Thanks. |
|
![](templates/subSilver/images/spacer.gif) |
Ttelmah Guest
|
|
Posted: Tue Sep 11, 2007 9:24 am |
|
|
No, it is not 'normal'.
Write your program so it works!.....
Seriously, how do you know an overrun error is occuring?.
I'd guess, you are probably actually getting a watchdog timout, because your comms cannot handle losing a character.
The only things that will 'normally' cause a reset, are a stack overflow, watchdog timeout, or external electrical noise.
Best Wishes |
|
![](templates/subSilver/images/spacer.gif) |
PIT Guest
|
|
Posted: Tue Sep 11, 2007 9:44 am |
|
|
But i don´t use watchdog...
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT
#use delay(clock=20000000)
#use rs232 (baud=9600, xmit=pin_c6, rcv=pin_c7, parity=n, bits=8, errors)
.....
This is how I get the data....
I THINK it´s overrun because it makes my serial connection with a TouchScreen stop, when I click twice, and the Touch tries to send me data while I´m sending data to a LCD.
My comm with the Touch is a 13 byte string, that works fine if i wait the pic write on a LCD.
Thanks |
|
![](templates/subSilver/images/spacer.gif) |
Ttelmah Guest
|
|
Posted: Tue Sep 11, 2007 12:36 pm |
|
|
How would your code deal with a missing character?.
Buffer overruns?. Possible memory leak?.
Logic failure, leading to a stack overflow?.
Consider interrupt driven comms.
Best Wishes |
|
![](templates/subSilver/images/spacer.gif) |
PIT Guest
|
|
Posted: Wed Sep 12, 2007 5:25 am |
|
|
Ok... I must be doing something really worng...
Code: |
void trata_serial()
{
for (t=0; t<13; t++)
{
if (kbhit()==1)
{
pal[i]=getc();
i++;
}
if (i>9)
{
t=13;
}
}
}
|
This is how I get the characters... I have only 10 bytes comm on this other Touch.
In my main program, I have something like this:
Code: |
void main(void)
{
variable declarations;
variable sets, for first time the program passes;
for ( ; ; )
{
trata_serial();
many other things on program loop;
}
}
|
So, it makes sense that it's 'overrun' error, because if he sends data to me while I'm on the loop, it will get buffer 'overrun'.
I really don't care about the data that comes in while I'm on the loop.
I thought that if I put errors, it would just clear the buffer and the 'overrun' bit when it gets busy. I even tried not to put errors and manually clear and set the CREN when it get's 'overrun' bit, but every time I do that, it goes back to the 'variable set' part of my program, meaning he broke the loop.
Sorry about not being so clear about the problem, hope you understand!
Thanks |
|
![](templates/subSilver/images/spacer.gif) |
SET
Joined: 15 Nov 2005 Posts: 161 Location: Glasgow, UK
|
|
Posted: Wed Sep 12, 2007 7:19 am |
|
|
Quote: | Code: | {
void trata_serial()
{
for (t=0; t<13; t++)
{
if (kbhit()==1)
{
pal[i]=getc();
i++;
}
if (i>9)
{
t=13;
}
}
} |
|
Where do you initialise i? I think your overwriting memory somewhere..
Also, more normal to write:
Code: | for (t=0; t<13; t++)
{
if (kbhit()==1)
{
pal[i]=getc();
i++;
if (i>9)
break;
}
}
|
|
|
![](templates/subSilver/images/spacer.gif) |
Ttelmah Guest
|
|
Posted: Wed Sep 12, 2007 7:48 am |
|
|
The problem is that I'd suspect you are actually getting a handler error, which then confuses the code. You read ten bytes (why the 13 counter?.), but suppose some characters are still in the input buffer from an earlier transaction that was missed. You then receive some characters from the last packet, and some more from the next one. How is the code ever going to synchronise back to the 'packet'?. What happens in the main, if the block contains data 'out of order' like this?. This is why packet based comms, normally has a definition, with a 'header', and a 'tail' character, and/or a pause between packets, with the handler writen to timout.
Best Wishes |
|
![](templates/subSilver/images/spacer.gif) |
|
|
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
|