[Zephyr] nRF52 Uart 송신, 수신 사용법!!
Embeded/nRF522024. 11. 29. 00:53
반응형
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");
}
반응형
'Embeded > nRF52' 카테고리의 다른 글
[Zephyr] nRF52 타이머(timer) 사용법!! (0) | 2024.11.28 |
---|---|
[Zephyr] nRF52 Thread(쓰레드) 방법!! (0) | 2024.11.28 |
[Zephyr] nRF52 GPIO 입력 제어(인터럽트)!! (0) | 2024.11.28 |
[Zephyr] nRF52 GPIO 입력 제어(폴링)!! (0) | 2024.11.28 |
[Zephyr] nRF52 GPIO 출력 제어!! (0) | 2024.11.28 |