...

반응형

uart로 데이터를 보내고 인터럽트로 받은 데이터를 다시 uart로 전송하는 코드입니다
전송이 동기로 보내는 방식인데 uart_tx() 함수가 비동기로 보내는 함수가 있는데 제가 가진 보드에서는 ENOTSUP 에러가 자꾸 뜨네요 이 부분도 나중에 다시 확인 테스트 해봐야 되겠네요
prj.conf에 uart 관련 옵션을 켜야 됩니다
CONFIG_SERIAL=y
CONFIG_UART_INTERRUPT_DRIVEN=y

#include <stdio.h>
#include <zephyr/kernel.h>
#include <zephyr/drivers/gpio.h>
#include <zephyr/logging/log.h>
#include <zephyr/drivers/uart.h>
#include <string.h>


// 디바이스 트리에서 정의된 uart 사용
#define UART_DEVICE_NODE DT_CHOSEN(zephyr_shell_uart)

// uart 개체 가져오기
static const struct device *const uart_dev = DEVICE_DT_GET(UART_DEVICE_NODE);

// uart 수신 콜백함수
void uart_rx_interrupt(const struct device *dev, void *user_data)
{
	uint8_t c;

	if (!uart_irq_update(uart_dev)) {
		return;
	}

	if (!uart_irq_rx_ready(uart_dev)) {
		return;
	}

	while (uart_fifo_read(uart_dev, &c, 1) == 1) {
		uart_poll_out(uart_dev, c);
	}
}

void uart_tx_string(char *buf)
{
	int msg_len = strlen(buf);

	for (int i = 0; i < msg_len; i++) {
		uart_poll_out(uart_dev, buf[i]);
	}
}

int main(void)
{
	// uart 장비가 준비되었는지 확인
	if (!device_is_ready(uart_dev)) {
		printk("UART device not found!");
		return 0;
	}

	// uart 인터럽트 콜백 설정
	int ret = uart_irq_callback_user_data_set(uart_dev, uart_rx_interrupt, NULL);

	if (ret < 0) {
		if (ret == -ENOTSUP) {
			printk("Interrupt-driven UART API support not enabled\n");
		} else if (ret == -ENOSYS) {
			printk("UART device does not support interrupt-driven API\n");
		} else {
			printk("Error setting UART callback: %d\n", ret);
		}
		return 0;
	}
	// uart rx 인터럽트 활성화
	uart_irq_rx_enable(uart_dev);

	uart_tx_string("uart send test");
}
반응형