Does anyone know how to make a
Servlet runnimg under
Tomcat write to a serial port?
I've downloaded and installed the
Java Communications API (version 2) and
Tomcat 5.0.25. The whole lot uses Java 1.4.0., running on Windows XP Professional.
Tomcat works fine and the comms stuff works fine.
My servlet is below, but when I invoke it, I get a log and an exception:
"Serial port is already in use."
javax.servlet.ServletException
comms.Send.init(Send.java:55)
javax.servlet.GenericServlet.init(GenericServlet.java:211)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160) org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:793) org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:702) org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:571) org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:644) java.lang.Thread.run(Thread.java:536)
At some point, I'm going to need to find a way of limiting the poolsize forthis servlet to 1 only too.
Cheers
Don.
--------------------------------
Source:
package comms;
/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) Donald Horrell 2004</p>
* <p>Company: </p>
* @author Donald Horrell
* @version 1.0
*/
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.comm.*;
import javax.servlet.ServletException;
import javax.servlet.SingleThreadModel;
import javax.servlet.http.*;
public class Send extends HttpServlet implements SingleThreadModel
{
/** The output stream which writes to the Com port. */
PrintWriter out = null;
public void init() throws ServletException
{
// Open the serial port.
Enumeration portList = CommPortIdentifier.getPortIdentifiers();
while (portList.hasMoreElements())
{
CommPortIdentifier portId = (CommPortIdentifier) portList.nextElement();
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL)
{
//if (portId.getName().equals("/dev/term/a")) {
if (portId.getName().equals("COM1"))
{
SerialPort serialPort = null;
try
{
serialPort = (SerialPort)(portId.open("SendApplet", 2000));
out = new PrintWriter(serialPort.getOutputStream());
serialPort.setSerialPortParams(9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
}
catch (PortInUseException e)
{
System.out.println("Serial port is already in use.");
throw(new ServletException());
}
catch (IOException e)
{
System.out.println("Failed to connect to output stream.");
throw(new ServletException());
}
catch (UnsupportedCommOperationException e)
{
System.out.println("Failed to set comms params.");
throw(new ServletException());
}
}
}
}
}
public void destroy()
{
// Release the serial port.
}
public void doGet(HttpServletRequest req, HttpServletResponse resp)
{
System.out.println("doGet.");
doWork(req, resp);
}
public void doPost(HttpServletRequest req, HttpServletResponse resp)
{
System.out.println("doPost.");
doWork(req, resp);
}
public void doWork(HttpServletRequest req, HttpServletResponse resp)
{
// Take the msg param and send it to COM1.
String msg = req.getParameter("msg");
System.out.println("Sending["+msg+"].");
if (msg != null)
{
out.println(msg);
}
}
}