#include "uart.h" #include "delay.h" #include "r_cg_adc.h" #include "r_cg_port.h" #define RS485_EN_PORT P4 #define RS485_EN_PM PM4 #define RS485_EN_MASK (0x20U) // P4.5 void rs485_set_tx(uint8_t on) { if (on) RS485_EN_PORT |= RS485_EN_MASK; // EN=1 (TX) else RS485_EN_PORT &= (uint8_t)~RS485_EN_MASK; // EN=0 (RX) } void rs485_init(void) { RS485_EN_PM &= (uint8_t)~RS485_EN_MASK; // 출력 rs485_set_tx(0); // 기본 RX 모드 } /** * 함수명: uart_send_string * 목적: null 종료된 문자열을 UART0로 전송 * * 매개변수: * - str : 전송할 문자열 (C 문자열, '\0'로 종료) * * 반환값: 없음 (void) * * 동작 방식: * 1) 문자열 길이 계산 * - 문자열 끝을 나타내는 '\0'이 나올 때까지 len 증가 * * 2) UART 전송 * - R_UART0_Send() 함수를 사용하여 계산한 길이만큼 문자열 전송 * - (uint8_t *)로 캐스팅하여 바이트 배열 형식 전달 * * 참고: * - null 문자('\0')는 전송되지 않음 * - UART0 초기화와 전송 준비는 별도로 되어 있어야 함 */ // UART0(RS485) void uart_send_string(const char *str) { uint16_t len = 0; while (str[len] != '\0') len++; rs485_set_tx(1); R_UART0_Send((uint8_t *)str, len); } // UART1(PC) void uart1_send_string(const char *str) { uint16_t len = 0; while (str[len] != '\0') len++; R_UART1_Send((uint8_t *)str, len); } /** * 함수명: uart_send_hex * 목적: 8비트 값(uint8_t)을 16진수 문자열로 변환 후 UART0로 전송 * * 매개변수: * - val : 전송할 8비트 값 * * 반환값: 없음 (void) * * 동작 방식: * 1) 상위/하위 4비트 분리 * - high = val >> 4, 상위 4비트 * - low = val & 0x0F, 하위 4비트 * * 2) 16진수 문자로 변환 * - 0~9 → '0'~'9' * - 10~15 → 'A'~'F' * - hex[0] = 상위 4비트 문자 * - hex[1] = 하위 4비트 문자 * * 3) UART 전송 * - R_UART0_Send()를 사용해 2바이트 전송 * * 4) 전송 후 지연 * - delay(10000)으로 약간의 전송 간격 확보 * * 참고: * - 이 함수는 1바이트 값을 항상 2자리 16진수로 표현 * - 예: val = 0xAF → "AF" 전송 */ void uart_send_hex(uint8_t val) { uint8_t hex[2]; uint8_t high = (val >> 4) & 0x0F; uint8_t low = val & 0x0F; hex[0] = (high < 10) ? ('0' + high) : ('A' + (high - 10)); hex[1] = (low < 10) ? ('0' + low) : ('A' + (low - 10)); rs485_set_tx(1); R_UART0_Send(hex, 2); delay(10000); } void uart1_send_hex(uint8_t val) { uint8_t hex[2]; uint8_t high = (val >> 4) & 0x0F; uint8_t low = val & 0x0F; hex[0] = (high < 10) ? ('0' + high) : ('A' + (high - 10)); hex[1] = (low < 10) ? ('0' + low ) : ('A' + (low - 10)); R_UART1_Send(hex, 2); delay(10000); }