Accediendo al Puerto Serie en Linux desde Freepascal, C++ y C#

Ir abajo

Accediendo al Puerto Serie en Linux desde Freepascal, C++ y C#

Mensaje por tsk el Vie 17 Jul 2009 - 6:46

Freepascal o Lazarus

Para manejar el puerto serie desde freepascal nos descargaremos la librería synaser que podemos encontrar en http://www.synapse.ararat.cz/doku.php/download, los archivos que necesitamos son el synafpc.pas, synaser.pas y synautil.pas, los cuales colocaremos en la carpeta de nuestro proyecto.

Código:

{$MODE DELPHI}

Program ser;

uses
 synaser, sysutils;

Type
  Arreglo= array[0..1] of string;
  Arreglo2= array[0..1] of byte;

var
ser:TBlockSerial;
  cad:Arreglo;
cad2:Arreglo2;

begin
  cad[0]:=ParamStr(2);
  cad[1]:=ParamStr(3);
  Writeln(cad[0],' ',cad[1]);
 
  ser:=TBlockserial.Create;

  try
ser.RaiseExcept:=True;
ser.Connect(ParamStr(1));
    ser.Config(115200,8,'N',1,false,false);
    ser.SendString(cad[0]);
    ser.SendString(cad[1]);
cad2[0]:=ser.RecvByte(10000);
    cad2[1]:=ser.RecvByte(10000);
    Writeln('Datos recibidos ',char(cad2[0]),' y ',char(cad2[1]));
finally
ser.Free;
end;
 end.

 

compilación

Código:
ppc386 ser.pas  (si estamos en un sistema de 64 bits compilaremos con ppcx64)

uso
Código:

./ser /dev/ttyUSB0 4 5
4 5
Datos recibidos 4 y 5

C y C++

Para C y C++ descargamos las librerías que se llama lnxComm que la podemos descargar de http://zsoluciones.com/datos/?page_id=11 y copiamos la carpeta com a nuestro proyecto.

Código:
#define __LINUX_COM__

#include "com/serial.h"
#include
using namespace std;

int main(int argc, char* argv[])
{
    HANDLE fd;
    DCB OldConf;
    int n;
    char cad[2];
    char cad2[2];
    cad[0]=*argv[2];
    cad[1]=*argv[3];
    cout<<"Abriendo puerto: "<<<" para enviar "<<<" "<<
    fd=Open_Port(argv[1]);              // Abre el puerto serie
    OldConf=Get_Configure_Port(fd);    // guardo la configuracion del puerto
    Configure_Port(fd,B115200,"8N1");  // Configuro el puerto serie
    IO_Blocking(fd,FALSE);              // Seleccionamos lectura no bloqueante

    n=Write_Port(fd,cad,2);            // Escribo en el puerto serie 2 bytes
 
    while(Kbhit_Port(fd)<2);          // Espero a leer hasta que se tengan
                                        // 2 bytes en el buffer de entrada
    n=Read_Port(fd,cad2,2);            // Leo el puerto serie

    cout<<<" "<<
    Set_Configure_Port(fd,OldConf);    // Restituyo la antigua configuracion
                                        // del puerto
    Close_Port(fd);                    // Se cierra el puerto serie

    return 0;
}

Compilación

Código:
 g++ -o ser ser.cpp
Uso
Código:

./ser /dev/ttyUSB0 a a
Abriendo puerto: /dev/ttyUSB0 para enviar a a
open_port:fd=3: Abierto puerto /dev/ttyUSB0
a a

C# (Mono)

Código:

using System;
using System.IO.Ports;
 
public class SerialPortTest
{
    public static void Main(string[] args)
    {

        SerialPortTest myTest = new SerialPortTest();
        Console.WriteLine("Puerto: {0}, Datos {1}",args[0],args[1]);
        myTest.Test(args[0],args[1]);
    }
 
    private SerialPort mySerial;
 
    // Constructor
    public SerialPortTest()
    {
    }
 
    public void Test(string port, string data)
    {
        if (mySerial != null)
            if (mySerial.IsOpen)
                mySerial.Close();
 
        mySerial = new SerialPort(port, 115200,Parity.None, 8, StopBits.One);
        mySerial.Open();
        mySerial.ReadTimeout = 10000;
        SendData(data);
        ReadData();
 
    }
 
    public string ReadData()
    {
        byte tmpByte;
        string rxString = "";   
        tmpByte = (byte) mySerial.ReadByte();
        Console.Write("Datos recibidos: {0} y ",(char)tmpByte);
        tmpByte = (byte) mySerial.ReadByte();
        Console.WriteLine("{0}",(char)tmpByte);           
   
        return rxString;
    }
 
    public bool SendData(string Data)
    {
        mySerial.Write(Data);
        return true;       
    }
}

Compilación
Código:
 gmcs ser.cs
Uso
Código:

./ser.exe /dev/ttyUSB0 2c
Puerto: /dev/ttyUSB0, Datos 2c
Datos recibidos: 2 y c

tsk
Participante
Participante

Mensajes : 11
Fecha de inscripción : 02/06/2009

Volver arriba Ir abajo

Re: Accediendo al Puerto Serie en Linux desde Freepascal, C++ y C#

Mensaje por Geo el Vie 17 Jul 2009 - 19:08

Muy buena info Smile.

Precisamente estos días he estado haciendo pruebas de comunicación con un PIC18f2550 usando un puerto COM "emulado" vía USB Smile. Sobre C#, en Windows estoy usando el componente SerialPort (para los tres: VB.NET, C++ y C#), lamentablemente en mono aún no está completo pero funciona Smile, el ejemplo supongo lo tomaste de aquí:
http://mono-project.com/HowToSystemIOPorts

Gracias por el dato.

Geo
Participante Activo
Participante Activo

Mensajes : 92
Fecha de inscripción : 16/12/2008
Localización : México

http://hsblog.mexchip.com

Volver arriba Ir abajo

Re: Accediendo al Puerto Serie en Linux desde Freepascal, C++ y C#

Mensaje por tsk el Dom 19 Jul 2009 - 7:11

Si el ejemplo lo tomé de esa página, sólo le quité lo del while, porque nunca iba a enviar un byte de fin de regreso, entonces estaba de más tenerlo. Y le agregé lo de los parámetros en la línea de comando.

Después voy a probar también con el vbnc, que es el compilador de visual basic .net pero de Mono.

tsk
Participante
Participante

Mensajes : 11
Fecha de inscripción : 02/06/2009

Volver arriba Ir abajo

Re: Accediendo al Puerto Serie en Linux desde Freepascal, C++ y C#

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.