Description
I'm running into a bizarre issue with this serial port library that I also saw in a Rust based library, maybe you can help!
I'm implemented the following test program, which just writes a command to a little Arduino I have connected over USB:
3 import serial, streams
4
5 proc main() =
6 let port = newSerialStream("/dev/ttyUSB0"
7 , 115200
8 , Parity.None
9 , 8
10 , StopBits.One
11 , Handshake.RequestToSend
12 , buffered=false
13 )
14
15 defer: close(port)
16
17 port.setTimeouts(1000,100)
18
19 # for i in 0..3:
20 # echo "tryna read"
21 # echo port.readline()
22 port.write("volume up\n")
23 port.flush()
24
25
26 when isMainModule:
27 main()
What's strange is that the Arduino receives the data immediately (evidenced by the RX LED flashing), but does not act on it until I force the program to halt. It does not halt unless I send it SIGINT (Control-C); so it appears to be hung up on closing the serial port?
This may be related to a strange RTS/CTS related issue I was seeing on my scope, where the sending party (my computer) would hold the RTS line, most likely triggering an interrupt and preventing the Arduino from processing the command until the port was forcibly closed/flushed by the OS.
Let me know if you have any suggestions, I'm all ears! So far all I've done is try all of the handshakes, and what it looks like is:
None: data is received by Arduino but it does not act on it; program terminates normally
RTS: data is received by Arduino and it does act on it but not until program is forcibly killed
XOnXOff: same as RTS
RTSXOnXOff: same as RTS
The timeouts are generous enough, as this whole transaction takes <10ms on my scope.