<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <p>I wasn't clear enough.  I agree that serial communications remain
      important.  However, user space programs no longer need to deal
      with the low level details of handshaking and flow control.  That
      is now handled by the kernel space driver.  In virtually all
      cases, user space programs can ignore CTS, DCD, DSR, DTR, RNG,
      RTS, and just read and write to the serial port as a stream.</p>
    <p>One issue that may arise, the linux kernel only uses CTS/RTS for
      flow control; it ignores DSR/DTS.<br>
    </p>
    <br>
    <div class="moz-cite-prefix">On 2018-08-07 01:53 AM, Mike Crean via
      User wrote:<br>
    </div>
    <blockquote type="cite"
      cite="mid:790274409.3110289.1533621211448@mail.yahoo.com">
      <meta http-equiv="content-type" content="text/html; charset=utf-8">
      <div style="font-family:Helvetica Neue, Helvetica, Arial,
        sans-serif;font-size:13px;">
        <div style="font-family:Helvetica Neue, Helvetica, Arial,
          sans-serif;font-size:13px;">
          <div>
            <div><span>
                <p style="margin-bottom: 0cm; line-height: 100%">I
                  disagree that the
                  RS232, RS485 controls are no longer relevant.
                  Industrial automation
                  uses these controls quite extensively when talking to
                  PLC’s RTU’s
                  and specialised control hardware that is controlled by
                  the Modbus,
                  DMP3 and many other industrial communications
                  protocols. The speed
                  over a network is generally not an issue as most
                  industrial process
                  are slow when compared to RS232, RS485 data speeds of
                  around 9600 or
                  the now common 19200 BAUD rates. I have had extensive
                  experience with
                  this type of communication over many years controlling
                  and remote
                  control of small Power Stations of 1 to 10 megawatt
                  using 1 megawatt
                  modules. Each module uses at least 1 PLC per generator
                  and up to an
                  additional 5 or 6 for general utility control and at
                  least 1 RTU.
                  These are generally all serviced over a RS485 network
                  at 9600 BAUD. I
                  have not seen any bottle necks with this number of
                  devices as long as
                  network usage is prioritised correctly.</p>
                <p style="margin-bottom: 0cm; line-height: 100%"><br>
                </p>
                <p style="margin-bottom: 0cm; line-height: 100%">Regards</p>
                <p style="margin-bottom: 0cm; line-height: 100%">Mike</p>
              </span><br>
            </div>
            <div><br>
            </div>
            <div class="ydpb4df0dffsignature">
              <div style="font-family:Helvetica, Arial,
                sans-serif;font-size:13px;">
                <div><br>
                </div>
                <div><br>
                </div>
              </div>
            </div>
          </div>
          <div><br>
          </div>
          <div><br>
          </div>
        </div>
        <div id="yahoo_quoted_4592595041" class="yahoo_quoted">
          <div style="font-family:'Helvetica Neue', Helvetica, Arial,
            sans-serif;font-size:13px;color:#26282a;">
            <div> On Tuesday, 7 August 2018, 11:36:07 am AWST, Tony
              Morehen <a class="moz-txt-link-rfc2396E" href="mailto:tmorehen@ajm-software.com"><tmorehen@ajm-software.com></a> wrote: </div>
            <div><br>
            </div>
            <div><br>
            </div>
            <div>
              <div dir="ltr"><br>
              </div>
              <div dir="ltr"><br>
              </div>
              <div dir="ltr"><br>
              </div>
              <div dir="ltr">-------- Forwarded Message --------<br>
              </div>
              <div dir="ltr">Subject:     Re: [Gambas-user] using events
                of serial ports for reading how_?<br>
              </div>
              <div dir="ltr">Date:     Mon, 6 Aug 2018 20:12:50 -0400<br>
              </div>
              <div dir="ltr">From:     Tony Morehen <<a
                  ymailto="mailto:tmorehen@ajmconsulting.ca"
                  href="mailto:tmorehen@ajmconsulting.ca"
                  moz-do-not-send="true">tmorehen@ajmconsulting.ca</a>><br>
              </div>
              <div dir="ltr">To:     PICCORO McKAY Lenz <<a
                  ymailto="mailto:mckaygerhard@gmail.com"
                  href="mailto:mckaygerhard@gmail.com"
                  moz-do-not-send="true">mckaygerhard@gmail.com</a>><br>
              </div>
              <div dir="ltr"><br>
              </div>
              <div dir="ltr"><br>
              </div>
              <div dir="ltr"><br>
              </div>
              <div dir="ltr">In modern serial communications, there is
                almost no use for CTS, DCD, <br>
              </div>
              <div dir="ltr">DSR, DTR,RNG, RTS, all of it at the driver
                level.  The driver handles <br>
              </div>
              <div dir="ltr">all handshaking and flow control.  Further,
                your serial port reads and <br>
              </div>
              <div dir="ltr">writes are not made directly to the serial
                port but to buffers in the <br>
              </div>
              <div dir="ltr">driver.<br>
              </div>
              <div dir="ltr"><br>
              </div>
              <div dir="ltr">You must remember that serial port
                communications are slow. That's the <br>
              </div>
              <div dir="ltr">reason you have missing or leftover data.
                The sequence is something like:<br>
              </div>
              <div dir="ltr"><br>
              </div>
              <div dir="ltr">1) Printer starts to send a line of data<br>
              </div>
              <div dir="ltr">2) Driver receives a byte, raises a read
                event<br>
              </div>
              <div dir="ltr">3) Your programs responds, likely before
                the end of the line, reading <br>
              </div>
              <div dir="ltr">what's currently in the driver's buffer.<br>
              </div>
              <div dir="ltr">4) Printer finishes sending the rest of the
                line, triggering more read <br>
              </div>
              <div dir="ltr">events.<br>
              </div>
              <div dir="ltr"><br>
              </div>
              <div dir="ltr">Serial communications tend to be
                packet-based so your low level read <br>
              </div>
              <div dir="ltr">routine should read an entire packet before
                raising a dataavailable event:<br>
              </div>
              <div dir="ltr"><br>
              </div>
              <div dir="ltr">If each received byte is independent, say a
                instrument reading, raise a <br>
              </div>
              <div dir="ltr">dataavailable event for every byte.<br>
              </div>
              <div dir="ltr"><br>
              </div>
              <div dir="ltr">If a packet is fixed-length, raise the
                event every packet-length bytes.  <br>
              </div>
              <div dir="ltr">Fixed-length packets frequently have sync
                bytes between packets.  These <br>
              </div>
              <div dir="ltr">should be ignored.  Decide how to handle
                partial packets.<br>
              </div>
              <div dir="ltr"><br>
              </div>
              <div dir="ltr">Variable length packets have to be handled
                according to their <br>
              </div>
              <div dir="ltr">structure.  Some will be packet followed by
                an end of packet marker.  <br>
              </div>
              <div dir="ltr">Raise the dataavailable event when your
                program encounters the marker.<br>
              </div>
              <div dir="ltr"><br>
              </div>
              <div dir="ltr">Other variable-length packets will inclu<br>
              </div>
              <div dir="ltr"><br>
              </div>
              <div dir="ltr"><br>
              </div>
              <div dir="ltr">On 2018-08-06 05:10 PM, PICCORO McKAY Lenz
                wrote:<br>
              </div>
              <div dir="ltr">> um ok make sense that if there's
                already a event handler why use the <br>
              </div>
              <div dir="ltr">> manual reading..<br>
              </div>
              <div dir="ltr">><br>
              </div>
              <div dir="ltr">> the problem its that sometimes i made
                manual reading an get extra data <br>
              </div>
              <div dir="ltr">> that are not in the event handler (yep
                sound quite strange) due i'm <br>
              </div>
              <div dir="ltr">> managing a fiscal kit printer device<br>
              </div>
              <div dir="ltr">><br>
              </div>
              <div dir="ltr">> i'll try to use your semaphore, but
                there's another way maybe using <br>
              </div>
              <div dir="ltr">> the_CTSChange <br>
              </div>
              <div dir="ltr">> <<a
                  href="http://gambaswiki.org/wiki/comp/gb.net/serialport/.ctschange"
                  target="_blank" moz-do-not-send="true">http://gambaswiki.org/wiki/comp/gb.net/serialport/.ctschange</a>>_<br>
              </div>
              <div dir="ltr">> _DCDChange <br>
              </div>
              <div dir="ltr">> <<a
                  href="http://gambaswiki.org/wiki/comp/gb.net/serialport/.dcdchange"
                  target="_blank" moz-do-not-send="true">http://gambaswiki.org/wiki/comp/gb.net/serialport/.dcdchange</a>>_
                <br>
              </div>
              <div dir="ltr">> _DSRChange <br>
              </div>
              <div dir="ltr">> <<a
                  href="http://gambaswiki.org/wiki/comp/gb.net/serialport/.dsrchange"
                  target="_blank" moz-do-not-send="true">http://gambaswiki.org/wiki/comp/gb.net/serialport/.dsrchange</a>>_
                <br>
              </div>
              <div dir="ltr">> _DTRChange <br>
              </div>
              <div dir="ltr">> <<a
                  href="http://gambaswiki.org/wiki/comp/gb.net/serialport/.dtrchange"
                  target="_blank" moz-do-not-send="true">http://gambaswiki.org/wiki/comp/gb.net/serialport/.dtrchange</a>>_
                <br>
              </div>
              <div dir="ltr">> _RNGChange <br>
              </div>
              <div dir="ltr">> <<a
                  href="http://gambaswiki.org/wiki/comp/gb.net/serialport/.rngchange"
                  target="_blank" moz-do-not-send="true">http://gambaswiki.org/wiki/comp/gb.net/serialport/.rngchange</a>>_
                <br>
              </div>
              <div dir="ltr">> _RTSChange <br>
              </div>
              <div dir="ltr">> <<a
                  href="http://gambaswiki.org/wiki/comp/gb.net/serialport/.rtschange"
                  target="_blank" moz-do-not-send="true">http://gambaswiki.org/wiki/comp/gb.net/serialport/.rtschange</a>>_<br>
              </div>
              <div dir="ltr">> ??<br>
              </div>
              <div dir="ltr">><br>
              </div>
              <div dir="ltr">> Lenz McKAY Gerardo (PICCORO)<br>
              </div>
              <div dir="ltr">> <a
                  href="http://qgqlochekone.blogspot.com"
                  target="_blank" moz-do-not-send="true">http://qgqlochekone.blogspot.com</a><br>
              </div>
              <div dir="ltr">><br>
              </div>
              <div dir="ltr">><br>
              </div>
              <div dir="ltr">> El lun., 6 de ago. de 2018 a la(s)
                13:41, T Lee Davidson <br>
              </div>
              <div dir="ltr">> (<a
                  ymailto="mailto:t.lee.davidson@gmail.com"
                  href="mailto:t.lee.davidson@gmail.com"
                  moz-do-not-send="true">t.lee.davidson@gmail.com</a>
                <mailto:<a ymailto="mailto:t.lee.davidson@gmail.com"
                  href="mailto:t.lee.davidson@gmail.com"
                  moz-do-not-send="true">t.lee.davidson@gmail.com</a>>)
                escribió:<br>
              </div>
              <div dir="ltr">><br>
              </div>
              <div dir="ltr">>    You will have problems if you try
                to utilize both an event<br>
              </div>
              <div dir="ltr">>    triggered serial port read and a
                manual read.<br>
              </div>
              <div dir="ltr">><br>
              </div>
              <div dir="ltr">>    The SerialPort.Read event is
                triggered when there is data<br>
              </div>
              <div dir="ltr">>    available to be read. If you read
                that data in the event handler, the<br>
              </div>
              <div dir="ltr">>    port is cleared and there will be
                no data available to a manual read.<br>
              </div>
              <div dir="ltr">><br>
              </div>
              <div dir="ltr">>    If you want to manually read the
                port, then you should not read<br>
              </div>
              <div dir="ltr">>    the data from it in the
                SerialPort.Read event handler. Perhaps<br>
              </div>
              <div dir="ltr">>    you do not even need to implement
                that event handler.<br>
              </div>
              <div dir="ltr">><br>
              </div>
              <div dir="ltr">>    I could be incorrect since I
                haven't verified this. But, it seems<br>
              </div>
              <div dir="ltr">>    logical to me that Stream.Blocking
                would be False by default<br>
              </div>
              <div dir="ltr">>    otherwise an attempt to read the
                port would hang the application<br>
              </div>
              <div dir="ltr">>    until data is available and that
                should not be a default behavior.<br>
              </div>
              <div dir="ltr">><br>
              </div>
              <div dir="ltr">>    I can think of two ways to
                implement manual reading.<br>
              </div>
              <div dir="ltr">><br>
              </div>
              <div dir="ltr">>    1. Do not implement a
                SerialPort.Read event handler, ensure that<br>
              </div>
              <div dir="ltr">>    Stream.Blocking = False, and simply
                read the port manually<br>
              </div>
              <div dir="ltr">>    understanding that there may be no
                data available. In this case<br>
              </div>
              <div dir="ltr">>    READ would appear to do nothing,
                but the application would not hang.<br>
              </div>
              <div dir="ltr">><br>
              </div>
              <div dir="ltr">>    2. Use the SerialPort.Read event
                handler to set a flag indicating<br>
              </div>
              <div dir="ltr">>    that data is available and read
                that flag in your Sub rp()<br>
              </div>
              <div dir="ltr">>    function. For example:<br>
              </div>
              <div dir="ltr">><br>
              </div>
              <div dir="ltr">>    Private PortDataAvailable As
                Boolean<br>
              </div>
              <div dir="ltr">><br>
              </div>
              <div dir="ltr">>    Public Sub SComm_Read()<br>
              </div>
              <div dir="ltr">>            PortDataAvailable = True<br>
              </div>
              <div dir="ltr">>    End<br>
              </div>
              <div dir="ltr">><br>
              </div>
              <div dir="ltr">>    Public Sub rp()<br>
              </div>
              <div dir="ltr">>            If myDataAvailableBoolean
                then<br>
              </div>
              <div dir="ltr">>                    ' Do the port
                reading stuff<br>
              </div>
              <div dir="ltr">>                    ' Read port blah
                blah blah<br>
              </div>
              <div dir="ltr">>                    ' All data has been
                read<br>
              </div>
              <div dir="ltr">>                    PortDataAvailable =
                False<br>
              </div>
              <div dir="ltr">>            Else<br>
              </div>
              <div dir="ltr">>                    Print "No data
                available"<br>
              </div>
              <div dir="ltr">>                    Return<br>
              </div>
              <div dir="ltr">>            Endif<br>
              </div>
              <div dir="ltr">>    End<br>
              </div>
              <div dir="ltr">><br>
              </div>
              <div dir="ltr">><br>
              </div>
              <div dir="ltr">>    ___<br>
              </div>
              <div dir="ltr">>    Lee<br>
              </div>
              <div dir="ltr">><br>
              </div>
              <div dir="ltr">><br>
              </div>
              <div dir="ltr">>    On 08/06/2018 12:05 PM, PICCORO
                McKAY Lenz wrote:<br>
              </div>
              <div dir="ltr">>    > OK hans, and tobias, yes the
                code in my first mail last week was<br>
              </div>
              <div dir="ltr">>    bad,<br>
              </div>
              <div dir="ltr">>    > now i understant some problems
                when i read agains the printert<br>
              </div>
              <div dir="ltr">>    > but i need and i want a manual
                read funtion "also": so i have now:<br>
              </div>
              <div dir="ltr">>    ><br>
              </div>
              <div dir="ltr">>    > the read event for the port,
                as documents suggest "is triggered"<br>
              </div>
              <div dir="ltr">>    > when data "can be read" so if
                there's some data to read or available<br>
              </div>
              <div dir="ltr">>    > the event will be executed by
                itselft, but i want also a manual<br>
              </div>
              <div dir="ltr">>    "rp" method<br>
              </div>
              <div dir="ltr">>    > that read also the port
                manually, at this point i dont know<br>
              </div>
              <div dir="ltr">>    > if will be sync or async, i
                have a "sale" class that will be<br>
              </div>
              <div dir="ltr">>    polled into a form,<br>
              </div>
              <div dir="ltr">>    > but as Tobias said i used the
                Scom_Read<br>
              </div>
              <div dir="ltr">>    > but still need a manual read
                funtion due the inherits so i have :<br>
              </div>
              <div dir="ltr">>    ><br>
              </div>
              <div dir="ltr">>    > 1) the read event:<br>
              </div>
              <div dir="ltr">>    ><br>
              </div>
              <div dir="ltr">>    > ' this event will be triggered
                in read operations by the stream<br>
              </div>
              <div dir="ltr">>    when data its available<br>
              </div>
              <div dir="ltr">>    > Public Sub SComm_Read()<br>
              </div>
              <div dir="ltr">>    >    dim buffers as string = ''<br>
              </div>
              <div dir="ltr">>    >   Read #SComm, buffers,
                Lof(SComm)<br>
              </div>
              <div dir="ltr">>    >    dataread &= buffers<br>
              </div>
              <div dir="ltr">>    > End<br>
              </div>
              <div dir="ltr">>    ><br>
              </div>
              <div dir="ltr">>    > 2) here, how can i code a read
                manual operation do not conflict<br>
              </div>
              <div dir="ltr">>    if there's already an operation
                triggered by teh read event?<br>
              </div>
              <div dir="ltr">>    ><br>
              </div>
              <div dir="ltr">>    > i used some code proposed by
                Tobias but:<br>
              </div>
              <div dir="ltr">>    ><br>
              </div>
              <div dir="ltr">>    > '' generic read port buffer
                data<br>
              </div>
              <div dir="ltr">>    > Public Sub rp()<br>
              </div>
              <div dir="ltr">>    >    dim  start as date = Now<br>
              </div>
              <div dir="ltr">>    >    dim buffers as string = ''<br>
              </div>
              <div dir="ltr">>    >   Do<br>
              </div>
              <div dir="ltr">>    >     Wait 0.1<br>
              </div>
              <div dir="ltr">>    >     Read #SComm, buffers,
                Lof(SComm)<br>
              </div>
              <div dir="ltr">>    >     dataread &= buffers<br>
              </div>
              <div dir="ltr">>    >   Loop Until DateDiff(start,
                Now, gb.Millisecond) > 500<br>
              </div>
              <div dir="ltr">>    > End<br>
              </div>
              <div dir="ltr">>    ><br>
              </div>
              <div dir="ltr">>    > now i have the problem of
                locking, as Tobias said I not even<br>
              </div>
              <div dir="ltr">>    sure how Read<br>
              </div>
              <div dir="ltr">>    > behaves when Lof is zero or if
                the read are just triggered at<br>
              </div>
              <div dir="ltr">>    same time the rp was invoqued!<br>
              </div>
              <div dir="ltr">>    > so then reading would block.<br>
              </div>
              <div dir="ltr">>    ><br>
              </div>
              <div dir="ltr">>    > i dont know how to use the
                SComm.Blocking = False to make manual<br>
              </div>
              <div dir="ltr">>    polling,<br>
              </div>
              <div dir="ltr">>    ><br>
              </div>
              <div dir="ltr">>    ><br>
              </div>
              <div dir="ltr">>    > Lenz McKAY Gerardo (PICCORO)<br>
              </div>
              <div dir="ltr">>    > <a
                  href="http://qgqlochekone.blogspot.com"
                  target="_blank" moz-do-not-send="true">http://qgqlochekone.blogspot.com</a><br>
              </div>
              <div dir="ltr">>    ><br>
              </div>
              <div dir="ltr">>    ><br>
              </div>
              <div dir="ltr">>    > El lun., 6 de ago. de 2018 a
                la(s) 09:59, PICCORO McKAY Lenz<br>
              </div>
              <div dir="ltr">>    (<a
                  ymailto="mailto:mckaygerhard@gmail.com"
                  href="mailto:mckaygerhard@gmail.com"
                  moz-do-not-send="true">mckaygerhard@gmail.com</a>
                <mailto:<a ymailto="mailto:mckaygerhard@gmail.com"
                  href="mailto:mckaygerhard@gmail.com"
                  moz-do-not-send="true">mckaygerhard@gmail.com</a>><br>
              </div>
              <div dir="ltr">>    <mailto:<a
                  ymailto="mailto:mckaygerhard@gmail.com"
                  href="mailto:mckaygerhard@gmail.com"
                  moz-do-not-send="true">mckaygerhard@gmail.com</a>
                <mailto:<a ymailto="mailto:mckaygerhard@gmail.com"
                  href="mailto:mckaygerhard@gmail.com"
                  moz-do-not-send="true">mckaygerhard@gmail.com</a>>>)<br>
              </div>
              <div dir="ltr">>    escribió:<br>
              </div>
              <div dir="ltr">>    ><br>
              </div>
              <div dir="ltr">>    >     El lun., 6 de ago. de 2018
                a la(s) 09:52, Hans Lehmann<br>
              </div>
              <div dir="ltr">>    (<a
                  ymailto="mailto:hans@gambas-buch.de"
                  href="mailto:hans@gambas-buch.de"
                  moz-do-not-send="true">hans@gambas-buch.de</a>
                <mailto:<a ymailto="mailto:hans@gambas-buch.de"
                  href="mailto:hans@gambas-buch.de"
                  moz-do-not-send="true">hans@gambas-buch.de</a>><br>
              </div>
              <div dir="ltr">>    <mailto:<a
                  ymailto="mailto:hans@gambas-buch.de"
                  href="mailto:hans@gambas-buch.de"
                  moz-do-not-send="true">hans@gambas-buch.de</a>
                <mailto:<a ymailto="mailto:hans@gambas-buch.de"
                  href="mailto:hans@gambas-buch.de"
                  moz-do-not-send="true">hans@gambas-buch.de</a>>>)
                escribió:<br>
              </div>
              <div dir="ltr">>    ><br>
              </div>
              <div dir="ltr">>    >         have a look at the
                chapters and the projects... under<br>
              </div>
              <div dir="ltr">>   
                <a class="moz-txt-link-freetext" href="https://www.gambas-buch.de/doku.php?id=k24:k24.1:k24.1.5:start">https://www.gambas-buch.de/doku.php?id=k24:k24.1:k24.1.5:start</a>!<br>
              </div>
              <div dir="ltr">>    ><br>
              </div>
              <div dir="ltr">>    >     THANKS HANS! now
                reading...<br>
              </div>
              <div dir="ltr">>    >      isend this mail to the
                list.. maybe you send too quickly<br>
              </div>
              <div dir="ltr">>    and forgett to do!<br>
              </div>
              <div dir="ltr">>    ><br>
              </div>
              <div dir="ltr">>    ><br>
              </div>
              <div dir="ltr">>    ><br>
              </div>
              <div dir="ltr">>    ><br>
              </div>
              <div dir="ltr">>    ><br>
              </div>
              <div dir="ltr">>    > ----[ Gambas mailing-list is
                hosted by<br>
              </div>
              <div dir="ltr">>    <a
                  href="https://www.hostsharing.net%20" target="_blank"
                  moz-do-not-send="true">https://www.hostsharing.net </a>]----<br>
              </div>
              <div dir="ltr">>    ><br>
              </div>
              <div dir="ltr">><br>
              </div>
              <div dir="ltr">>    ----[ Gambas mailing-list is hosted
                by <a href="https://www.hostsharing.net"
                  target="_blank" moz-do-not-send="true">https://www.hostsharing.net</a><br>
              </div>
              <div dir="ltr">>    ]----<br>
              </div>
              <div dir="ltr">><br>
              </div>
              <div dir="ltr">><br>
              </div>
              <div dir="ltr">><br>
              </div>
              <div dir="ltr">> ----[ Gambas mailing-list is hosted
                byhttps://www.hostsharing.net  ]----<br>
              </div>
              <div dir="ltr"><br>
              </div>
              <div dir="ltr"><br>
              </div>
              <div dir="ltr"><br>
              </div>
              <div dir="ltr">----[ Gambas mailing-list is hosted by <a
                  href="https://www.hostsharing.net%20" target="_blank"
                  moz-do-not-send="true">https://www.hostsharing.net </a>]----<br>
              </div>
            </div>
          </div>
        </div>
      </div>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <br>
      <pre wrap="">
----[ Gambas mailing-list is hosted by <a class="moz-txt-link-freetext" href="https://www.hostsharing.net">https://www.hostsharing.net</a> ]----
</pre>
    </blockquote>
    <br>
  </body>
</html>