[Gambas-bugtracker] Bug #1956: Feature Request: Flush Buffer Function for Serial Ports (gb.net)

bugtracker at gambaswiki.org bugtracker at gambaswiki.org
Sun Nov 8 20:00:50 CET 2020


http://gambaswiki.org/bugtracker/edit?object=BUG.1956&from=L21haW4-

Claus DIETRICH reported a new bug.

Summary
-------

Feature Request: Flush Buffer Function for Serial Ports (gb.net)

Type             : Request
Priority         : Medium
Gambas version   : 3.15
Product          : Development Environment


Description
-----------

Hi

While writing a comprehensive application, which uses serial ports, I came across following issue:

Once any data have been written to a serial port in hardware handshake mode and the handshake remained unsuccessful, the application hangs up to 30s when trying to close it. A closer review of this behaviour brought up a number of observations/issues around the SerialPort class:

1.	The delayed closing of the app only occurs, if data have been written to the transmit buffer. Once data have been written to the buffer and were not sent by whatever reason (program abort or unsuccessful hardware handshake), they even survive a program restart! This could be confirmed with the OutputBufferSize - property after program restart.

2.	The delayed closing of the app is caused by the Kernel and happens, when data are stuck in the output buffer i.e. cause by missing CTS or aborted application. This could be confirmed by installing setserial and issuing this CLI command: sudo setserial /dev/ttyS0 closing_wait none
After this command the app was always closing immediately. 

3.	After I added the Begin- and Send method I noted, that the drop method only works, before having used the Send-method. So this command relates to a different buffer and doesn‘t provide a solution to flush the transmit buffer.

4.	Other than in other languages there is no event for an unsuccessful RTS/CTS handshake timeout. This is a pity, but such function can be replicated by a self built Gambas class with acceptable effort if needed.

Conclusion:
Other than in other languages like Python or Visual Basic there is no option in Gambas, which allows to empty the transmit buffer in order to stop transmissions immediately and to remove stuck data. This is typically achieved by a so-called Flush function.

Proposal/ Feature Request:
I propose to implement a Flush-method for the SerialPort-class in order to be able to

a) stop any ongoing transmission immediately

b) empty the transmit buffer in order to prevent the app from hanging during the closing process.

c) overcome a potential security issue since data in the transmit buffer even survive a program restart after an unsuccessful hardware handshake or a program abort.

d) immediately delete data in the transmit buffer after an unsuccessful hardware handshake timeout.

I have no clue about C but found the TCFLSH in ioctl which might do the job. It might be a good idea to use this opportunity to implement an input buffer flush as well, since it takes time to empty the buffer by just reading it at the used baudrate.

A small demo app has been attached.


System information
------------------

[System]
Gambas=3.15.2
OperatingSystem=Linux
Kernel=5.4.0-52-generic
Architecture=x86_64
Distribution=Linux Mint 19.3 Tricia
Desktop=MATE
Theme=qt5ctproxy
Language=de_DE.UTF-8
Memory=7837M

[Libraries]
Cairo=libcairo.so.2.11510.0
Curl=libcurl.so.4.5.0
DBus=libdbus-1.so.3.19.4
GDK2=libgdk-x11-2.0.so.0.2400.32
GDK3=libgdk-3.so.0.2200.30
GStreamer=libgstreamer-1.0.so.0.1405.0
GTK+2=libgtk-x11-2.0.so.0.2400.32
GTK+3=libgtk-3.so.0.2200.30
OpenGL=libGL.so.1.0.0
Poppler=libpoppler.so.73.0.0
Poppler=libpoppler.so.85.0.0
Poppler=libpoppler.so.90.0.0
QT4=libQtCore.so.4.8.7
QT5=libQt5Core.so.5.9.5
SDL=libSDL-1.2.so.0.11.4
SQLite=libsqlite3.so.0.8.6

[Environment]
CLUTTER_BACKEND=x11
COMPIZ_CONFIG_PROFILE=mate
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
DEFAULTS_PATH=/usr/share/gconf/mate.default.path
DESKTOP_SESSION=mate
DISPLAY=:0
GB_GUI=gb.qt5
GDMSESSION=mate
GDM_LANG=de_DE
GPG_AGENT_INFO=/run/user/1000/gnupg/S.gpg-agent:0:1
GTK_MODULES=gail:atk-bridge
GTK_OVERLAY_SCROLLING=0
HOME=<home>
LANG=de_DE.UTF-8
LANGUAGE=de_DE.UTF-8
LC_ADDRESS=de_DE.UTF-8
LC_ALL=de_DE.UTF-8
LC_IDENTIFICATION=de_DE.UTF-8
LC_MEASUREMENT=de_DE.UTF-8
LC_MONETARY=de_DE.UTF-8
LC_NAME=de_DE.UTF-8
LC_NUMERIC=de_DE.UTF-8
LC_PAPER=de_DE.UTF-8
LC_TELEPHONE=de_DE.UTF-8
LC_TIME=de_DE.UTF-8
LOGNAME=<user>
MANDATORY_PATH=/usr/share/gconf/mate.mandatory.path
MATE_DESKTOP_SESSION_ID=this-is-deprecated
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
PWD=<home>
QT_ACCESSIBILITY=1
QT_AUTO_SCREEN_SCALE_FACTOR=0
QT_LOGGING_RULES=*.debug=false
QT_QPA_PLATFORMTHEME=qt5ct
QT_SCALE_FACTOR=1
SESSION_MANAGER=local/<hostname>:@/tmp/.ICE-unix/974,unix/<hostname>:/tmp/.ICE-unix/974
SHELL=/bin/bash
SHLVL=0
SSH_AGENT_PID=1300
SSH_AUTH_SOCK=/run/user/1000/keyring/ssh
TZ=:/etc/localtime
USER=<user>
XAUTHORITY=<home>/.Xauthority
XDG_CONFIG_DIRS=/etc/xdg/xdg-mate:/etc/xdg
XDG_CURRENT_DESKTOP=MATE
XDG_DATA_DIRS=/usr/share/mate:<home>/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share
XDG_GREETER_DATA_DIR=/var/lib/lightdm-data/<user>
XDG_RUNTIME_DIR=/run/user/1000
XDG_SEAT=seat0
XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0
XDG_SESSION_DESKTOP=mate
XDG_SESSION_ID=c1
XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session0
XDG_SESSION_TYPE=x11
XDG_VTNR=7




More information about the Bugtracker mailing list