Capture and compare serial data


Closed Thread
Results 1 to 17 of 17

Hybrid View

  1. #1

    Default Capture and compare serial data

    Hi Guys

    Haven't been around in a while and I hope everyone is well :-)

    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.

    Heres the pseudo code:
    1.send/transmit 4 bytes 4 times (done and it's working!)

    2.receive the 4 bytes 4 times (the receiver receives the 4 bytes 4 times successfully -using serial port tool)

    3.Store the 4 instances/lines of 4 bytes (Here's where I have the problem)

    4.Compare lines 3 and 4 (or any of the lines with one of the others.This is the other problem I have)

    Heres my code:
    Code:
            
    'Variables begin here
    	SYNK    VAR BYTE
        	SYNK = $7E   '126 DECIMAL, BINARY 11111110
        	TRAIN   VAR BYTE
        	TRAIN =  $B3
        	WNUM    VAR BYTE
        	XNUM    VAR BYTE
        	YNUM    VAR BYTE
        	ZNUM    VAR BYTE
        	WNUM = 31
        	XNUM = 1
        	YNUM = 2
        	znum = 2
    'end of variables
    
    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,$d,$a
         	
               next counter
                  high led 'set led high
            
                 pause 200
        goto main
    end
    So as you can see I use DEBUG to send the same this to the serial port 4 times which renders this output in the serial tool:
    ³³³³³~
    ³³³³³~
    ³³³³³~
    ³³³³³~
    which converted to DECIMAL looks like this:
    17917917917917912631122
    17917917917917912631122
    17917917917917912631122
    17917917917917912631122
    PERFECT but .....

    How can I receive and store each instance of WNUM,XNUM,YNUM,ZNUM.

    In other words I would like to have four instances of WNUM,XNUM,YNUM,ZNUM, so I could compare each instance of WNUM,XNUM,YNUM and ZNUM.

    What is the best way to do it ?

    Would I use 4 different arrays?
    For example array1 would hold the first line conatining the values for WNUM,XNUM,YNUM,ZNUM.
    Array2 would hold the values for the second line and array3 for line 3 and array4 for line 4.

    Some help would really be appreciated.

    Kind regards

    Dennis

  2. #2


    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

  3. #3
    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.

  4. #4


    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

  5. #5
    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

  6. #6


    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.

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