|
|
View previous topic :: View next topic |
Author |
Message |
glenjoy
Joined: 18 Oct 2004 Posts: 21
|
C Algorithm Help Needed |
Posted: Mon Aug 08, 2005 12:25 am |
|
|
I have these data, it is formatted as [0x0D][0x0A][message][0x0D][0x0A][message][0x0D][0x0A] and [0x0D][0x0A][message][0x0D][0x0A]
What I need is to get all data and stop once the last 0x0A is received.
I had a solution already but my problem is that I use two algorithms to process each of the said data, one subroutine for [0x0D][0x0A][message][0x0D][0x0A][message][0x0D][0x0A] and another subroutine for [0x0D][0x0A][message][0x0D][0x0A].
Now what I need is to use only one subroutine in processing both said data.
Thanks. |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Mon Aug 08, 2005 2:54 am |
|
|
Use gets() to read the data stream up to and including the CR\LF combination.
Study the literature about 'state machines' to learn about how to effectively process the messages. |
|
|
Humberto
Joined: 08 Sep 2003 Posts: 1215 Location: Buenos Aires, La Reina del Plata
|
|
Posted: Mon Aug 08, 2005 6:16 am |
|
|
Quote: |
I have these data, it is formatted as [0x0D][0x0A][message][0x0D][0x0A][message][0x0D][0x0A] and [0x0D][0x0A][message][0x0D][0x0A]
|
IMO it´s not usual nor well defined this format, it is not a formal protocol,
just a kind of string delimiter.
[0x0D][0x0A][message][0x0D][0x0A]
It will have a pause after the delimiters to flush the buffer.
You must copy the whole buffer before the next [0x0A] if not, it will overwrited.
Anyway this code will do the job, it´s not tested.
Code: |
#define Rx_size 20 // I don´t know the message long
int8 Rx_buffer[Rx_size];
int8 index, mssge;
#int_RDA
void rcver_int_handler()
{
int8 rcved_char;
rcved_char = getc();
if( rcved_char == 0x0A )
{ index = 0; mssge = TRUE; }
if( rcved_char == 0x0D )
{ mssge = FALSE; }
if( mssge )
{ Rx_buffer[index] = rcved_char; index++; }
}
|
Humberto |
|
|
kender
Joined: 09 Aug 2004 Posts: 768 Location: Silicon Valley
|
|
Posted: Mon Aug 08, 2005 3:50 pm |
|
|
Humberto wrote: |
IMO it’s not usual nor well defined this format, it is not a formal protocol,
just a kind of string delimiter.
|
Humberto, don't be so harsh. It is a protocol. A protocol for transferring strings. What would be a usual format? (This is not just rhetoric question.) However, I have to comment that our friend GlenJoy didn’t mention one important thing: the [message] should not contain 0x0A and 0x0D, or it should have an escape sequence for these bytes.
Humberto's algorithm can be made more robust, if you have 2 (or more) receive buffers instead of one. (some times it’s called “ping-pong buffers”) While one is being processed by your main() thread, the other one is filled by your RDA ISR. That way, you will have more time to process the data. Of course the degree of success of such an improvement depends on the duty cycle of your communication stream.
Code: |
int8 index, mssge, newdata;
#int_RDA
void rcver_int_handler()
{
int8 rcved_char;
int8* pTemp; // used for swapping
rcved_char = getc();
// some validation code goes here. e.g. [numbers,characters,0x0A,0x0D only
switch (rcved_char)
{
case (0x0A):
{
index = 0;
mssge = TRUE;
}
case (0x0D):
{
mssge = FALSE;
// swap the old and the new buffers
pTemp = pOldBuff;
pOldbuff = pNewBuff;
pNewBuff = pTemp;
newdata = TRUE;// flag that you have a whole new message
}
default:
if (mssge)
{
pNewBuff[index] = rcved_char;
++index;
}
else
{
// out-of protocol character.
// some whaco had connected the serial cable God only knows where.
// alert the user, or just ignore.
}
}
}
void main()
{
pOldBuff = &Rx_buffer0;
pNewBuff = &Rx_buffer1;
newdata = 0;
mssage = FALSE;
if (newdata)
{
// process data in the OldBuff
newdata = FALSE;
}
}
|
|
|
|
Humberto
Joined: 08 Sep 2003 Posts: 1215 Location: Buenos Aires, La Reina del Plata
|
|
Posted: Tue Aug 09, 2005 12:32 pm |
|
|
Quote: |
Humberto, don't be so harsh.
|
Kender, please keep the conversation civil and respectful.
I feel your comments very agressive, be aware that I will not admit any kind of judment from you nor from anybody. English is not my natural languaje so you would be aware that inadvertidely I can use some words that will sound not so fair-spoken for yours.
Just post your code and keep your unasked opinion regarding another people.
Regarding the point if it is a protocol or not, I posted my thread and I tried to be prudent and started the phrase with IMO (in my opinion) being in advice that such format is an opinable matter.
Quote: |
What would be a usual format?
|
Protocol from Wikipedia:
"It is difficult to generalize about protocols because they vary so greatly in purpose and sophistication.
Most protocols specify one or more of the following behaviors:
- Detection of the underlying physical connection (wired or wireless), or the existence of the other endpoint or node
- Handshaking
- Negotiation of various connection characteristics
- How to start and end a message
- How to format a message
- What to do with corrupted or improperly formatted messages (error correction)
- How to detect unexpected loss of the connection, and what to do next
- Termination of the session or connection"
In computing, a protocol is a convention or standard that controls or enables the connection, communication, and data transfer between two computing endpoints.
In the field of telecommunications, a communications protocol is the set of standard rules for data representation, signalling, authentication, and error detection required to send information over a communications channel."
I´m still consider that the format [message][0x0D][0x0A] it is very primitive to be considered a real protocol, unless it is transmitted in burst of strings with a marked pause at the end.
One of the advantage of using a protocol is that it has enough self contained information that the receiver knows exactly where and when is the beggining of a message, that I can´t determine clearly in the preceding example.
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
|