Uwe Bonnes wrote:
    Cihan> I am currently in Australia so I guess it wouldn't be possible
    Cihan> although it would help a lot.

It's only a RS232 9 pin connector with 3 solder blobs. If you have a solder
iron, easily done yourself.

Ok, I'll see if it is still necessary.

    Cihan> I am still trying to figure out what the problem might be when
    Cihan> using purge to clear the output buffer. When G-Ware writes
    Cihan> subsequently to the port it looks like this:
    Cihan> 1) Purge (input/output)
    Cihan> 2) Write
    Cihan> 3) SetWaitMask (RXCHAR|RXFLAG|CTS|DSR|RLSD|BRK|ERR)
    Cihan> 4) WaitCommEvent
    Cihan> (4a) Read input if there's something)
    Cihan>  Goto 1)

    Cihan> As you can see there is no TXEMPTY flag so G-Ware seems to rely
    Cihan> on the buffers to be emptied beforehand and then just calls Purge
    Cihan> before writing again.  Just to make sure I wrote a short program
    Cihan> that does the following:
Cihan> 1) Write command Cihan> 2) Purge Cihan> 3) Write

    Cihan> another command (Without any delay). Obviously some bytes from
    Cihan> the first command are flushed away and thus the device indeed
Cihan> returns the same error value I get under G-Ware.
Here you forgot the behaviour of the actual device. It probably only reacts
when a complete command is written and terminated in some way, perhaps a CR
or something like that. If G-Ware send this "magic" byte as the last
command, no need fot tcdrain or such....

It's a bit more complicated. When connecting to the device G-Ware reads
out all stored values (quite a lot of traffic). Most of the commands to
do that are 16 or 96 bytes long and are not terminated by any character
(the command length is fixed depending on the command code).
It happens quite frequently that commands (mostly the shorter ones) are
sent out one after another in one string (ie. 32/192 bytes) with no
problem. So the device actually decodes the command and interprets the
correct amount of bytes that follow as parameters or whatever and then
continues with the next command after sending a reply.
What seems to happen under wine is that a command string is put in the
transmit buffer and before it is actually sent out completely the buffer
is flushed and a new command is sent out resulting in an error because
the parameters are wrong (or sometimes 'command too long').

What I don't know is why this happens under wine and I tried a lot to
find out... any help would be appreciated.

    Cihan> I can prevent it
    Cihan> by using tcdrain() or insert a sleep with a large enough value.
    Cihan> I also tried to _see_ it by using a tty instead of the serial
    Cihan> port but interestingly that does work, ie. no bytes are lost.
    Cihan> Uwe, could you try and see what happens when you use the loopback
    Cihan> and do a Write-Purge-Write sequence under both, wine and windows?

I am sure that bytes will get lost without any kind of line dicipline...

I would think so as well but maybe something that works differently
under windows prevents this loss? Therefore I thought an actual test
would clarify.

    Cihan> One more thing regarding the page fault in the EventService: We
    Cihan> obviously have to set the buffer to 0 when the event mask changes
    Cihan> because that's what the API spec says. But maybe we have to
    Cihan> monitor which threads exist and wake them up when SetCommMask is
    Cihan> called so that they finish their work before SetCommMask returns.
    Cihan> MSDN says: "...WaitCommEvent returns immediately"

Sorry, forgot to ask for comments here. Is it possible to do what I
suggest? Does it sound right at all?


Thanks a lot,
Cihan



Reply via email to