From 2dbf9a9fce36b62cc440f2197f8570e587fe3860 Mon Sep 17 00:00:00 2001 From: Euan Torano Date: Mon, 28 Mar 2022 20:12:23 +0100 Subject: [PATCH 1/4] Ref #46 - altered `flush()` for posx to use tcdrain rather than tcflush --- src/serial/private/serialport/serialport_posix.nim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/serial/private/serialport/serialport_posix.nim b/src/serial/private/serialport/serialport_posix.nim index 4877ceb..fa94937 100644 --- a/src/serial/private/serialport/serialport_posix.nim +++ b/src/serial/private/serialport/serialport_posix.nim @@ -834,7 +834,7 @@ proc flush*(port: SerialPort | AsyncSerialPort) = if not port.isOpen(): raise newException(InvalidSerialPortStateError, "Port must be open in order to be flushed") - if tcflush(cint(port.handle), TCIOFLUSH) == -1: + if tcdrain(cint(port.handle)) == -1: raiseOSError(osLastError()) proc close*(port: SerialPort | AsyncSerialPort) = From e3e4634d60a43b42e27a27fb8b5ed957694b4b38 Mon Sep 17 00:00:00 2001 From: Euan Torano Date: Mon, 28 Mar 2022 20:24:45 +0100 Subject: [PATCH 2/4] Copied some other flags from pyserial --- src/serial/private/serialport/serialport_posix.nim | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/serial/private/serialport/serialport_posix.nim b/src/serial/private/serialport/serialport_posix.nim index fa94937..38fb595 100644 --- a/src/serial/private/serialport/serialport_posix.nim +++ b/src/serial/private/serialport/serialport_posix.nim @@ -594,9 +594,9 @@ proc initPort(port: SerialPort | AsyncSerialPort, tempHandle: cint, baudRate: in setSpeed(addr settings, baudRate) settings.c_cflag = settings.c_cflag or (CLOCAL or CREAD) - settings.c_lflag = settings.c_lflag and (not (ICANON or ECHO or ECHOE or ISIG)) - settings.c_oflag = settings.c_oflag and (not OPOST) - settings.c_iflag = settings.c_iflag and (not (INLCR or IGNCR or ICRNL)) + settings.c_lflag = settings.c_lflag and (not (ICANON or ECHO or ECHOE or ECHOK or ECHONL or ISIG or IEXTEN)) + settings.c_oflag = settings.c_oflag and (not (OPOST or ONLCR or OCRNL)) + settings.c_iflag = settings.c_iflag and (not (INLCR or IGNCR or ICRNL or IGNBRK or IUCLC or PARMRK)) setParity(settings, parity) setDataBits(settings, dataBits) From fc34728076c808fdc76e4681c02a9abeeb5ed231 Mon Sep 17 00:00:00 2001 From: Euan Torano Date: Mon, 28 Mar 2022 20:42:27 +0100 Subject: [PATCH 3/4] Removed unknown flag which prevented compilation on macOS. Need to investigate the best way to check if these flags are defined... --- src/serial/private/serialport/serialport_common.nim | 8 ++++---- src/serial/private/serialport/serialport_posix.nim | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/serial/private/serialport/serialport_common.nim b/src/serial/private/serialport/serialport_common.nim index 1cd9e8e..f3ddbc6 100644 --- a/src/serial/private/serialport/serialport_common.nim +++ b/src/serial/private/serialport/serialport_common.nim @@ -27,17 +27,17 @@ type Two = 2, OnePointFive = 3 - InvalidSerialPortError* = object of Exception + InvalidSerialPortError* = object of ValueError TimeoutError* = object of IOError InvalidSerialPortStateError* = object of IOError - InvalidBaudRateError* = object of Exception + InvalidBaudRateError* = object of ValueError - InvalidDataBitsError* = object of Exception + InvalidDataBitsError* = object of ValueError - InvalidStopBitsError* = object of Exception + InvalidStopBitsError* = object of ValueError ReceivedError* {.pure.} = enum ## Types of error detected by the operating system whilst reading from/writing to a serial port. diff --git a/src/serial/private/serialport/serialport_posix.nim b/src/serial/private/serialport/serialport_posix.nim index 38fb595..4ed235f 100644 --- a/src/serial/private/serialport/serialport_posix.nim +++ b/src/serial/private/serialport/serialport_posix.nim @@ -596,7 +596,7 @@ proc initPort(port: SerialPort | AsyncSerialPort, tempHandle: cint, baudRate: in settings.c_cflag = settings.c_cflag or (CLOCAL or CREAD) settings.c_lflag = settings.c_lflag and (not (ICANON or ECHO or ECHOE or ECHOK or ECHONL or ISIG or IEXTEN)) settings.c_oflag = settings.c_oflag and (not (OPOST or ONLCR or OCRNL)) - settings.c_iflag = settings.c_iflag and (not (INLCR or IGNCR or ICRNL or IGNBRK or IUCLC or PARMRK)) + settings.c_iflag = settings.c_iflag and (not (INLCR or IGNCR or ICRNL or IGNBRK or PARMRK)) setParity(settings, parity) setDataBits(settings, dataBits) From a25637daec680b1c91f70b3d456b3f4b0251735c Mon Sep 17 00:00:00 2001 From: Euan Torano Date: Mon, 28 Mar 2022 20:44:26 +0100 Subject: [PATCH 4/4] Fixed warnings about error types and implicit conversion to cstring from non-const location --- src/serial/private/serialport/serialport_posix.nim | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/serial/private/serialport/serialport_posix.nim b/src/serial/private/serialport/serialport_posix.nim index 4ed235f..e32cad4 100644 --- a/src/serial/private/serialport/serialport_posix.nim +++ b/src/serial/private/serialport/serialport_posix.nim @@ -637,7 +637,9 @@ proc open*(port: SerialPort, baudRate: int32, parity: Parity, dataBits: byte, st if port.isOpen(): raise newException(InvalidSerialPortStateError, "Serial port is already open.") - let tempHandle = posix.open(port.name, O_RDWR or O_NOCTTY or O_NONBLOCK) + let portName = cstring(port.name) + + let tempHandle = posix.open(portName, O_RDWR or O_NOCTTY or O_NONBLOCK) if tempHandle == -1: raiseOSError(osLastError()) @@ -655,7 +657,9 @@ proc open*(port: AsyncSerialPort, baudRate: int32, parity: Parity, dataBits: byt if port.isOpen(): raise newException(InvalidSerialPortStateError, "Serial port is already open.") - let tempHandle = posix.open(port.name, O_RDWR or O_NOCTTY) + let portName = cstring(port.name) + + let tempHandle = posix.open(portName, O_RDWR or O_NOCTTY) if tempHandle == -1: raiseOSError(osLastError())