Some more serial stuff. (0.37.24)
This commit is contained in:
parent
a1c545c6a2
commit
384a7e4502
4 changed files with 125 additions and 1 deletions
|
|
@ -1,5 +1,5 @@
|
||||||
cmake_minimum_required(VERSION 3.10)
|
cmake_minimum_required(VERSION 3.10)
|
||||||
project(fun VERSION 0.37.23 LANGUAGES C)
|
project(fun VERSION 0.37.24 LANGUAGES C)
|
||||||
|
|
||||||
set(CMAKE_C_STANDARD 99)
|
set(CMAKE_C_STANDARD 99)
|
||||||
set(CMAKE_C_STANDARD_REQUIRED ON)
|
set(CMAKE_C_STANDARD_REQUIRED ON)
|
||||||
|
|
|
||||||
54
examples/serial_demo.fun
Normal file
54
examples/serial_demo.fun
Normal file
|
|
@ -0,0 +1,54 @@
|
||||||
|
#!/usr/bin/env fun
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Fun programming language.
|
||||||
|
* https://fun-lang.xyz/
|
||||||
|
*
|
||||||
|
* Copyright 2025 Johannes Findeisen <you@hanez.org>
|
||||||
|
* Licensed under the terms of the Apache-2.0 license.
|
||||||
|
* https://opensource.org/license/apache-2-0
|
||||||
|
*
|
||||||
|
* Added: 2025-12-28
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <io/serial.fun>
|
||||||
|
|
||||||
|
// This is an example of how to use the Serial class from the stdlib.
|
||||||
|
// Note: This requires a serial device to be present at the specified path.
|
||||||
|
|
||||||
|
path = "/dev/ttyUSB0"
|
||||||
|
baud = 115200
|
||||||
|
|
||||||
|
print("Opening serial port " + path + " at " + to_string(baud) + " baud...")
|
||||||
|
s = Serial(path, baud)
|
||||||
|
|
||||||
|
if (s.open())
|
||||||
|
print("Serial port opened successfully.")
|
||||||
|
|
||||||
|
// Configure: 8 data bits, no parity (0), 1 stop bit, no flow control (0)
|
||||||
|
if (s.config(8, 0, 1, 0))
|
||||||
|
print("Configured to 8N1.")
|
||||||
|
|
||||||
|
sent = s.send("AT\r\n")
|
||||||
|
print("Sent " + to_string(sent) + " bytes.")
|
||||||
|
|
||||||
|
// Wait a bit for response if needed (mocked by sleep if available)
|
||||||
|
// sleep_ms(100)
|
||||||
|
|
||||||
|
resp = s.recv(64)
|
||||||
|
if (len(resp) > 0)
|
||||||
|
print("Received: " + resp)
|
||||||
|
else
|
||||||
|
print("No response received.")
|
||||||
|
else
|
||||||
|
print("Failed to configure serial port.")
|
||||||
|
|
||||||
|
s.close()
|
||||||
|
print("Serial port closed.")
|
||||||
|
else
|
||||||
|
print("Failed to open serial port. (Do you have permissions?)")
|
||||||
|
|
||||||
|
/* Possible output:
|
||||||
|
Opening serial port /dev/ttyUSB0 at 115200 baud...
|
||||||
|
Failed to open serial port. (Do you have permissions?)
|
||||||
|
*/
|
||||||
|
|
@ -48,3 +48,8 @@ fun test_serial()
|
||||||
print("Could not open serial port (this is expected if /dev/ttyUSB0 doesn't exist or no permission)")
|
print("Could not open serial port (this is expected if /dev/ttyUSB0 doesn't exist or no permission)")
|
||||||
|
|
||||||
test_serial()
|
test_serial()
|
||||||
|
|
||||||
|
/* Possible output:
|
||||||
|
Attempting to open serial port: /dev/ttyUSB0
|
||||||
|
Could not open serial port (this is expected if /dev/ttyUSB0 doesn't exist or no permission)
|
||||||
|
*/
|
||||||
|
|
|
||||||
65
lib/io/serial.fun
Normal file
65
lib/io/serial.fun
Normal file
|
|
@ -0,0 +1,65 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the Fun programming language.
|
||||||
|
* https://fun-lang.xyz/
|
||||||
|
*
|
||||||
|
* Copyright 2025 Johannes Findeisen
|
||||||
|
* Licensed under the terms of the Apache-2.0 license.
|
||||||
|
* https://opensource.org/license/apache-2-0
|
||||||
|
*
|
||||||
|
* Added: 2025-12-28
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Serial communication class for Fun stdlib.
|
||||||
|
*
|
||||||
|
* Provides:
|
||||||
|
* - Serial: wrapper over built-ins: serial_open, serial_config, serial_send, serial_recv, serial_close
|
||||||
|
*
|
||||||
|
* Usage:
|
||||||
|
* #include <io/serial.fun>
|
||||||
|
* s = Serial("/dev/ttyUSB0", 115200)
|
||||||
|
* if (s.open())
|
||||||
|
* s.config(8, 0, 1, 0) // 8N1, no flow control
|
||||||
|
* s.send("Hello Serial!")
|
||||||
|
* resp = s.recv(64)
|
||||||
|
* print("Received: " + resp)
|
||||||
|
* s.close()
|
||||||
|
*/
|
||||||
|
|
||||||
|
class Serial(string path, number baud_rate)
|
||||||
|
|
||||||
|
fun _construct(this, path, baud_rate)
|
||||||
|
this.path = path
|
||||||
|
this.baud_rate = baud_rate
|
||||||
|
this.fd = 0
|
||||||
|
|
||||||
|
fun open(this)
|
||||||
|
this.fd = serial_open(this.path, this.baud_rate)
|
||||||
|
return this.fd > 0
|
||||||
|
|
||||||
|
fun is_open(this)
|
||||||
|
return this.fd > 0
|
||||||
|
|
||||||
|
fun config(this, data_bits, parity, stop_bits, flow_control)
|
||||||
|
if (!this.is_open())
|
||||||
|
return 0
|
||||||
|
// parity: 0=None, 1=Odd, 2=Even
|
||||||
|
// flow_control: 0=None, 1=Hardware (RTS/CTS)
|
||||||
|
return serial_config(this.fd, data_bits, parity, stop_bits, flow_control)
|
||||||
|
|
||||||
|
fun send(this, data)
|
||||||
|
if (!this.is_open())
|
||||||
|
return -1
|
||||||
|
return serial_send(this.fd, to_string(data))
|
||||||
|
|
||||||
|
fun recv(this, maxlen)
|
||||||
|
if (!this.is_open())
|
||||||
|
return ""
|
||||||
|
return serial_recv(this.fd, to_number(maxlen))
|
||||||
|
|
||||||
|
fun close(this)
|
||||||
|
if (this.is_open())
|
||||||
|
res = serial_close(this.fd)
|
||||||
|
this.fd = 0
|
||||||
|
return res
|
||||||
|
return 0
|
||||||
Loading…
Add table
Add a link
Reference in a new issue