Com порт OutputStream

 
 
 
Сообщения:7
У меня такая проблема! При записи информации в OutputStream байты 0x0A заменяются на два байта 0x0d 0x0a! как сделать так чтобы так не делалось?
 
 
Сообщения:3874
Хм ... дайте пример записи. Очень странное поведение.
 
 
Сообщения:53
Проверь, правильно ли ты делаешь инициализацию порта.

((SerialPort)port).setSerialPortParams(9600,
 SerialPort.DATABITS_8,
 SerialPort.STOPBITS_1,
 SerialPort.PARITY_EVEN);
((SerialPort)port).setFlowControlMode(SerialPort.FLOWCONTROL_NONE);


Очень важно, что бы эти настройки совпадали с настройками устройства на другом конце.
 
 
Сообщения:7
Вот код! Параметры порта совпадают! Не знаю играет ли это роль пишу под ASP Linux.
Это стандартный пример SerialDemo только добавил функцию Write(short[], int) там как видите я сначала вывел массив потом положил в поток! Ловлю эту инфу на другой стороне а там происходят уже эти подмены! ХЗ в чем дело!

import javax.comm.*;
import java.io.*;
import java.awt.TextArea;
import java.awt.event.*;
import java.util.TooManyListenersException;

/**
 * A class that handles the details of a serial connection. Reads from one
 * TextArea and writes to a second TextArea.
 * Holds the state of the connection.
 */
public class SerialConnection implements SerialPortEventListener, 
					 CommPortOwnershipListener {
    private SerialDemo	       parent;    
    private SerialParameters   parameters;
    private OutputStream       os;
    private InputStream	       is;
    private StringBuffer       inputBuffer;
    private CommPortIdentifier portId;
    private SerialPort	       sPort;
    private boolean	       open;
    private int                nNeedToRead;
    
    JPUMAL1 m_L1;

    /**
     * Creates a SerialConnection object and initilizes variables passed in
     * as params.
     * @param parent A SerialDemo object.
     * @param parameters A SerialParameters object.
     * @param messageAreaOut The TextArea that messages that are to be sent out
     * of the serial port are entered into.
     * @param messageAreaIn The TextArea that messages comming into the serial
     * port are displayed on.
     */
    
    public SerialConnection(SerialDemo parent, SerialParameters parameters)
    {
	inputBuffer = new StringBuffer();
        this.parent = parent;
	this.parameters = parameters;	
	open = false;        
    }

    /**
     * Attempts to open a serial connection and streams using the parameters
     * in the SerialParameters object. If it is unsuccesfull at any step it
     * returns the port to a closed state, throws a
     * <code>SerialConnectionException</code>, and returns.
     * Gives a timeout of 30 seconds on the portOpen to allow other applications
     * to reliquish the port if have it open and no longer need it.
     */
    public void openConnection() throws SerialConnectionException 
    {
	// Obtain a CommPortIdentifier object for the port you want to open.
	try {
	    portId = 
		CommPortIdentifier.getPortIdentifier(parameters.getPortName());
	} catch (NoSuchPortException e) {
	    throw new SerialConnectionException(e.getMessage());
	} 

	// Open the port represented by the CommPortIdentifier object. Give
	// the open call a relatively long timeout of 30 seconds to allow
	// a different application to reliquish the port if the user
	// wants to.
	try {
	    sPort = (SerialPort) portId.open("SerialDemo", 30000);
	} catch (PortInUseException e) {
	    throw new SerialConnectionException(e.getMessage());
	} 

	// Set the parameters of the connection. If they won't set, close the
	// port before throwing an exception.
	try {
	    setConnectionParameters();
	} catch (SerialConnectionException e) {
	    sPort.close();

	    throw e;
	} 

	// Open the input and output streams for the connection. If they won't
	// open, close the port before throwing an exception.
	try {
	    os = sPort.getOutputStream();            
	    is = sPort.getInputStream();
	} catch (IOException e) {
	    sPort.close();

	    throw new SerialConnectionException("Error opening i/o streams");
	} 

	// Add this object as an event listener for the serial port.
	try {
	    sPort.addEventListener(this);
	} catch (TooManyListenersException e) {
	    sPort.close();

	    throw new SerialConnectionException("too many listeners added");
	} 

	// Set notifyOnDataAvailable to true to allow event driven input.
	sPort.notifyOnDataAvailable(true);

	// Set notifyOnBreakInterrup to allow event driven break handling.
	sPort.notifyOnBreakInterrupt(true);

	// Set receive timeout to allow breaking out of polling loop during
	// input handling.
	try {
	    sPort.enableReceiveTimeout(30);
	} catch (UnsupportedCommOperationException e) {}

	// Add ownership listener to allow ownership event handling.
	portId.addPortOwnershipListener(this);

	open = true;
    } 

    /**
     * Sets the connection parameters to the setting in the parameters object.
     * If set fails return the parameters object to origional settings and
     * throw exception.
     */
    public void setConnectionParameters() throws SerialConnectionException {

	// Save state of parameters before trying a set.
	int oldBaudRate = sPort.getBaudRate();
	int oldDatabits = sPort.getDataBits();
	int oldStopbits = sPort.getStopBits();
	int oldParity = sPort.getParity();
	int oldFlowControl = sPort.getFlowControlMode();
	
        // Set connection parameters, if set fails return parameters object
	// to original state.
	try {
	    sPort.setSerialPortParams(152000, 
				      parameters.getDatabits(), 
				      parameters.getStopbits(), 
				      parameters.getParity());            
	} catch (UnsupportedCommOperationException e)
        {} 
                
        try {
	    sPort.setSerialPortParams(parameters.getBaudRate(), 
				      parameters.getDatabits(), 
				      parameters.getStopbits(), 
				      parameters.getParity());            
	} catch (UnsupportedCommOperationException e) {
	    parameters.setBaudRate(oldBaudRate);
	    parameters.setDatabits(oldDatabits);
	    parameters.setStopbits(oldStopbits);
	    parameters.setParity(oldParity);

	    throw new SerialConnectionException("Unsupported parameter");
	} 

	// Set flow control.
	try {
	    sPort.setFlowControlMode(parameters.getFlowControlIn() 
				     | parameters.getFlowControlOut());
	} catch (UnsupportedCommOperationException e) {
	    throw new SerialConnectionException("Unsupported flow control");
	}     
    } 

    /**
     * Close the port and clean up associated elements.
     */
    public void closeConnection() {

	// If port is alread closed just return.
	if (!open) {
	    return;
	} 

	// Check to make sure sPort has reference to avoid a NPE.
	if (sPort != null) {
	    try {

		// close the i/o streams.
		os.close();
		is.close();
	    } catch (IOException e) {
		System.err.println(e);
	    } 

	    // Close the port.
	    sPort.close();

	    // Remove the ownership listener.
	    portId.removePortOwnershipListener(this);
	} 

	open = false;
    } 

    /**
     * Send a one second break signal.
     */
    /*public void sendBreak() {
	//sPort.sendBreak(1000);
    }*/
    
    /*
     * Send set of bytes to the port
     */
    
    public int Write(short[] pbtInfo, int nCount)
    {        
        try
        {
            byte[] pbt = new byte[nCount];
                        
            for(int i = 0; i < nCount; i++)
                pbt[i] = (byte)pbtInfo[i];
                
            System.out.print("Serial connection - write - ");
            for(int i = 2; i < nCount - 1; i++)            
                System.out.printf("%02x.",pbtInfo[i]);            
            
            System.out.println("");            
            
            FilterOutputStream fs = new FilterOutputStream( os );
            
            
            fs.write(pbt, 0, nCount);
        }
        catch (IOException e)
        {
            System.err.println(e);
	}
        
        return nCount;
    }
    
    /*
     * Getting bytes from port
     */
    
    public int Read(int nCount, short[] pbtBuff)
    {        
        byte []bdst = new byte[nCount];
        
        int nRes = 0;
        try
        {
            if( is.available() >= nCount ) 
            {
                nRes = is.read(bdst, 0, nCount);

                if( nRes > 0 )
                {                
                    for( int i = 0; i < nCount; i++)
                    {                    
                        pbtBuff[i] = (short)(bdst[i] & 0xFF);                 
                    }
                }
            }
        }
        catch(IOException e)
        {}
        
        return nRes;
    }
        
    /**
     * Reports the open status of the port.
     * @return true if port is open, false if port is closed.
     */
    
    public boolean isOpen() {
	return open;
    } 

    /**
     * Handles SerialPortEvents. The two types of SerialPortEvents that this
     * program is registered to listen for are DATA_AVAILABLE and BI. During
     * DATA_AVAILABLE the port buffer is read until it is drained, when no more
     * data is availble and 30ms has passed the method returns. When a BI
     * event occurs the words BREAK RECEIVED are written to the messageAreaIn.
     */
    public void serialEvent(SerialPortEvent e) {
	
	int	     newData = 0;

	// Determine type of event.
	switch (e.getEventType()) {

	// Read data until -1 is returned. If \r is received substitute
	// \n for correct newline handling.
	case SerialPortEvent.DATA_AVAILABLE:            
	    
            //if(m_L1 != null)
            //    m_L1.m_pRead.SetEvent();
	    break;

	// If break event append BREAK RECEIVED message.
	case SerialPortEvent.BI:
            break;
	}
    } 

    /**
     * Handles ownership events. If a PORT_OWNERSHIP_REQUESTED event is
     * received a dialog box is created asking the user if they are
     * willing to give up the port. No action is taken on other types
     * of ownership events.
     */
    public void ownershipChange(int type) {
	if (type == CommPortOwnershipListener.PORT_OWNERSHIP_REQUESTED) {
	    PortRequestedDialog prd = new PortRequestedDialog(parent);
	} 
    }    
}
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет