수신 관련
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
uint16_t CRC_DATA;
uint8_t forcount;
uint16_t checksumcal;
uint8_t temp;
if ((__HAL_UART_GET_IT_SOURCE(&huart1, UART_IT_TXE) != 0) & (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_TXE) != 0) & (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_TC) != 0))
{
if ((uart.TxBuffer[uart.TxCount + 0] == 0x00) & (uart.TxBuffer[uart.TxCount + 1] == 0x00) &
(uart.TxBuffer[uart.TxCount + 2] == 0x00) & (uart.TxBuffer[uart.TxCount + 3] == 0x00) &
(uart.TxBuffer[uart.TxCount + 4] == 0x00) & (uart.TxBuffer[uart.TxCount + 5] == 0x00))
{
__HAL_UART_DISABLE_IT(&huart1, UART_IT_TXE);
memset(uart.TxBuffer, 0, uart.TxCount);
uart.TxCount = 0;
uart.TxEmptyFlag = 1;
HAL_GPIO_WritePin(MAIN_485EN_GPIO_Port, MAIN_485EN_Pin, GPIO_PIN_RESET);
}
else
{
HAL_GPIO_WritePin(MAIN_485EN_GPIO_Port, MAIN_485EN_Pin, GPIO_PIN_SET);
HAL_UART_Transmit(&huart1, &uart.TxBuffer[uart.TxCount], 1, 10);
uart.TxCount++;
}
}
if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE)) //데이터 수신시 실행
{
HAL_UART_Receive(&huart1, &uart.RxBuffer[uart.RxCount++], 1, 10);
__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE);
if (uart.RxBuffer[0] == MY_ID) //ID CHECK
{
if (uart.RxCount == 8)
{
CRC_DATA = CRC16(uart.RxBuffer, 6);
if ((uart.RxBuffer[6] == (CRC_DATA & 0x00FF)) && (uart.RxBuffer[7] == ((CRC_DATA & 0xFF00) >> 8)))
{
memcpy(uart.RxData, uart.RxBuffer, 10);
uart.RxFlag = 1;
memset(&uart.RxBuffer, NULL, UARTBUFFSIZE);
uart.RxCount = 0;
}
else
{
memset(&uart.RxBuffer, NULL, UARTBUFFSIZE);
uart.RxCount = 0;
}
}
}
else
{
memset(&uart.RxBuffer, NULL, UARTBUFFSIZE);
uart.RxCount = 0;
}
}
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
/* USER CODE END USART1_IRQn 1 */
}
송신 관련
void fUartprocess(void)
{
uint16_t CRC_DATA;
uint8_t p[128] = { 0, };
uint16_t START_ADDRESS;
uint8_t command, len;
if (uart.RxFlag == 1)
{
uart.RxFlag = 0;
START_ADDRESS = ((uart.RxData[2] << 8) | uart.RxData[3]);
if (uart.RxData[1] == 0x03) //FUNCTION CHECK
{
uint16_t COUNT = ((uart.RxData[4] << 8) | uart.RxData[5]);
if (COUNT == 1)
{
if (START_ADDRESS == 1100) //Power (State)
{
//memcpy(&uart.TxBuffer, &uart.RxData, 10);
//uart.TxBuffer[1] |= 0x80;
HAL_GPIO_WritePin(MAIN_485EN_GPIO_Port, MAIN_485EN_Pin, GPIO_PIN_SET);
uart.TxBuffer[0] = uart.RxData[0]; //Slave ID
uart.TxBuffer[1] = uart.RxData[1]; //Function Code
uart.TxBuffer[2] = 2; //길이
uart.TxBuffer[3] = 0; //high data
uart.TxBuffer[4] = sys.power; //Low data
CRC_DATA = CRC16(uart.TxBuffer, 5);
uart.TxBuffer[5] = CRC_DATA & 0x00FF; //Checksum Low Data
uart.TxBuffer[6] = (CRC_DATA & 0xFF00) >> 8; //Checksum High Data
__HAL_UART_ENABLE_IT(&huart1, UART_IT_TXE);
}
else if (START_ADDRESS == 1101) //Read (hour)
{
//memcpy(&uart.TxBuffer, &uart.RxData, 10);
//uart.TxBuffer[1] |= 0x80;
HAL_GPIO_WritePin(MAIN_485EN_GPIO_Port, MAIN_485EN_Pin, GPIO_PIN_SET);
uart.TxBuffer[0] = uart.RxData[0]; //Slave ID
uart.TxBuffer[1] = uart.RxData[1]; //Function Code
uart.TxBuffer[2] = 2; //길이
uart.TxBuffer[3] = 0; //high data
uart.TxBuffer[4] = time.hour; //Low data
CRC_DATA = CRC16(uart.TxBuffer, 5);
uart.TxBuffer[5] = CRC_DATA & 0x00FF; //Checksum Low Data
uart.TxBuffer[6] = (CRC_DATA & 0xFF00) >> 8; //Checksum High Data
__HAL_UART_ENABLE_IT(&huart1, UART_IT_TXE);
}
else if (START_ADDRESS == 1102) //READ (Min)
{
HAL_GPIO_WritePin(MAIN_485EN_GPIO_Port, MAIN_485EN_Pin, GPIO_PIN_SET);
uart.TxBuffer[0] = uart.RxData[0]; //Slave ID
uart.TxBuffer[1] = uart.RxData[1]; //Function Code
uart.TxBuffer[2] = 2; //길이
uart.TxBuffer[3] = 0; //high data
uart.TxBuffer[4] = time.min; //Low data
CRC_DATA = CRC16(uart.TxBuffer, 5);
uart.TxBuffer[5] = CRC_DATA & 0x00FF; //Checksum Low Data
uart.TxBuffer[6] = (CRC_DATA & 0xFF00) >> 8; //Checksum High Data
__HAL_UART_ENABLE_IT(&huart1, UART_IT_TXE);
}
}
else if (COUNT == 3)
{
HAL_GPIO_WritePin(MAIN_485EN_GPIO_Port, MAIN_485EN_Pin, GPIO_PIN_SET);
uart.TxBuffer[0] = uart.RxData[0]; //Slave ID
uart.TxBuffer[1] = uart.RxData[1]; //Function Code
uart.TxBuffer[2] = 6; //길이
uart.TxBuffer[3] = 0; //high data
uart.TxBuffer[4] = sys.power; //Low data
uart.TxBuffer[5] = 0; //high data
uart.TxBuffer[6] = time.hour; //Low data
uart.TxBuffer[7] = 0; //high data
uart.TxBuffer[8] = time.min; //Low data
CRC_DATA = CRC16(uart.TxBuffer, 9);
uart.TxBuffer[9] = CRC_DATA & 0x00FF; //Checksum Low Data
uart.TxBuffer[10] = (CRC_DATA & 0xFF00) >> 8; //Checksum High Data
__HAL_UART_ENABLE_IT(&huart1, UART_IT_TXE);
}
}
else if (uart.RxData[1] == 0x06) //FUNCTION CHECK
{
if (START_ADDRESS == 1100)
{
HAL_GPIO_WritePin(MAIN_485EN_GPIO_Port, MAIN_485EN_Pin, GPIO_PIN_SET);
uint16_t COUNT = ((uart.RxData[4] << 8) | uart.RxData[5]);
if (COUNT == 0)
{
sys.power = 0;
}
else
{
sys.power = 1;
}
memcpy(&uart.TxBuffer, &uart.RxData, 10);
//uart.TxBuffer[1] |= 0x80;
CRC_DATA = CRC16(uart.TxBuffer, 6);
uart.TxBuffer[6] = CRC_DATA & 0x00FF;
uart.TxBuffer[7] = (CRC_DATA & 0xFF00) >> 8;
__HAL_UART_ENABLE_IT(&huart1, UART_IT_TXE);
}
else if (START_ADDRESS == 1101)
{
HAL_GPIO_WritePin(MAIN_485EN_GPIO_Port, MAIN_485EN_Pin, GPIO_PIN_SET);
uint16_t COUNT = ((uart.RxData[4] << 8) | uart.RxData[5]);
if (COUNT > 23)
{
COUNT = 0;
}
time.hour = COUNT;
DS1307_SetHour(time.hour);
DS1307_SetSecond(0);
memcpy(&uart.TxBuffer, &uart.RxData, 10);
//uart.TxBuffer[1] |= 0x80;
CRC_DATA = CRC16(uart.TxBuffer, 6);
uart.TxBuffer[6] = CRC_DATA & 0x00FF;
uart.TxBuffer[7] = (CRC_DATA & 0xFF00) >> 8;
__HAL_UART_ENABLE_IT(&huart1, UART_IT_TXE);
}
else if (START_ADDRESS == 1102)
{
HAL_GPIO_WritePin(MAIN_485EN_GPIO_Port, MAIN_485EN_Pin, GPIO_PIN_SET);
uint16_t COUNT = ((uart.RxData[4] << 8) | uart.RxData[5]);
if (COUNT > 59)
{
COUNT = 0;
}
time.min = COUNT;
DS1307_SetMinute(time.min);
DS1307_SetSecond(0);
memcpy(&uart.TxBuffer, &uart.RxData, 10);
//uart.TxBuffer[1] |= 0x80;
CRC_DATA = CRC16(uart.TxBuffer, 6);
uart.TxBuffer[6] = CRC_DATA & 0x00FF;
uart.TxBuffer[7] = (CRC_DATA & 0xFF00) >> 8;
__HAL_UART_ENABLE_IT(&huart1, UART_IT_TXE);
}
}
//fUartTxprocess(command, len, p);
}
}
CRC 관련
uint16_t CRC16(uint8_t* puchMsg, uint8_t usDataLen)
{
uint8_t i;
uint16_t crc, flag;
crc = 0xffff;
while (usDataLen--)
{
crc ^= *puchMsg++;
for (i = 0; i < 8; i++)
{
flag = crc & 0x0001;
crc >>= 1;
if (flag) crc ^= POLYNORMIAL;
}
}
return crc;
}
선언값
#define MY_ID 11
#define POLYNORMIAL 0xA001
'잡동사니' 카테고리의 다른 글
W7500 Serial UART to Ethernet Module 사용 (0) | 2023.12.23 |
---|---|
SYNOLOGY NAS 외부 네트워크 드라이브 연결 (0) | 2023.12.13 |
SYNOLOGY NAS 네트워크 드라이브 연결 방법 (0) | 2023.12.12 |
MODBUS 프로토콜 (0) | 2023.11.17 |
믹서기 테스트 (0) | 2023.06.10 |