OpenSerialPortLinux()

Share your advanced PureBasic knowledge/code with the community.
infratec
Always Here
Always Here
Posts: 7622
Joined: Sun Sep 07, 2008 12:45 pm
Location: Germany

OpenSerialPortLinux()

Post by infratec »

Hi,

I ran into a problem with OpenSerialPort() in Linux:

It is not possible to set 'non-standard' baudrates :!:
(Possible in Windows)

But in my current 'hobby' project I had to set the baudrate to 7812 baud.
(OBD for a Marelli-Weber ECU)

In germany we say:
where a will is, is also a way
I know it's bad english, but I want to preserve the german idea.

So here it is:

Code: Select all

CompilerIf #PB_Compiler_OS = #PB_OS_Linux

#TIOCGSERIAL = $541E
#TIOCSSERIAL = $541F

#ASYNCB_SPD_HI = 4
#ASYNCB_SPD_VHI = 5

#ASYNC_SPD_HI = (1 << #ASYNCB_SPD_HI)
#ASYNC_SPD_VHI = ( 1 << #ASYNCB_SPD_VHI)
#ASYNC_SPD_CUST = (#ASYNC_SPD_HI | #ASYNC_SPD_VHI)


Structure serial_struct
  type.i
  line.i
  port.i
  irq.i
  flags.i
  xmit_fifo_size.i
  custom_divisor.i
  baud_base.i
  close_delay.u
  io_type.b
  reserved_char.b[1]
  hub6.i
  closing_wait.u
  closing_wait2.u
  *iomem_base.a
  iomem_reg_shift.u
  port_high.i
  iomap_base.l
EndStructure


Procedure.i OpenSerialPortLinux(SerialPort, SerialPortName$, Baud, Parity, Databits, Stopbits, HandshakeMode, InputBufferSize, OutputBufferSize)

  Port = OpenSerialPort(SerialPort, SerialPortName$, 38400, Parity, Databits, Stopbits, HandshakeMode, InputBufferSize, OutputBufferSize)
  
  If Port
    If SerialPort = #PB_Any
      Handle = SerialPortID(Port)
    Else
      Handle = Port
    EndIf
    
    LinuxSerialInfo.serial_struct
    
    ioctl_(Handle , #TIOCGSERIAL, @LinuxSerialInfo)
 
    LinuxSerialInfo\flags | #ASYNC_SPD_CUST
    LinuxSerialInfo\custom_divisor = LinuxSerialInfo\baud_base / Baud
  
    ioctl_(Handle, #TIOCSSERIAL, @LinuxSerialInfo)
    
  EndIf
  
  ProcedureReturn Port

EndProcedure
Save it as OpenSerialPortLinux.pbi

Maybe someone else can use it too.

Bernd