serial port observation ... the last call ...
[1/5] from: petr::krenzelok::trz::cz at: 28-Jun-2002 12:43
Hi, I am trying once again to find some answer regarding serial port functionality in rebol: Could anyone help me to reverse the following logic? It is info taken from docs for Serial port, but it comes from 2.3 Core transition phase, which was later switched back to blocking-ports-by default: Serial ports are always opened as direct ports in much the same way as console and network ports. They may be opened as either /STRING or /BINARY with the default being /STRING. They are opened by default as asynchronous, but may be made synchronous by using the /WAIT refinement. When operating asynchronously, any attempts to copy data from the port will return NONE if no data is present. When operating synchronously, the copy will block until data is available. A timeout value can be specified by modifying the timeout field in the port structure. The timeout value only applies to serial ports that are opened with the /wait refinement. When the timeout expires, a serial port timeout error will be generated. To set the timeout value do: ser-port/timeout: 10 ; 10 second timeout Qs: - is serial port being opened by default in /Direct mode? - is it opened in /STRING mode and if so, does rebol do any special char (newline, tab) conversions here? - is it blocking by default, so I have to use /no-wait to get async behavior? - is timeout taken in account in default (blocking) mode? I have following problem: I try to dynamically scan serial ports, and don't know what setting to use best. So I tried to use following technique, but am not sure, if Rebol behavior is consistent and the way it should be: ser: open serial://port1/19200/8/none/1 ser/timeout: 5 update ser insert ser "1" Console hangs forever - no timeout applies. I have no defice connected to COM1, maybe motherboard uses it somehow, but anyway - should it block that way? I use small and hande PortMon utility and here is the output ... 0.00005448 rebol-link.exe IOCTL_SERIAL_SET_BAUD_RATE Serial0 SUCCESS Rate: 19200 0.00000754 rebol-link.exe IOCTL_SERIAL_SET_DTR Serial0 SUCCESS 0.00000587 rebol-link.exe IOCTL_SERIAL_SET_LINE_CONTROL Serial0 SUCCESS StopBits: 1 Parity: NONE WordLength: 8 0.00000503 rebol-link.exe IOCTL_SERIAL_SET_CHAR Serial0 SUCCESS EOF:0 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13 0.00000587 rebol-link.exe IOCTL_SERIAL_SET_HANDFLOW Serial0 SUCCESS Shake:9 Replace:80 XonLimit:2048 XoffLimit:1024 0.00000000 rebol-link.exe IRP_MJ_WRITE Serial0 Length 1: 1 0.00000670 rebol-link.exe IOCTL_SERIAL_SET_WAIT_MASK Serial0 SUCCESS Mask: RXCHAR 0.00000000 rebol-link.exe IOCTL_SERIAL_WAIT_ON_MASK Serial0 The same state continues regardless if I add /direct, /direct/no-wait, timeout or not. It starts to work however, once I turn off hardware handshake: ser/rts-cts: off update ser 0.00001090 rebol-link.exe IOCTL_SERIAL_SET_BAUD_RATE Serial0 SUCCESS Rate: 1200 0.00000419 rebol-link.exe IOCTL_SERIAL_SET_RTS Serial0 INVALID PARAMETER 0.00000754 rebol-link.exe IOCTL_SERIAL_SET_DTR Serial0 SUCCESS 0.00000670 rebol-link.exe IOCTL_SERIAL_SET_LINE_CONTROL Serial0 SUCCESS StopBits: 1 Parity: NONE WordLength: 8 0.00000503 rebol-link.exe IOCTL_SERIAL_SET_CHAR Serial0 SUCCESS EOF:0 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13 0.00000922 rebol-link.exe IOCTL_SERIAL_SET_HANDFLOW Serial0 SUCCESS Shake:1 Replace:40 XonLimit:2048 XoffLimit:1024 0.00002430 rebol-link.exe IRP_MJ_WRITE Serial0 SUCCESS Length 1: 1 0.00001173 rebol-link.exe IOCTL_SERIAL_SET_WAIT_MASK Serial0 SUCCESS Mask: RXCHAR 0.00000000 rebol-link.exe IOCTL_SERIAL_WAIT_ON_MASK Serial0 As you can see, _SET_RTS was was said to have "invalid parameter". But - the only one real real difference to me seems to be in "Shake: 1" mode, while previous state was "Shake: 9". What does it mean? Our folks told me to not turn-off hw handshake though, as they use it - but then I can't do automatic scanning to find our device. The problem also is - what is the best mode I should use? While communication using Windows Hyperterminal works nicely, I have various strange difficulties, e.g. uploading following help into device: h: read %help.txt insert dev "HWE" ;HelpWriteEnglish insert dev h insert dev escape ; end of upload close dev ... it uploads nonsense chars into device, while the same file sent thru hyper-terminal works OK ... I will have our device today for further test, but am just curious, if anyone used serial port succesfully/consistently already? Anyway - help of any kind would be appreciated :-) Thanks -pekr-
[2/5] from: amicom:sonic at: 28-Jun-2002 6:14
Petr, I have scanned serial ports in the past, but I don't have the program handy to see how I did it or what refinements I used. It was using View/Pro 2.1, so I'm not sure if the behavior will be the same as in Link. I'll send you information later today when I'm at the location where I have the program. -Bo At 12:43 PM 6/28/02 +0200, you wrote:
[3/5] from: gord:raboud:shaw:ca at: 28-Jun-2002 10:27
Hello Bohdan; I would also be very interested in any serial port information; having similar problems as Petr described. Gordon Raboud On 28-Jun-02, you wrote:
[4/5] from: amicom:sonic at: 1-Jul-2002 12:40
Gordon and Petr, Here is a function I wrote that does the trick for me. I hope it helps you (beware of line-wrapping): connect-mpps: has [err ports tmp][ err: true foreach port ports: [port1 port2 port3 port4 port5 port6][ if not error? try [ mpps: open/direct/no-wait rejoin [serial:// port "/19200/8/none/1"] ][err: false break] ] if err [ view/new tmp: layout [ text "Unable to open any serial connections" button "OK" [quit] ] wait 30 unview/only tmp return false ] mpps/rts-cts: off update mpps true ] I had the same behavior as Petr with REBOL not returning until I defined the ports for each machine individually using system/ports/serial. I normally put this in the user.r file. I suppose you could access the system via libraries (if you are using View/Pro) to determine which COM ports are installed on the system. An idea if you need the hardware handshaking: Perhaps you could scan with handshaking off and once you find your device, turn handshaking back on. -Bo
[5/5] from: petr:krenzelok:trz:cz at: 1-Jul-2002 23:49
>Gordon and Petr, >Here is a function I wrote that does the trick for me. I hope it helps you
<<quoted lines omitted: 26>>>An idea if you need the hardware handshaking: Perhaps you could scan with >handshaking off and once you find your device, turn handshaking back on.
Thanks a lot ... that's what I will do (handshaking). Rebol serial communication is not correct imo. I looked at PortMon output and found out, why our device accepted all those strange chars. I used direct no-wait mode and inserted some help.txt file into serial port. Once I did so using HyperTerminal, I could see HyperTerminal taking my help file, and inserting each char of the file separately, while insert read %help.txt produced unexpected results and port monitor showed all chars being put into port at once. I called my Linux friend and he told me, that normally, if serial port is not able to be on pair with the speed you sent your data in, it will generate some kind of error. But Rebol doesn't seem to return any such kind of info. If it is so, it is a bug - Rebol should too, put text file into serial port char by char ... Has anyone any other experience here? Should I submit it ot feedback as a bug report? -pekr-
- Quoted lines have been omitted from some messages.
View the message alone to see the lines that have been omitted