[Gambas-user] Serial Port issues and events.
ML
d4t4full at ...626...
Thu Jun 30 17:44:41 CEST 2016
Fernando,
I know what you mean. In my case I just wanted to show in the examples
which bytes come and go through the port.
I do know 0x02 (&H2 for Gambas) is a single byte with value 2. I'm not
transmitting "0-x-0-2" over the wire as 4 bytes, I'm just transmitting a
string whose first character has ASCII value 0x02.
I have also been coding for years (started with QB45 in the nineties,
and before that with ZX-81 and ZXSpectrum in BASIC and even Assembler).
I have coded several countries' Fiscal Printer interfaces for my company
(all of them RS232C). But all this I did on Mr Gates' in-operating
systems and IDEs.
I do not know, though, the basics of RS232 I/O on Gambas3, methinks:
I do not know -for example- what is wrong in my code that makes serial
xxx_READ events not trigger.
I also do not know how to write/read proper binary-as-string (or even
bynary-as-byte[]) to/from RS232.
My particular issue with the program:
When the .InputBufferSize is not zero, it shows 3, which is correct (I'm
expecting three bytes or chars, with values 0x02-0x15-0x03).
Immediately afterwards, when I READ these bytes into a string (the only
working thing so far), the first byte (0x02) is chopped off and the LEN
of the resulting string is 2.
I wonder: How come? There were three bytes in the buffer and I get a two
byte string!
I think Gambas is treating the 0x02 as a string-lenght indicator, and
fills the string with the rest of the buffer, therefore fetching 2
characters (this seems backed because the string gets the 0x15 and 0x03
bytes as its contents). But I need all three bytes.
My not-so-wild-guess (which agrees with your advise) is that I must use
Byte[] and not String to read these blocks. Problem is twofold:
1- (BAD) Cannot get the _READ event to trigger
2- (WORSE) Cannot figure out how to make Gambas return a Byte[] with the
buffer contents.
Any pointers or working examples in those directions WILL help. Hope I
explained myself better now.
Regards,
zxMarce.
On 2016-06-30 11:34, nando_f at ...951... wrote:
> I've done extensive work with the serial port for a dozen years
> with 100% success 24 hour operation.
>
> Sometimes people get mixed up with "0x02" thinking it's binary.
> That is 4 characters ascii.
> I prefer to use chr(2) to create a 1 length string binary 2.
> If you're going to use byte[] array
> then byte[0] = 2 is the equivalent.
> Using escape (like HTML encoding) is the incorrect thinking
> -Fernando
>
> --
> Open WebMail Project (http://openwebmail.org)
>
>
> ---------- Original Message -----------
> From: ML <d4t4full at ...626...>
> To: gambas-user at lists.sourceforge.net
> Sent: Thu, 30 Jun 2016 10:51:41 -0300
> Subject: Re: [Gambas-user] Serial Port issues and events.
>
>> 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.
>>
>> ------------------------------------------------------------------------------
>> Attend Shape: An AT&T Tech Expo July 15-16. Meet us at AT&T Park in San
>> Francisco, CA to explore cutting-edge tech and listen to tech luminaries
>> present their vision of the future. This family event has something for
>> everyone, including kids. Get more information and register today.
>> http://sdm.link/attshape
>> _______________________________________________
>> Gambas-user mailing list
>> Gambas-user at lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/gambas-user
> ------- End of Original Message -------
>
>
> ------------------------------------------------------------------------------
> Attend Shape: An AT&T Tech Expo July 15-16. Meet us at AT&T Park in San
> Francisco, CA to explore cutting-edge tech and listen to tech luminaries
> present their vision of the future. This family event has something for
> everyone, including kids. Get more information and register today.
> http://sdm.link/attshape
> _______________________________________________
> Gambas-user mailing list
> Gambas-user at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/gambas-user
More information about the User
mailing list