Porta seriale gestione RTS

di il
1 risposte

Porta seriale gestione RTS

Buongiorno,

sto imparando a programmare in C# e mi scontro con un problema che non so risolvere.
Devo gestore una porta COM RS232 per inviare dati e ricevere risposte in modalità half duplex con l'utilizzo comandato di RTS.
Come posso essere sicuro di commutare RTS solo quando la trasmissione è avvenuta?
Ho provato a farlo dopo l'istruzione write per scrivere i dati nel buffer di trasmissione ma ho visto che a causa dei ritardi di invio il segnale RTS viene commutato prima dell'invio e non dopo.

Ho necessità di commutare RTS dopo l'invio di tutti i dati in trasmissione e prima che il ricevitore risponda il chè avviene all'incirca in 50ms.

C'è un modo per commutare RTS dopo un tempo preciso dall'invio dell'ultimo byte in trasmissione?

Grazie.

1 Risposte

  • Re: Porta seriale gestione RTS

    C'è un modo per commutare RTS dopo un tempo preciso dall'invio dell'ultimo byte in trasmissione?
    Dipende Handshake dispositivo e non tutti i dispositivi utilizzano il segnale RTS.
    
    public static void Main()
    {
        string name;
        string message;
        StringComparer stringComparer = StringComparer.OrdinalIgnoreCase;
        Thread readThread = new Thread(Read);
    
        // Create a new SerialPort object with default settings.
        _serialPort = new SerialPort();
    
        // Allow the user to set the appropriate properties.
        _serialPort.PortName = SetPortName("COM1");
        _serialPort.BaudRate = SetPortBaudRate(9600);
        _serialPort.Parity = SetPortParity(Parity.None);
        _serialPort.DataBits = SetPortDataBits(8);
        _serialPort.StopBits = SetPortStopBits(StopBits.One);
    
    /*
        Viene usato il controllo di flusso hardware RTS (Request-to-Send). 
        RTS segnala la disponibilità dei dati per la trasmissione. 
        Se il buffer di input risulta pieno, la riga RTS verrà impostata su false. 
        La riga RTS verrà impostata su true quando sarà disponibile una maggiore quantità di spazio nel buffer di input.
    */
        _serialPort.Handshake = SetPortHandshake(Handshake.RequestToSend);
    
        // Set the read/write timeouts
        _serialPort.ReadTimeout = 500;
        _serialPort.WriteTimeout = 500;
    
        _serialPort.Open();
        _continue = true;
        readThread.Start();
    
        Console.Write("Name: ");
        name = Console.ReadLine();
    
        Console.WriteLine("Type QUIT to exit");
    
        while (_continue)
        {
            message = Console.ReadLine();
    
            if (stringComparer.Equals("quit", message))
            {
                _continue = false;
            }
            else
            {
                _serialPort.WriteLine(
                    String.Format("<{0}>: {1}", name, message));
            }
        }
    
        readThread.Join();
        _serialPort.Close();
    }
    
    public static void Read()
    {
        while (_continue)
        {
            try
            {
                string message = _serialPort.ReadLine();
                Console.WriteLine(message);
            }
            catch (TimeoutException) { }
        }
    }
    
Devi accedere o registrarti per scrivere nel forum
1 risposte