Shop OBEX P1 Docs P2 Docs Learn Events
receiving long instead of a byte — Parallax Forums

receiving long instead of a byte

OwenOwen Posts: 100
edited 2007-01-14 06:24 in Propeller 1
I think this likely a basic question, but one I have yet to figure out. I have applicatio that i wrote wich controls a stepper motor via serial comands. I'm sending the number of steps for the motor to turn from a visual basic brogram I have writen but I only know how to send an array of bytes or a string through the serial port which is limiting the number of steps to 0-255. Is there a way to send a larger number? I need the propeller to see a number as large as 180,000. is there a way to send 4 seperate bytes and have the propeller create a long from them?
here is the current code i'm writing Is attached if it helps.
thanks,
Owen

Comments

  • scottascotta Posts: 168
    edited 2007-01-13 16:16
    long pos
    byte b0,b1,b2,b3

    b0:=serin
    b1:=serin
    b2:=serin
    b3:=serin

    pos[noparse][[/noparse]0]:=b0
    pos:=b1
    pos:=b2
    pos:=b3
  • scottascotta Posts: 168
    edited 2007-01-13 16:17
    long pos
    byte b0,b1,b2,b3

    b0:=serin
    b1:=serin
    b2:=serin
    b3:=serin

    pos:=(b0<<24) and (b1<<16) and (b2<<8) and b3
  • scottascotta Posts: 168
    edited 2007-01-13 16:18
    long pos

    pos:=(serin<<24) and (serin<<16) and (serin<<8) and serin
  • OwenOwen Posts: 100
    edited 2007-01-13 16:21
    exactly what I needed !!!
    thank you!
  • scottascotta Posts: 168
    edited 2007-01-14 03:11
    No problem dude
  • T ChapT Chap Posts: 4,223
    edited 2007-01-14 06:24
    Here are some snippets from the exact thing you are trying to do. I am using Real basic, and sending an ascii string with the position which can be any number, i.e. 180000. I first send a TAB delimted string from the application terminated with CR, here is a snippet of sending the X motor value, but in the program it sends each motor value one at a time just as shown, or separately as desired.

    OutputString = "XID" + TAB + str(X) + CR     'Realbasic app sending first the motor ID, then the position.  str(X) is a value of the position, where is X is derived from sereral locations depending on who sent the motor move command(loaded from file, manual move etc) 
    
    



    The Propeller receives the two bytes, the ID then the position, and converts the ascii string to a 32 bit integer. After each set is rec'd, a case statement compares the ID to a list, if it is X then a variable X is updated, same for Y, Z, R. Another cog sends the motor to any newly arrived position.


    CON
        _clkmode = xtal1 + pll16x   ' use crystal x 16
        _xinfreq = 5_000_000        ' 5 MHz cyrstal (sys clock = 80 MHz)
    
        TAB  =  $09
        CR    = $0D
    
    
    VAR
        byte array[noparse][[/noparse]24]              ' buffer for numeric fields
        long X, Y, Z, R             ' these are actually 32 bit integers  
        long  temp1, temp2
    
    
    OBJ               
     ser     : "fullduplexserial"
     term    : "tv_terminal"
    
    
    PUB Start | i
     ser.start(0, 1, 0, 9600)      'rec tx mode baud
     term.start(12)     'enable TV terminal
      
      repeat
       if receiveStr(@array,24) <> TAB
         term.str(string("Missing TAB after temp1",CR))
         quit
       Temp1 := convertstr(@array)
       if receiveStr(@array,24) <> CR                                 
         term.str(string("Missing CR after temp2",CR))
         quit
       Temp2 := convertStr(@array)
       CaseTemp
    
    
    PRI receiveStr(address,count) | c
      repeat count                   'start counting
       c := ser.rx                   'c = first rec'd byte
       if c == TAB or c == CR        'c == CR or TAB,                              
          byte[noparse][[/noparse]address] := 0 
          return c                   'now return delimiter for optional checking     
       byte[noparse][[/noparse]address++] := c          'update c                     
      return 0                       'default delimiter is zero
    
    PRI getrx
       recbyte := ser.rx
    PRI getarray  | i
      repeat i from 0 to 4
       if recbyte == $0D
         recbyte := 0 
      
    
    PRI convertStr(address) | C
      repeat while c := byte[noparse][[/noparse]address++]
       result := result * 10 + (c - "0")
    
    PRI  CaseTemp
       case temp1
             4270 : x := temp2    '4270 is decimal equiv to ascii string "XID"   , if it is X, then the vairable X is written to the value rec'd
                    repeat until not lockset(SemId)
                    RetEcheck(string("XID"), X)    'return the value back to the app to verify prior to motor run
                    lockclr(SemId)
       case temp1
             4370 : y := temp2
                    repeat until not lockset(SemId) 
                    RetEcheck(string("YID"), Y)
                    lockclr(SemId) 
       case temp1
             4470 : z := temp2
                    repeat until not lockset(SemId) 
                    RetEcheck(string("ZID"), Z)
                    lockclr(SemId)
       case temp1
             3670 : r := temp2
                    repeat until not lockset(SemId) 
                    RetEcheck(string("RID"), R)
                    lockclr(SemId)
    
    

    Post Edited (originator) : 1/14/2007 8:54:01 AM GMT
Sign In or Register to comment.