[Gambas-user] Serial Port issues and events.

ML d4t4full at ...626...
Thu Jun 30 15:51:41 CEST 2016


Alexie,

Not really. This is my first attempt at a binary-exchange over serial in
Gambas. Can't also find out the old G3 examples that might have existed
about this and my web searches were unsuccessful.
So, if you could point me to some example code to read a Byte[], I'll be
grateful. My attempts to read to a Byte[] failed with SEGFAULT, or
errors with no text.

On the other hand, I just realized -again, happened to me in the past
and I forgot it did- that the list does not send text inside RAW tags...
The code can be seen only on Nabble's site, so I'm reinserting it here.
Please excuse my notation; I know it's not Gambas standard. It's what I
used for eons on QB45, VB3, VB4, VB5 VB6 and even .Net for my day to day
work; (really) old habits die hard.

Declarations:

  Private Const TEST_TX As String = "ø1" '0x02-0xF8-0x31-0x03 -
Nabble's RAW TEXT tags removed some data from the string
  Private Const TEST_RX As String = "" '0x02-0x15-0x03 - Nabble's RAW
TEXT tags removed some data from the string
  Private m_tty As SerialPort
  Private m_rxBuff As String = Null

Instancing and setting the port up:

    'Instance serial port and set properties
    m_tty = New SerialPort As "myTty"  'This should call myTty_Read()
when there is data to read from the port, but it does not seem to
trigger. Wonder why.
    m_tty.PortName = "/dev/" & m_port
    m_tty.Speed = m_speed
    Select Case m_parity
      Case "No/Space"
        m_tty.Parity = SerialPort.None
      Case "Even"
        m_tty.Parity = SerialPort.Even
      Case "Odd"
        m_tty.Parity = SerialPort.Odd
    End Select
    m_tty.DataBits = m_bits
    m_tty.StopBits = m_stop

    'Encoder use hardware handshake (RTS/CTS)
    m_tty.FlowControl = SerialPort.Hardware

    'Try opening the port
    m_tty.Open()
    m_tty.Blocking = False
    m_tty.DTR = True

Then, I send TEST_TX and expect for either TEST_RX or a timeout:

  Public Function Test() As Boolean

    Dim tOut As Date = DateAdd(Now, gb.Second, 2)

    'Reset RX Buffer, send test command and check for timeout/response
    m_tty.Drop              'Kill remaining send data
    m_tty.Begin()           'Start buffering
    Write #m_tty, TEST_TX   'Add to send buffer
    m_rxBuff = Null         'Kill RX buffer
    m_tty.Send()            'Send buffer

    While (Now < tOut) And (m_rxBuff <> TEST_RX)
      Sleep 0.1
      'This IF below should not be needed, but myTty_Read() never fires
otherwise!
      If m_tty.InputBufferSize > 0 Then
        myTty_Read()
      Endif
    Wend

    Finally
      Return (m_rxBuff = TEST_RX)

    Catch
      Message.Error("Error '" & Error.Text & "' occurred in " & Error.Where)

  End

Finally, this next is the problem code. It does not fire as expected
when data arrives, and when I call it by hand in the IF above, if I try
to READ #m_tty As String it chops off the leading 0x02 byte, and I could
not figure out how to READ #m_tty As Byte[] or As Object (I get a null
error; nothing on the message.error text, and no OK button on it either):

  Public Sub myTty_Read()

    Dim dLen As Integer = m_tty.InputBufferSize
    Dim sgmnt As Byte[] 'String = Null  'This here is my desperate
attempt to read As String or As Object...

    'Data should be available in the serial port buffer
    'sgmnt = Read #m_tty As String
    'm_rxBuff &= sgmnt
    sgmnt = Read #m_tty As Object
    m_rxBuff &= sgmnt.ToString
    Debug "Rx: (" & CStr(dLen) & ") " & sgmnt

    Catch
      'This is triggered when reading As Object or As Byte[]. But the
text is NULL and has no OK button!
      Message.Error("Error '" & Error.Text & "' occurred in " & Error.Where)

  End

A breakpoint in the "sgmnt = Read #m_tty As ..." line show that the
value of "dLen" is three, which is OK. But when I try to READ As String,
the leading 0x02 is missing from the string, leaving only 0x15-0x03
(quick tooltip shows the string to be "\x15\x03"). When this is later
compared to TEST_RX in Test(), the comparison obviously fails.

TIA,
zxMarce.





More information about the User mailing list