I need to send and receive data over serial connections (RS-232 and RS-422).

How do I set up and communicate with such a connection? How do I figure out what the configuration settings (e.g. baud rate) should be and how do I set them?

In particular I am looking to do this in Java, C/C++, or one of the major Unix shells but I also have some interest in serial programming using Windows/Hyperterminal.

+8  A: 

Build a time machine and go back to 1987? Ho ho.

Ok, no more snarky comments.

How do I figure out what the configuration settings (e.g. baud rate) should be...

Read the datasheet? Ok, ok. Seriously, last one. If you don't know the baud rate of the device you are trying to communicate with, you have two choices. Start guessing, or possibly bust out an o-scope. If you need a good starting point, let me suggest 9600-8-N-1. My suspicion is you can get there with brute force relatively quickly. There's a third option of having an old-school ninja who can tell just by the LOOK of the garbled characters at some standard baud rate what actual baud rate is. An impressive party trick to be sure.

Hopefully though you have access to this information. In unix/linux, you can get ahold of minicom to play with the serial port directly. This should make it fairly quick to get the configuration figured out.

one of the major Unix shells

In Unix the serial port(s) is/are file-mapped into the /dev/ subdir. ttyS0, for example. If you setup the correct baud rate and whatnot using minicom, you can even cat stuff to that file to send stuff out there.

On to the meat of the question, you can access it programmatically through the POSIX headers. termios.h is the big one.


but I also have some interest in serial programming using Windows/Hyperterminal.

Hyperterminal and minicom are basically the same program. As for how Windows let's you get access to the serial port, I'll leave that question for someone else. I haven't done that in Windows since the Win95 days.

+1  A: 

From the other side, if you want to do it using C#, which will run on both Windows and Linux--with some limitations (EDIT: which may be out of date. I have no way to test it.). Just create a SerialPort object, set its baudrate, port and any other odd settings, call open on it, and write out your byte[]s. After all the setup, the SerialPort object acts very similar to any networked stream, so it should be easy enough to figure out.

And as ibrandy states, you need to know all these settings, like baud rate, before you even start attempting to communicate to any serial device.

+1  A: 

At work we use teraterm and realterm for checking serial data is correctly formatted. Also we have a hardware splitter with a switch so we can monitor traffic to our application via a cable back to another port.

Windows allows you access to the serial port via CreateFile. That gives you a handle and from there you can configure access.

+1  A: 

From Java the rxtx library is quite good. It picks up where Sun's serial IO framework left off.

Mark Renouf
+3  A: 

For C/C++ on Windows you have (at least) two choices:

  1. Use the SerialPort class provided by .NET.
  2. Use the Win32 API. There is an extensive MSDN article dating back to 1995, and many free libraries and examples on the web to get you started.

The .NET option will be much easier.

+2  A: 

If you want to code in Java I really recommend SerialIOs SerialPort. It is very ease to use and saves you days of work.

My advice: do not use Sun's serial IO framework! It is from 1998 and full of bugs. You can use rxtx but serialio is better!

+2  A: 

If it needs to be cross platfrom, I would suggest looking at Boost Asio.


Awhile back I wrote a decent sized application to route connections from a farm of modems through to a TCP/IP network address.

Initially I looked for an unencumbered (free) Serial IO library. I tried Sun's, IBM's and RxTx. They were fine for developing the application, and in initial testing, but in production they each proved unstable.

Finally I paid for SerialIO's SerialPort. Converting over was literally an exercise in changing imports, and the library has been absolutely rock solid - I cannot recommend it enough. My application has been running in the field 24/7 for a couple of years now, with not a single problem encountered by multiple customers.

If you start development using SerialPort, they have a better API and I would use it.

If you need cross platform support, Java with SerialPort was the best choice I could find.

Lastly, their licensing is pretty darn reasonable as long as you are not preinstalling software on the equipment for your customer(s).

Software Monkey
When did you last use RxTx and SerialPort? I'm curious whether RxTx has improved.
@Gili: It was a number of years ago now, for RxTx - I never returned to it after purchasing SerialPort, since we never have had problems with SerialPort and there are no royalties, so no motivation to invest time in RxTx.
Software Monkey
@Gili: SerialPort is in current production use by our customers.
Software Monkey
what's their max baudrate for communicating with USB converters? I looked on their website, it says 230400 but I may have misread something. (230Kbaud's not enough for my application)
Jason S
IIRC, the max baud was effectively limited only by the H/W - I wrote my config to allow up to 1.3Mb, but I was targeting modems over RS-232 so 115K was the max that I needed, and likely the max that I ever will.
Software Monkey

Depending on the device You are trying to communicate with, there may be more parameters than the baud rate, number of data bits, type of parity checking and number of stop bits to consider. If I recall correctly, modems use nine lines of the RS-232C interface. Some devices like, for example cash registers, may use hardware handshaking on RTS/CTS lines or on DTR/STR lines.

In general it's good to know how the interface works. You can't communicate if the baud rate doesn't match, but wrong setting of other parameters might kind of work. For example You can easily send data to the device expecting 1 stop bit with 2 stop bits set. Problems start when You try to receive data in such case. You can also use appropriately set parity bit as one of stop bits, etc.

Maciej Hehl

Hi look at you will find java libraries to manage serial port.