Re: Reliable RS232 at 115200 baud
Is it possible to change the size of the UART receive buffer above 16
bytes? I think it would help greatly if I could make them more like
1K, but thought the UART was limited to 16bytes.
That depends. What UART are you using, what type of PC? I have had mixed results
depending on the UART used. The standard UARTs from the CPU board's chipsets
usually work quite nice but I have seen bugs in the design (FIFO hickups). In
many modern PCs with UARTS they do not have UARTS in the chipset but have
connected USB UART chips. With USB UART chips you depend on a very well written
UART driver from the manufacturer which can be a problem. We had the best
results with PCI 2x or 4x UART boards with a receive fifo size of 128 bytes.
The FIFO size can not be configured, however you can usually configure the FIFO
interrupt threshold using the control panel. On custom UART boards there is
usually anadditional tab for these settings in the device manager. It is
important to set the fifo threshold not too high because this leaves the PC with
less time between the receive interrupt and the receive overrun. If your PC has
receive fifo overruns then make the threshold smaller (max 8 or even 4 bytes
threshold, never set it to 14).
I am using threading with overlapped I/O but will take another look at
the code to see if there is anything I can do to tweak it. One point
though is that I have also tried getting data from this device with
some bought in comms programs (232analyzer is one of them) and they
seem to struggle also.
The errors my comms routines report and also the bought in comms
packages report are Comms Breaks, Frame Errors and Buffer Overflows
but the UART does not stop receiving data.
Comm breaks is strange because as far as I remember a COM break means more than
9 bits of "low" level on the serial line which can never happen when a device is
consantly sending data; it indicates either a broken hardware or a wrong baudrate.
There are actually two different overrun errors:
(also see http://msdn.microsoft.com/en-us/library/ms810467.aspx)
CE_OVERRUN means the UART chip RX buffer has overrun and could indicate that the
receive fifo threshold is set too high or that the PC has disabled interrupts
for too long (PC was busy with other low level hardware handling).
CE_RXOVER indicates that the UART driver's software receive buffer has overrun.
It means that your application can not cope with the amout of data, or that you
set the receive buffer too small to read and process it with the usual windows
time slice. How did you set the buffers, and what error do you actually get? See
SetupComm functions for details.
All traffic is one way, so
the PC does not communicate with the device. As soon as the device is
powered up it starts sending data. Again I know that flow control
seems the obvious answer, but I can't pursuade the manufacturer to
implement it and they claim Windows is the problem.
There is another problem that you might get when you start your windows
application after the device: When sending serial data back-to-back (without any
pause) you have a synchronization problem: depending on the data you might never
be able to synchonize on the start bit, the receiving UART might recognize other
high-low transitions as start bit, hence receiving garbage. Try to start your
application, set the correct baud rate, start receiving and then reset your
device. If everything is ok now, you have a sync problem.
The only reliable way to resync is when the sender stops sending for a least one
character time or when inserting 0x00 or 0xff bytes into the data stream. There
is also some woodoo involved here.
After opening the Comms port, if I ignore these errors and throw away
the first ~200bytes then all of the data from that point on seems to
be fine, so Windows does seem to be able to keep up.
I think the problem here isn't just the 115200 baud, but a combination
of 115200 and that the data is constantly being sent from the device.
I get 70bytes every 16ms constantly.
PS If this is the wrong news group then if someone could be kind
enought to tell me the correct one I will gladly post there.
Thanks again for the help Norbert