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:
I know it's bad english, but I want to preserve the german idea.where a will is, is also a way
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
Maybe someone else can use it too.
Bernd