|Title:||Avoid double-open of serial ports on Windows|
|Submitter:||ferrieux||Created on:||2008-12-10 10:26:48|
|Subsystem:||27. Channel Types||Assigned To:||oehhar|
|Status:||Closed||Last Modified:||2014-02-25 17:12:06|
|Closed on:||2014-02-25 17:12:06|
Currently, opening a serial port on Windows involves a double-open: (1) open generically (2) check the handle for serialness (3) reopen with OVERLAPPED flag if serial. This causes trouble in some setups where the open/close (and its timing) is not transparent to the underlying driver, like bluetooth RFCOMM profile. See http://groups.google.fr/group/comp.lang.tcl/tree/browse_frm/thread/9f2f29db7b5864fd/fd6d04dbc15d8575?rnum=1&_done=%2Fgroup%2Fcomp.lang.tcl%2Fbrowse_frm%2Fthread%2F9f2f29db7b5864fd%2Fdd17ccbb0019ed90%3F#doc_fd6d04dbc15d8575 for a concrete example. A simple and efficient solution is to use a "name hint" to detect COM ports by their filename instead of resorting to a syscall to detect serialness after the fact. Rolf Shroedter has suggested that at least the two following patterns should be detected: COM[0-9]:? \\.\COM[0-9]+:? It also turns out that the first one should be applied to the [file tail], since \foo\bar\COM4 is also a valid serial port reference in Windows. However, we believe that a good strategy should be to make only a reasonable effort in that direction, leaving tricky cases handled by the current behavior; this in order not to spoil the performance of [open] for non-serials. A patch will be uploaded shortly to support just the above two patterns.
oehhar added on 2014-02-25 17:12:06:
Merged to core-8-5-branch [b6459ef66c] and to trunk [eb0919a1ec].
Phil Hoffman tested succesfully with the attached script.
Bug closed, thank you all,
oehhar added on 2014-02-18 19:55:32:
Thank you, Donal, for the comment.
I was ready to commit today, but have test failures. I have to check, if they are due to the patch or not... Sorry, will take a week (I am on travel).
dkf added on 2014-02-15 15:12:21:
Should we add any tests? Should we add any docs? (With these settled, I see no reason to not commit.)
oehhar added on 2014-02-14 07:59:55:
Action by Phil Hoffman:
oehhar added on 2014-01-30 11:04:54:
Patch applied for tcl 8.5 in branch [84307fe13f]
ferrieux added on 2008-12-11 21:45:40:
File Added - 304912: no_double_serial_open.patch File Added: no_double_serial_open.patch
schroedter added on 2008-12-11 21:42:32:
The following patch performes a "name hint" to detect native Windows serial port name by one of the following patterns (case-insensitive). Pattern matching is checked quite restrictive, because *all open-filenames* need to pass this test. COM[1-9]:? \\.\COM[0-9]+ //./COM[0-9]+ For all filenames not matching the patterns above, the original behavior open-close-reopen is preserved, thus supporting (virtual) comports of any other name: 1. Open channel with NON-OVERLAPPED flag 2. Detect serial port by checking GetCommState() result 3. Reopen the serial port with OVERLAPPED flag This behavior can be enforced even for native Windows serial ports e.g. with [open /com1 r+]