No output on UART Xiao NRF52840 sense + GPS Quectel L76K

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 :smiley:


#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;

        

    }

}
1 Like