0

我正在使用 jSSC 库,我需要实现 RTS 信号,因为我需要连接到一些 RS-485 客户端,所以我将此信号用于 SN75176 的 DE/RE。问题是当我激活或停用 RTS 信号时,我在 MAX232 和 SN75176 之间有一个 LED 来指示 RTS 是否处于活动状态,它似乎没有按我的需要工作。这是代码:

package jssc_checkclientsandcables;

import jssc.SerialPort;
import jssc.SerialPortEvent;
import jssc.SerialPortEventListener;
import jssc.SerialPortException;

/**
 *
 * @author DeLeon
 */
public class JSSC_CheckClientsAndCables {

    /**
     * @param args the command line arguments
     */
    private static int[] vcClients, vcRele;
    private static int continuarProg;
    private static SerialPort serialPort;
    private static SerialPortEvent event;
    private static byte[] buffer;
    //private static int contadorcin;
    private static final int CANT_CLIENTS = 3;
    private static final int STREAM_LONG = 4;


    public static void main(String[] args) throws InterruptedException {
        // TODO code application logic here
        serialPort = new SerialPort("COM1");
        try {
            System.out.println("Port name: " + serialPort.getPortName());
            System.out.println("Port opened: " + serialPort.openPort());
            System.out.println("Params setted: " + serialPort.setParams(9600, 8, 1, 0));
            //System.out.println("Set Flow Control Mode setted: " + serialPort.setFlowControlMode(1 | 2));
            //System.out.println("Params setted: " + serialPort.setParams(9600, 8, 1, 0, false, false));
            //Preparamos la máscara
            //int mask = SerialPort.MASK_RXCHAR;<-<-<-<-< Estos dos estaban ON
            //Seteamos el Evento - No me queda muy claro como funciona este método
            //serialPort.setEventsMask(mask); -<-<-<-<
            System.out.println("Set Flow Control Mode setted: " + serialPort.setFlowControlMode(1 | 2));
            System.out.println("Get Flow Control Mode: " + serialPort.getFlowControlMode());
            //
            //serialPort.addEventListener(new SerialPortReader());
        }
        catch (SerialPortException ex){
            System.out.println(ex);
        }

        vcClients = new int[CANT_CLIENTS];
        vcRele = new int[CANT_CLIENTS];
        buffer = new byte[STREAM_LONG];

        System.out.println("Primer RTS tiene que ser False");
        try{
            //Desactivmaos la señal RTS
            System.out.println("RTS signal: " + serialPort.setRTS(false));
            System.out.println("CTS signal: " + serialPort.isCTS());
            //System.out.println("RTS signal: " + serialPort.setRTS(true));
        }
        catch (SerialPortException ex){
            System.out.println("Problemas al desactivar RTS Signal");
        }

        do{
            for(int i = 0; i < CANT_CLIENTS; i++){
                System.out.print("\n\nIngrese numero de cliente: ");
                vcClients[i] = Consola.readInt();
                System.out.print("\n\nIngrese rele que desea activar (A = 1, B = 2, M = 3, N = 4, OFF = 6): ");
                vcRele[i] = Consola.readInt();
            }


            for (int j = 0; j < CANT_CLIENTS; j++){
                    System.out.println("\n\nEnviando datos al Cliente numero " + vcClients[j]);
                    System.out.println("Segundo RTS tiene que ser True");
                    try{ 
                        //Ponemos en alto la señal RTS para que el SN75176 active el driver de transmisión
//                        System.out.println("RTS signal active: " + serialPort.setRTS(true));
//                        serialPort.setRTS(true);
//                        serialPort.setRTS(true);
//                        System.out.println("RTS signal active: " + serialPort.isRTS(true));
//                        //System.out.println("RTS signal: " + serialPort.setRTS(false));

                        try{
                            //Desactivmaos la señal RTS
                            System.out.println("RTS signal: " + serialPort.setRTS(true));                            
                            System.out.println("CTS signal: " + serialPort.isCTS());
                            //System.out.println("RTS signal: " + serialPort.setRTS(true));
                        }
                        catch (SerialPortException ex){
                            System.out.println("Problemas al desactivar RTS Signal");
                        }


                        // Controlar si no se necesita un retardo entre envios al serial <- <- <- <- <- 
                        System.out.println("Paso el segundo RTS (True) y esta por mandar");
                        serialPort.writeInt(0xa5);//Byte de START
                        serialPort.writeInt(vcClients[j]);
                        switch (vcRele[j]){
                            case 1:{
                                serialPort.writeInt(0xf1);
                                break;
                            }
                            case 2:{
                                serialPort.writeInt(0xf2);
                                break;
                            }
                            case 3:{
                                serialPort.writeInt(0xf3);
                                break;
                            }
                            case 4:{
                                serialPort.writeInt(0xf4);
                                break;
                            }
                            case 6:{
                                serialPort.writeInt(0xf6);      // Desactivar todos los Clientes
                                break;
                            }
                            default:{
                                System.out.println("No se enviaron datos validos al cliente " + vcClients[j] + " - Switch-Case = default");
                                break;
                            }
                        }

                        serialPort.writeInt(vcClients[j] + vcRele[j] + 0xf0);
                        System.out.println("Termino de mandar");
                   }
                   catch (SerialPortException ex){
                       System.out.println("No se pudo enviar informacion al puerto COM1");
                   }     
                        System.out.println("\nStream enviado al cliente " + vcClients[j]);
                        Thread.sleep(800);//Wait 0.8 seconds

//                   try{
//                        //Desactivmaos la señal RTS
//                        System.out.println("RTS signal: " + serialPort.setRTS(false));
//                        }
//                        catch (SerialPortException ex){
//                            System.out.println("Problemas al desactivar RTS Signal");
//                        }
                   System.out.println("Esperando respuesta del cliente " + vcClients[j]);
                   //Esperamos del cliente el valor entero que representa una confirmación, 0xac

                   do{
                        //if(event.isRXCHAR()){
                        //if(event.getEventValue() == 2){

                        /* MODIFICAR ESTO: Tenemos que recibir 3 caracteres, START+DATA+CHECKSUM */
                        try{
                            //Desactivmaos la señal RTS
                            System.out.println("Tercer RTS tiene que ser False");
                            //serialPort.setRTS(false);
                            System.out.println("RTS signal: " + serialPort.setRTS(false));
                            System.out.println("Paso el tercer RTS false");
                        }
                        catch (SerialPortException ex){
                            System.out.println("Problemas al desactivar RTS Signal");
                        }


                       System.out.println("Antes de esperar los datos al buffer de recep");
                        try {
                            byte buffer[] = serialPort.readBytes(STREAM_LONG);
                        }
                        catch (SerialPortException ex) {
                            System.out.println(ex);
                        }

                        System.out.println("Despues de esperar los datos al buffer de recep");

                        System.out.println("Primer  dato recibido: " + buffer[0]);
                        System.out.println("Segundo dato recibido: " + buffer[1]);
                        System.out.println("Tercer  dato recibido: " + buffer[2]);
                        System.out.println("Cuarto  dato recibido: " + buffer[3]);    

                   }while( ((buffer[3]) >= 0xf6) && ((buffer[3]) <= 0xf8));

                System.out.println("\n\nEl valor del 1º dato recibio es: " + buffer[0]);
                System.out.println("El valor del 2º dato recibio es: " + buffer[1]);
                System.out.println("El valor del 3º dato recibio es: " + buffer[2]);              
                System.out.println("El valor del 4º dato recibio es: " + buffer[3]);    
                //if( (buffer[0]+buffer[1]) == 0x151)
                    //System.out.println("Comunicación con el cliente correcta" );



                System.out.println("Desea continuar? [Si = 1 / No = 2]");
                continuarProg = Consola.readInt();
            }
        }while(continuarProg != 2);

        continuarProg = 0;

        try{
        //Cerramos el puerto COM1    
        System.out.println("Port closed: " + serialPort.closePort());
        }
        catch (SerialPortException ex){
            System.out.println("Problemas cerrando el COM o desactivando RTS Signal");
        }

这是输出:


运行:端口名称:COM1 端口打开:true 参数设置:true 设置流量控制模式:true 获取流量控制模式:3 Primer RTS tiene que ser False RTS 信号:false

客户数量:1

Ingrese rele que desea activar (A = 1, B = 2, M = 3, N = 4, OFF = 6): 1

客户数量:2

Ingrese rele que desea activar (A = 1, B = 2, M = 3, N = 4, OFF = 6): 2

客户数量:3

Ingrese rele que desea activar (A = 1, B = 2, M = 3, N = 4, OFF = 6): 3

Enviando datos al Cliente numero 1 Segundo RTS tiene que ser True RTS 信号:假 Paso el segundo RTS (True) y esta por mandar

BUILD STOPPED(总时间:57 分 38 秒)

我究竟做错了什么?

随意询问是否缺少某些信息或某事。不清楚。

提前致以亲切的问候和感谢。

4

1 回答 1

0

您可以使用 setRTS 切换 RTS 以控制 SN75176 的 DE/RE。可能在调用 write 函数之前将 RTS 设置为高。发送数据后,将 RTS 设置为 false。这就是我通常在嵌入式平台中通过在发送数据之前设置 DE/RE 来执行此操作的方式。

我仅在 Windows 7 PC 上测试了 jssc setRTS,并使用示波器探测 PC 背面 DB9 连接器的引脚 7。

保罗

于 2014-02-11T03:06:44.293 回答