|
|
View previous topic :: View next topic |
Author |
Message |
Ezequiel Guest
|
Clearing RX buffer and TX Buffer |
Posted: Sun Feb 09, 2003 2:16 pm |
|
|
Hello,
I need to use the Hardware UART (RS232) with no buffer, even on the RX line. The problem is that I have to connect the RX and TX pin to a bidirecional interfase, and everything I send is Echo on the RX Pin, and appears on the buffer. And I cannot connect with the other Terminal as I cannot see what it sends because of this problem.
Does anybody know how to disable both buffers, or how to "clear" the RX and TX buffer. I cannot use another pin for TX and RX as I need to use the Set_Uart_Speed() function.
thank you
Ezequiel
___________________________
This message was ported from CCS's old forum
Original Post ID: 11452 |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
Re: Clearing RX buffer and TX Buffer |
Posted: Sun Feb 09, 2003 3:32 pm |
|
|
:=Hello,
:= I need to use the Hardware UART (RS232) with no buffer, even on the RX line. The problem is that I have to connect the RX and TX pin to a bidirecional interfase, and everything I send is Echo on the RX Pin, and appears on the buffer. And I cannot connect with the other Terminal as I cannot see what it sends because of this problem.
:= Does anybody know how to disable both buffers, or how to "clear" the RX and TX buffer. I cannot use another pin for TX and RX as I need to use the Set_Uart_Speed() function.
:=thank you
-------------------------------------------------
So, your PIC is talking to an RS-232 device that echoes back
everything your PIC sends to it. Also, the device will send
its own data to the PIC, as a reply. You're having trouble
telling the difference between the echoed characters, and
the real data from the RS-232 device.
You don't want to use a software receive fifo in your PIC,
for some reason. So, you have several getc() statements
which receive the data, and then you interpret the data.
The echoed characters are messing up your sequence of getc()
statements, so you're not getting the real data from the
device when you expect it.
Is that a proper statement of your problem ?
Since you know the device will echo your transmitted data,
can't you just put in additional getc() statements to receive,
and then throw away those extra chars ?
___________________________
This message was ported from CCS's old forum
Original Post ID: 11455 |
|
|
Ezequiel Guest
|
Re: Clearing RX buffer and TX Buffer |
Posted: Sun Feb 09, 2003 4:32 pm |
|
|
Hello,
my program works if I don't use a Hardware UART, but I need the Set_uart_speed() function. So isn't any way to "clear" the RX buffer, so before a getc() I clear the buffer and everything is okey. Isn't any bit in a register that do this?
Ezequiel
P.D.: I was thinking of using a Hex Inverter with Tri-State, and a Enable Pin to enable Tx and Rx on PIC.
:=:=Hello,
:=:= I need to use the Hardware UART (RS232) with no buffer, even on the RX line. The problem is that I have to connect the RX and TX pin to a bidirecional interfase, and everything I send is Echo on the RX Pin, and appears on the buffer. And I cannot connect with the other Terminal as I cannot see what it sends because of this problem.
:=:= Does anybody know how to disable both buffers, or how to "clear" the RX and TX buffer. I cannot use another pin for TX and RX as I need to use the Set_Uart_Speed() function.
:=:=thank you
:=-------------------------------------------------
:=
:=So, your PIC is talking to an RS-232 device that echoes back
:=everything your PIC sends to it. Also, the device will send
:=its own data to the PIC, as a reply. You're having trouble
:=telling the difference between the echoed characters, and
:=the real data from the RS-232 device.
:=
:=You don't want to use a software receive fifo in your PIC,
:=for some reason. So, you have several getc() statements
:=which receive the data, and then you interpret the data.
:=The echoed characters are messing up your sequence of getc()
:=statements, so you're not getting the real data from the
:=device when you expect it.
:=
:=Is that a proper statement of your problem ?
:=
:=Since you know the device will echo your transmitted data,
:=can't you just put in additional getc() statements to receive,
:=and then throw away those extra chars ?
:=
:=
:=
:=
:=
___________________________
This message was ported from CCS's old forum
Original Post ID: 11457 |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
Re: Clearing RX buffer and TX Buffer |
Posted: Sun Feb 09, 2003 5:18 pm |
|
|
:=Hello,
:= my program works if I don't use a Hardware UART, but I need the Set_uart_speed() function. So isn't any way to "clear" the RX buffer, so before a getc() I clear the buffer and everything is okey. Isn't any bit in a register that do this?
--------------------------------------------------------------
I tried the SPEN and CREN bits, and they didn't work.
The method that does work, requires reading the RCREG three
times. See the following demo program. I think the
"clear_usart_receiver()" function will do what you want.
Try it.
Code: | #include "c:\program files\picc\devices\16F877.h"
#fuses HS,NOWDT,NOPROTECT,PUT,BROWNOUT, NOLVP
#use Delay(clock=8000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
#byte RCREG = 0x1A
void clear_usart_receiver(void);
//==============================
main()
{
char c;
printf("Press 3 or more keys within 5 seconds.\n\r");
delay_ms(5000);
clear_usart_receiver();
if(kbhit() == 0)
{
printf("The receive buffer was cleared.\n\r");
}
else
{
printf("The receive buffer was not cleared.\n\r");
printf("It contains these chars: \n\r");
while(1)
{
if(kbhit())
{
c = getc();
putc(c);
}
}
}
while(1);
}
//=================================
// Clear the USART receive register and its fifo
// by reading it three times.
void clear_usart_receiver(void)
{
char c;
c = RCREG;
c = RCREG;
c = RCREG;
} |
___________________________
Edited to put the program in a code block so it looks better.
Last edited by PCM programmer on Thu Sep 18, 2008 4:37 pm; edited 1 time in total |
|
|
Ezequiel Guest
|
Re: Clearing RX buffer and TX Buffer |
Posted: Sun Feb 09, 2003 7:08 pm |
|
|
Hello,
Two more things. First, why read it three times and not more or less. Second, why do you use the Error parameter in #use RS232.
I think I'll modify my circuit and use two buffers with Tri State, anyway-
Thanks
Ezequiel
___________________________
This message was ported from CCS's old forum
Original Post ID: 11463 |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
Re: Clearing RX buffer and TX Buffer |
Posted: Sun Feb 09, 2003 7:50 pm |
|
|
:=Hello,
:= Two more things. First, why read it three times and not more or less. Second, why do you use the Error parameter in #use RS232.
---------------------------------------------------------
Look at Figure 10-4 in the 16F877 data sheet. This is a
block diagram of the USART receiver. It consists of the
RSR register, and the RCREG register. The RCREG register
is a "2-deep" fifo. So, you could have 2 chars in the
RCREG fifo, and have another char being shifted into the
RSR register. That's a total of 3 chars. So that's why
you need to read the receiver 3 times to make sure you clear it.
The ERRORS parameter is used to clear any overrun or framing
errors that may occur. It's rare to get such an error, if
your baud rate is correct, and if you read the chars from
the receiver quickly enough. But if you do get an error,
it can lock the receiver, and your program will lock up.
By using the ERRORS parameter, you cause the compiler to
put in code that checks for these conditions and then clears
the error if it occurs. It's a safety measure.
___________________________
This message was ported from CCS's old forum
Original Post ID: 11464 |
|
|
|
|
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
|