Great news after checking example from Nordic dev and some vibe coding of which I’m not proud tbh I’ve managed to read from uart successfully ![]()
#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <zephyr/drivers/uart.h>
#include <zephyr/sys/printk.h>
#include <zephyr/drivers/sensor.h>
#include <string.h>
#define UART_DEVICE_NODE DT_NODELABEL(uart0)
#define IMU_NODE DT_ALIAS(imu0)
#define MSG_SIZE 32
static const struct device *const uart_dev = DEVICE_DT_GET(UART_DEVICE_NODE);
static const struct device *imu = DEVICE_DT_GET(IMU_NODE);
static int print_samples;
static int lsm6dsl_trig_cnt;
static struct sensor_value accel_x_out, accel_y_out, accel_z_out;
static struct sensor_value gyro_x_out, gyro_y_out, gyro_z_out;
/* blocking read of single char */
static char uart_getc_blocking(void)
{
char c;
while (uart_poll_in(uart_dev, &c) != 0) {
k_sleep(K_MSEC(1));
}
return c;
}
/* read full line (ending with \n or \r) */
static void uart_read_line(char *buf, size_t max_len)
{
size_t pos = 0;
while (1) {
char c = uart_getc_blocking();
if (c == '\r' || c == '\n') {
buf[pos] = '\0';
return;
}
if (pos < max_len - 1) {
buf[pos++] = c;
}
}
}
/* optional: send string */
static void uart_send_string(const char *buf)
{
while (*buf) {
uart_poll_out(uart_dev, *buf++);
}
}
#ifdef CONFIG_LSM6DSL_TRIGGER
static void lsm6dsl_trigger_handler(const struct device *dev,
const struct sensor_trigger *trig)
{
static struct sensor_value accel_x, accel_y, accel_z;
static struct sensor_value gyro_x, gyro_y, gyro_z;
lsm6dsl_trig_cnt++;
sensor_sample_fetch_chan(dev, SENSOR_CHAN_ACCEL_XYZ);
sensor_channel_get(dev, SENSOR_CHAN_ACCEL_X, &accel_x);
sensor_channel_get(dev, SENSOR_CHAN_ACCEL_Y, &accel_y);
sensor_channel_get(dev, SENSOR_CHAN_ACCEL_Z, &accel_z);
/* lsm6dsl gyro */
sensor_sample_fetch_chan(dev, SENSOR_CHAN_GYRO_XYZ);
sensor_channel_get(dev, SENSOR_CHAN_GYRO_X, &gyro_x);
sensor_channel_get(dev, SENSOR_CHAN_GYRO_Y, &gyro_y);
sensor_channel_get(dev, SENSOR_CHAN_GYRO_Z, &gyro_z);
if (print_samples) {
print_samples = 0;
accel_x_out = accel_x;
accel_y_out = accel_y;
accel_z_out = accel_z;
gyro_x_out = gyro_x;
gyro_y_out = gyro_y;
gyro_z_out = gyro_z;
}
}
#endif
int main(void)
{
// uart_send_string("OK\r\n");
char rx_buf[MSG_SIZE];
if (!device_is_ready(uart_dev)) {
printk("UART0 not ready!\n");
return 0;
}
if (!device_is_ready(imu)) {
printk("sensor: device not ready.\n");
return 0;
}
struct sensor_value odr_attr;
char out_str[64];
/* high-performance mode is valid for all ODRs (from 12.5 Hz up to 6.66 kHz). */
/* set accel/gyro sampling frequency to 104 */
odr_attr.val1 = 104;
odr_attr.val2 = 0;
if (sensor_attr_set(imu, SENSOR_CHAN_ACCEL_XYZ,
SENSOR_ATTR_SAMPLING_FREQUENCY, &odr_attr) < 0) {
printk("Cannot set sampling frequency for accelerometer.\n");
return 0;
}
if (sensor_attr_set(imu, SENSOR_CHAN_GYRO_XYZ,
SENSOR_ATTR_SAMPLING_FREQUENCY, &odr_attr) < 0) {
printk("Cannot set sampling frequency for gyro.\n");
return 0;
}
#ifdef CONFIG_LSM6DSL_TRIGGER
struct sensor_trigger trig;
trig.type = SENSOR_TRIG_DATA_READY;
trig.chan = SENSOR_CHAN_ACCEL_XYZ;
if (sensor_trigger_set(imu, &trig, lsm6dsl_trigger_handler) != 0) {
printk("Could not set sensor type and channel\n");
return 0;
}
#endif
if (sensor_sample_fetch(imu) < 0) {
printk("Sensor sample update error\n");
return 0;
}
printk("UART0 synchronous receiver started\n");
while (1) {
uart_read_line(rx_buf, sizeof(rx_buf));
printk("RX: %s\n", rx_buf);
printf("LSM6DSL sensor samples:\n\n");
sprintf(out_str, "accel x:%f ms/2 y:%f ms/2 z:%f ms/2",
sensor_value_to_double(&accel_x_out),
sensor_value_to_double(&accel_y_out),
sensor_value_to_double(&accel_z_out));
printk("%s\n", out_str);
/* lsm6dsl gyro */
sprintf(out_str, "gyro x:%f dps y:%f dps z:%f dps",
sensor_value_to_double(&gyro_x_out),
sensor_value_to_double(&gyro_y_out),
sensor_value_to_double(&gyro_z_out));
printk("%s\n", out_str);
print_samples = 1;
}
}