Capture and compare serial data


Closed Thread
Results 1 to 17 of 17

Hybrid View

  1. #1


    Did you find this post helpful? Yes | No

    Default Apologies for the bad english ...

    In my frustration @ myself and my rush to post I really messed up the english for this line
    I am trying to do a kind of wireless capture and compare but I have a problem on the receiving end that I lookings for some suggestions on.
    What it should read is :
    I am trying to do a kind of wireless capture and compare but I have a problem on the receiving end that I am looking for some suggestions on.

    Looking forward to your replies

    Thanks so much

    Dennis

  2. #2
    Join Date
    Nov 2003
    Location
    Wellton, U.S.A.
    Posts
    5,924


    Did you find this post helpful? Yes | No

    Default

    Hey Dennis,

    An array(s) would be the way to do it. Could compare separate bits or the whole array sorta like doing a checksum. Lots of possibilities.

    This may give you some ideas on how to set it up
    http://www.picbasic.co.uk/forum/showthread.php?t=544
    Dave
    Always wear safety glasses while programming.

  3. #3


    Did you find this post helpful? Yes | No

    Default Thanks Dave

    Dave :-)

    Thanks a million for the tip ...very helpful indeed.
    Still bashing around with the options.

    Now this is what prompted me to post this thread, if I use an array , should I use a byte or a word array ?
    Which would be the better one?
    Why choose one over the other?

    No matter what type of array I choose, I think the comparison of bytes would become rather cumbersome not so ?

    For example if I choose a word array then the first line received would receive the first 4 bytes(0 to 4) WNUM,XNUM,YNUM,ZNUM.
    The second line would be held in byte 5 to 7 not so ?

    Then to compare each line is where things start to get cumbersome I think and by that I mean lots of IF,THEN statements.
    So for example to compare lines 1 (WNUM,XNUM,YNUM and ZNUM and line 2 (WNUM,XNUM,YNUM and ZNUM I might have to do something like :
    MyWordArray var WORD [7]
    If (MyWordArray.0 and MyWordArray.1 and MyWordArray.2 and MyWordArray.3 ) = (MyWordArray.4 and MyWordArray.5 and MyWordArray.6 and MyWordArray.7) THEN DoSomething

    This doesn't look quite right :-(

    That's the problem I have ... I am really battling to somehow compare each line.
    Is there a way of doing this by sending and receiving everything as a STRING and comparing the entire string ?

    Any more suggestions would really be appreciated.

    Kind regards

    Dennis

  4. #4
    Join Date
    Sep 2005
    Location
    Campbell, CA
    Posts
    1,107


    Did you find this post helpful? Yes | No

    Default

    Sometimes, when the strings you have to compare are very long, or when there are a lot of them, rather than compare them byte-for-byte, it is easier to use a good CRC algorithm on each one, then compare the CRCs.
    Charles Linquist

  5. #5


    Did you find this post helpful? Yes | No

    Default a checksum..

    @Charles and Dave

    I definitely agree with the checksum idea , in fact, it is the checksum concept that has led to the confusion

    As a reference let's use this thread (thanks Art for his input!)
    http://www.picbasic.co.uk/forum/showthread.php?t=12492

    SO from that thread POST #2 one possible method of checksumming is described, since it's fairly straight forward we could use that as a reference.

    So the bytes I would like to transmit are declared as
    WNUM,XNUM,YNUM and ZNUM respectively.

    ***NOTE that this fairly trivial when comparing each byte of a single transmission BUT I am transmitting the same thing 4 times and that's whats confusing me.
    The reason I want to do it 4 (or more) times is because from what I have seen in my tests the first one and/or second received line is usually damaged/corrupted so I figured it is probably best if I compare the third and 4th transmitted lines. Does that make sense?

    Here's an example of the transmit code:

    Code:
    WNUM as byte
    XNUM as byte
    YNUM as byte
    ZNUM as byte
    CHECKSUM as byte
    CHECKSUM = $3F
    
    'now do the XOR checksumming
    Checksum = Checksum ^ WNUM
    Checksum = Checksum ^ XNUM
    Checksum = Checksum ^ YNUM
    Checksum = Checksum ^ ZNUM
    
    'and now TX the data 4 times 
    main:
    	low led 'set led low
            If GPIO.2 = 1 then main 'check button
            
    send:             
              
              for counter = 0 to 3
         
       DEBUG train,train,train,train,train,synk,WNUM,XNUM,YNUM,ZNUM,CHECKSUM,$d,$a
         	
               next counter
                  high led 'set led high
            
                 pause 200
        goto main
    end
    On the receiver side the code (as per the thread referenced earlier) would look like this:

    Code:
    'Variables begin here 
       
        SYNK    VAR BYTE
        SYNK = $7E
        WNUM    VAR BYTE
        XNUM    VAR BYTE
        YNUM    VAR BYTE
        ZNUM    VAR BYTE
        CHECKSUM var byte 'this holds the received checksum
        CHECKSUM_CHECK var byte 'hold the XOR'd value
        Checksum_Check = $3F 'this is the checksum value to XOR with 
        
      'Variables end here 
    
    DEBUGIN [WAIT(SYNK),WNUM,XNUM,YNUM,ZNUM,CHECKSUM]
               ' wait for SYNK, when received store next 4 bytes in variables WNUM,XNUM,YNUM,ZNUM
               'then send these to hyperterminal or serial program or wherever 
                
                'checksum the received bytes using XOR with 3F 
                Checksum_Check = Checksum_Check ^ WNUM
                debug "xNUM checksum_check is ",HEX checksum_check
                Checksum_Check = Checksum_Check ^ XNUM
                debug "wNUM checksum_check is ",HEX checksum_check
                Checksum_Check = Checksum_Check ^ YNUM
                debug "yNUM checksum_check is ",HEX checksum_check
                Checksum_Check = Checksum_Check ^ ZNUM
                debug "zNUM checksum_check is ",HEX checksum_check
                
    IF Checksum_Check = Checksum THEN
    DEBUG "WNUM is ",DEC WNUM,"XNUM is ",DEC XNUM,"YNUM is ",DEC YNUM,"ZNUM is ",DEC ZNUM,$d,$a
    ENDIF
    BUT as you can see the receive code only does its thing for each received line. I want to store all 4 lines of data then do a compare of the received lines 3 and 4.

    See the problem is if only one transmission is made (one line) and there is a corruption of a byte (checksum mismatch anywhere in the line) then the TX fails. That is why I thought to send and receive 4 lines (or more) of the same thing and then do a compare.

    I am totally confused (again)

    PLEASE HELP..........!

    Kind regards

    Dennis
    Last edited by Dennis; - 6th April 2010 at 00:34.

  6. #6
    Join Date
    Nov 2003
    Location
    Wellton, U.S.A.
    Posts
    5,924


    Did you find this post helpful? Yes | No

    Default

    Not sure exactly what you are trying to do?

    Send the same thing four times and if any of them fail the whole thing fails? Even if one is good?

    Even doing a compare will not tell you which one is good. Only the checksum (CRC) thing will do that.
    Last edited by mackrackit; - 6th April 2010 at 00:43.
    Dave
    Always wear safety glasses while programming.

  7. #7


    Did you find this post helpful? Yes | No

    Default something like that :-0

    Hi Dave

    Send same thing 4 times
    so
    1
    2
    3
    4
    and compare instance 3 and 4 'cos usually correction occurs on 1 and 2
    If 3 and 4 match then TX was good.

    Hope that helps

    Kind regards
    Dennis

Members who have read this thread : 0

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts