Re: Help with Java serial comms
On Sep 4, 1:26 pm, "brassed...@gmail.com" <brassed...@gmail.com>
wrote:
I'm using the rxtx libraries (RXTX-2.1.7) on Linux to communicate with
a serial printer that uses DSR/DTR flow control. Out of the box, the
rxtx libs either support XON/XOFF, RTS/CTS or no flow control.
You are not giving us much to work with, so I'll just respond with a
number of random thoughts.
Whatever you do, as a minimum get an RS232 breakout box like this one
http://www.jameco.com/webapp/wcs/stores/servlet/ProductDisplay?langId=-1&storeId=10001&catalogId=10001&productId=25945
There are much more advanced diagnosis tools available but such a box
is the minimum when fiddling with any kind of RS-232 communication. If
you have a lot of money to spend get a logic analyzer. Beware of cheap
Y-cables.
While you wait for the delivery of the breakout box replace the
printer with a PC and a good communication program. That means don't
use Hyperterminal. See if the communication program can display your
characters when it is configured like your printer.
Check your Linux device drivers. The drivers in older Linux versions
couldn' even do DTR/DSR. If that's the case rewire the serial cable.
You can patch that in seconds with the breakout box for testing it.
Connect DSR/DTR from the printer to RTS/CTS on the PC and do RTS/CTS
flow control instead.
Your code doesn't show if you set DTR prior to sending data to the
printer.
while (!commPort.isDSR()) {
Never do that kind of polling. Implement a SerialPortEventListener,
ask for notification of DSR changes (in case you don't switch to RTS/
CTS, where the library should do all the flow control on its own), and
push out the next set of data once you get a notification. Once DSR is
set loop and write until it becomes cleared again.
byte[] data = new ...
int pos = ... // Index of next byte to write
int end = ... // Index after last byte to write
class TheSerialPortEventListener implements SerialPortEventListener {
void serialEvent(SerialPortEvent ev) {
switch(ev.getEventType()) {
case SerialPortEvent.DSR:
if(ev.getNewValue()) {
SerialPort port = (SerialPort)ev.getSource();
while(port.isDSR() && pos < end) {
port.write(data[pos++]);
}
}
break;
case: // handle other serial events in this
// event handler, too.
break;
}
}
}
Check the flow-control configuration of the printer. In particular
check if the printer's "high water mark" configuration is set to
something like 80% or 90%, so that the printer will drop DSR when its
buffer is filled up to 80% (or 90%), and not when its 100% filled.
Check the cable. Do really all required connections exist? The
breakout box can show such things, too.
Check all other communication parameters. Speed, start/stop bits,
etc.
Intensively study the printer manual for communication hints. Does the
printer need or sets any other handshaking lines?