Shop OBEX P1 Docs P2 Docs Learn Events
intercommunications between 2 ProtoBoard with rs232 NO 2 — Parallax Forums

intercommunications between 2 ProtoBoard with rs232 NO 2

nomadnomad Posts: 276
edited 2007-10-01 08:04 in Propeller 1
intercommunications between 2 ProtoBoard with rs232 NO 2

hi,
today i have testing:
1) in TestSlave_1.spin --> sender
ExtSerial.dec(sendByte) -> on TestMasterVga_1 = output == 0
with
ExtSerial.tx(sendByte) -> = output == 0
with
ExtSerial.str(string("A",10,13)) = output == 0

2) in TestMasterVGA_1.spin --> Receiver
if(c := ExtSerial.rxtime(500)) => 0
str := c
text.out($0D)
text.dec(str)

now i have more problems as yesterday, please help me.

i am looking for the correct code to send a
LONG send_longVal as 875 from the Slave to the Master
and
reiceive a LONG rec_longVal into the Master and the Master working with this value.


as code: TestSlave_1.spin
TestMasterVga_1.spin

@deSilva:
hi, i think you understand german.smile.gif deutsches Forum,......
<< ich hab einige probleme mit der communication:
fuer deine gestrige antwort danke ich.
so, wie ich's versteh soll ich den gesendeten string mit dem Number-Object
in eine zahl convertieren.
da hab ich einen knopf in der leitung:
wenn ich (falls das ueberhaupt geht) vom Slave einen dezimalen wert z.b.
LONG send_longVal := 875
(mit Ext.Serial.dec(var) an den Master sende
empfaengt das master ja eine zahl z.b. 875, warum sollte ich diese zahl
wieder convertieren.
auch hab ich so meine probleme, deinen hinweis zu befolgen:
(Best you collect all characters (upto the stop condition, e.g. 13)
in a vector, add a zero byte.
and let NUMBERS.fromString(..) do the dirty work )
ich waere sehr dankbar, wenn ich hilfe bekaeme.
>>


regards
nomad

{****************************************************************************** 
    TestMasterVga_1.spin 
******************************************************************************}   

OBJ
  ExtSerial : "FullDuplexSerial"   ' Full Duplex Serial Controller
  text : "vga_text"                ' Create vgaText-object  

CON
  _clkmode = xtal1 + pll16x
  _xinfreq = 5_000_000
  
  serRecv = 1  ' Receive on I/O pin 0  = red
  serXmit = 0  ' Transmit on I/O pin 1 = black

VAR
  BYTE str
  LONG rec_longVal
  

PUB main | c
  
  text.start(16)
  text.str(string("Serial-InputTestMaster",13,10))

  ExtSerial.start(serRecv,serXmit,%0000,9600) ' 9600 Baud

  repeat
  
    'text.str(string("repeat",13,10))
    
    if(c := ExtSerial.rxtime(500)) => 0 ' Wait up to 500ms for a character
      'text.str(string(" Received",13,10))

      str := c
      text.out($0D)   
      text.dec(str)

      'waitcnt(30_000_000 + cnt)    
      
    case c 
      "0".."9":              ' do something with a digit
      "A".."Z","a".."z":     ' do something with a letter
      '13:                                      ' ok, here's a return
      ' 8:                                      ' backspace key

{*************************************************************************** 
     TestSlave_1.spin                                                  
     ----------------                                               
***************************************************************************}

CON
  _clkmode = xtal1 + pll16x
  _xinfreq = 5_000_000

  serRecv = 0 ' Receive on I/O pin 0
  serXmit = 1 ' Transmit on I/O pin 1
  ledon   = 4
  
VAR
  BYTE sendbyte   

  

OBJ
  ExtSerial : "FullDuplexSerial"
  
     
Pub Test1
  dira[noparse][[/noparse]ledon]~~
      
  ExtSerial.start(serRecv,serXmit, 2, 9600) '0,1,2,9600  '- rxpin,txpin,mode,Baud
                                   ' -1 = receive      =     read   (rxpin)
                                   '  0 = transmission =     write  (txpin)
                                   '  - depends on your set up
  sendbyte := 125
                                
  repeat 5000 ' repeat 5 times

    !outa[noparse][[/noparse]ledon]

    'ExtSerial.tx(sendbyte)   
    ExtSerial.str(string("A",10,13))  ' \r = for linux carridge return 
     'waitcnt(100_000_000 + cnt) 'wait a length of time

'----------------------------------------------------------------------------------

Comments

  • deSilvadeSilva Posts: 2,967
    edited 2007-09-30 12:14
    Sigh, yes there is some confusion. I best start at the beginning.

    When you transfer numerical data via asynchronious protocols it has been good practice from times ago to send ASCII characters, i.e. %0011_001 = "1" rather than %0000_0001

    This is somewhat redundant, as you could transfer twice the amount of data using "binary"; but you can check the datastream very easily by connecting a terminal (program).

    This means the sender has to convert a binary number (e.g. a LONG) into single characters before transmitting it, similar as when displaying them to TV.

    FullDuplexSerial (FD) has - according to some convention most driver writers follow - a nice routine DEC that will do this:

    FD.DEC(123_567_789)

    The receiver has to "assemble" that again, alas there is no routine for this in the FD object. But there is something in NUMBERS!

    So what the slave has to do is:
    ' now a positive (!) number is expected:
      value := 0
      REPEAT
          c := rx-"0"
          IF C<0 OR c>9
              QUIT
          value := 10*value +c
    



    But it may be the number you are expecting has a more complex format (maybe it's a floating point number). In that case you would only strore the single characters in a string and let someone else "decode" it.

    ' now some number is expected, ending with 13 (= CR)
    PRI getNumber(cend) | str[noparse][[/noparse] 20], i
      i:=0   
      REPEAT UNTIL (c:= rx) == cend
          str[noparse][[/noparse] i++] := c
      str[noparse][[/noparse] i]:=0
      RETURN NUMBERS.fromString(@str)
    

    Post Edited (deSilva) : 9/30/2007 12:42:14 PM GMT
  • nomadnomad Posts: 276
    edited 2007-09-30 12:55
    hi deSilva,
    thanks for your answer,
    wusch, i hope that i understand you and your code.
    it this code correct (excuse me) now i am online:


     Slave_1.spin   (Sender)                                               
     ----------------                                               
    {***************************************************************************}
    
    CON
      _clkmode = xtal1 + pll16x
      _xinfreq = 5_000_000
    
      serRecv = 0 ' Receive on I/O pin 0
      serXmit = 1 ' Transmit on I/O pin 1
        
    VAR
      LONG sendLongVal   ' aka 875   
    
    OBJ
      fdSerial : "FullDuplexSerial"
         
    Pub Sender
      
      fdSerial.start(serRecv,serXmit, 2, 9600) '0,1,2,9600  '- rxpin,txpin,mode,Baud
       
      sendLongVal := 875
                                    
      repeat 5000 
    
        fdSerial.DEC(sendLongVal)   ' your tip
        
    {*****************************************************************************}
       Master_1.spin  (Receiver) 
    ******************************************************************************}   
    
    OBJ
      ExtSerial : "FullDuplexSerial"   ' Full Duplex Serial Controller
      text : "vga_text"                ' Create vgaText-object  
    
    CON
      _clkmode = xtal1 + pll16x
      _xinfreq = 5_000_000
      
      serRecv = 1  ' Receive on I/O pin 0  = red
      serXmit = 0  ' Transmit on I/O pin 1 = black
    
    VAR
      
      LONG rec_longVal
      LONG values               ' your variables
      
    PUB main | c
      
      text.start(16)
      text.str(string("Serial-InputTestMaster",13,10))
    
      ExtSerial.start(serRecv,serXmit,%0000,9600) ' 9600 Baud
    
      REPEAT
           
        IF(c := ExtSerial.rxtime(500)) => 0 ' Wait up to 500ms for a character
    
          'text.str(string(" Received",13,10))   ' only for tests ist running
    
         ' now your code -> i think the values are integer aka 875 not floatingPoint
         ' the value comes from a memsic 2125-sensor -> the values are -1000 to + 1000
         ' for the first time i take a positive value +875
    
         ' now a positive (!) number is expected:
         values := 0
       
         REPEAT
            c := rx-"0"
            IF C<0 OR c>9
              QUIT
          value := 10*value +c
          text.dec(value)
        
         ' is this correct      
          
      {**********************************************************************}
    
    



    thank you for your help
    (on german, bin froh um deine hilfe, und wuerde mich ueber eine antwort freuensmile.gif )

    regards
    nomad
  • deSilvadeSilva Posts: 2,967
    edited 2007-09-30 13:00
    Not quite....
    You have to SEPERATE the sent numbers by some non-digit, e.g. a blank or a carriage return...
  • nomadnomad Posts: 276
    edited 2007-09-30 15:10
    no 3:

    hi deSilva,
    thanks, somethings goes wrong
    in the meantime i have testing the 2 progs.

    on slave_1:
    if i make: fdSerial.dec(875) ' your tip

    then on master with
    REPEAT
    c := ExtSerial.rx-"0" ' wrong: c := rx-"0"
    'IF c<0 OR c>9 ' dont run = no output
    ' QUIT
    values := 10*values +c ' if value = byte then output = 176
    text.out($0D) '
    text.dec(values) ' output: values as byte =176 if values as long -143165760
    'text.dec(c) ' dec(c) = -48 , bin(c,8) = 11010000 , hex(c,8) = FFFFFFD0

    the output on master: 176

    but i know nothing whats going wrong.
    in your last answer you write:
    << Not quite....
    You have to SEPERATE the sent numbers by some non-digit, e.g. a blank or a carriage return...
    >>
    in which prog?,
    but i think, please, i posting now the lastest programms:
    please corrected my programm.
    on german:
    << da ich im augenblick einen knopf in der leitung habe.
    bitte korrigiere meine beiden programme.
    schande ueber mein haupt. aber ich hab aus meiner sicht alles probiert,
    ich bin schon froh wenn jetzt beim master ein output kommt.
    >>
    thanks for your help
    now the pgm:

     
    slave_1.spin        
    
    {***************************************************************************}
    
    CON
      _clkmode = xtal1 + pll16x
      _xinfreq = 5_000_000
    
      serRecv = 0 ' Receive on I/O pin 0
      serXmit = 1 ' Transmit on I/O pin 1
      ledon   = 4      
        
    VAR
      LONG sendLongVal   ' aka 875   
    
    OBJ
      'extSerial: "Extended_FDSerial"
      fdSerial : "FullDuplexSerial"
         
    Pub Sender
      dira[noparse][[/noparse]ledon]~~        
      
      fdSerial.start(serRecv,serXmit, 2, 9600) '0,1,2,9600  '- rxpin,txpin,mode,Baud
      'extSerial.Start(serRecv,serXmit, 2, 9600) '0,1,2,9600  '- rxpin,txpin,mode,Baud 
       
      'sendLongVal := 875
                                    
      repeat 5000
           
        !outa[noparse][[/noparse]ledon]
        'fdSerial.tx(875)
        'extSerial.tx(875)
        
        'extSerial.str(string("123",13))
        'fdSerial.str(string("123",13))
    
        
        fdSerial.dec(875)   ' your tip
        'extSerial.dec(875) 
         
        waitcnt(100_000_000 + cnt) 'wait a length of time      
    
       
        
    {*****************************************************************************}
    
    ' spin-pgm dd. 30.09.2007 gem. deSilva
    '
    ' 1.fehler:  c := rx-"0"  (rx ????)    
    ' output: -143165760
    '
    '  master_1.spin  (Receiver) 
    {******************************************************************************}   
    
    OBJ
      ExtSerial : "FullDuplexSerial"   ' Full Duplex Serial Controller
      text : "vga_text"                ' Create vgaText-object  
    
    CON
      _clkmode = xtal1 + pll16x
      _xinfreq = 5_000_000
      
      serRecv = 1  ' Receive on I/O pin 0  = red
      serXmit = 0  ' Transmit on I/O pin 1 = black
    
    VAR
      
      LONG rec_longVal
      BYTE values               ' your variables
      
    PUB main | c
      
      text.start(16)
      text.str(string("Serial-InputTestMaster",13,10))
    
      ExtSerial.start(serRecv,serXmit,%0000,9600) ' 9600 Baud
    
      REPEAT
           
        IF(c := ExtSerial.rxtime(500)) => 0 ' Wait up to 500ms for a character
    
          'text.str(string(" Received",13,10))   ' only for tests ist running
    
         ' now your code -> i think the values are integer aka 875 not floatingPoint
         ' the value comes from a memsic 2125-sensor -> the values are -1000 to + 1000
         ' for the first time i take a positive value +875
    
         ' now a positive (!) number is expected:
         values := 0
       
         REPEAT
           c := ExtSerial.rx-"0"  ' wrong:   c := rx-"0"
           'IF c<0 OR c>9         ' dont run = no output
           '  QUIT
           values := 10*values +c   ' if value = byte then output = 176
           text.out($0D)  '      
           text.dec(values)    ' output: values as byte =176 if values as long -143165760  
           'text.dec(c)        ' dec(c) = -48 ,  bin(c,8) = 11010000 , hex(c,8) = FFFFFFD0
            
          
      {**********************************************************************}
    
    
    



    i think i come back tomorrow.
    nomad
  • deSilvadeSilva Posts: 2,967
    edited 2007-09-30 16:30
    Nomad,
    I gave you some code snippets YOU have to put into your own right context! It is no use to put them SOMEWHERE into your program...

    (a) The receiver must be put into a position to KNOW that there will be a number NOW and that this number string has now ended. So
    - either it must learn about the timingcontraints you use in the transmitter (WAITCNT(10000000))
    - or you send "separators" e.g. 13 as I suggested in my snippet!

    (b) So please do what suits you best.E.G.
    Transmitter:
        fdSerial.dec(875)
        fdSerial.tx(13)
    



    Receiver:
    ' now a positive (!) number is expected:
      value := 0
      REPEAT UNTIL (c:=rx) == 13
          value := 10*value +(c-"0")
    



    And by all means use a LONG for value (and for c as well)

    And think about why this snippet is just the same as the the two others I gave you smile.gif

    Post Edited (deSilva) : 10/1/2007 8:08:08 AM GMT
  • nomadnomad Posts: 276
    edited 2007-10-01 08:04
    hi deSilva,
    excuse my stupid questions.
    thanks for your help
    regards
    nomad
Sign In or Register to comment.