YMODEM은 통신 프로토콜로 테라텀에 기본 내장되어 있어서 바로 사용이 가능
128 바이트 혹은 1024 바이트 단위로 데이터 전송
CRC에 의한 데이터 오류 검출 및 재전송 지원
YMODEM 프로토콜 참고 자료
프로젝트 파일
main.h 에 stdlib.h 헤더 추가
#include <stdbool.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <stdarg.h>
#include <stdlib.h>
ymodem 드라이버 파일 추가
main.c 에서 헤더 추가
#include "uart.h"
#include "ymodem.h"
main.c에서 초기화 추가 하고 기존의 FLASH 테스트 코드는 삭제함
uartInit();
ymodemInit();
syscalls.c 의 USB CDC 전송 함수를 수정한다.
__attribute__((weak)) int _write(int file, char *ptr, int len)
{
(void)file;
uint32_t pre_time;
pre_time = HAL_GetTick();
while(HAL_GetTick()-pre_time < 100)
{
if (CDC_Transmit_HS((uint8_t *)ptr, len) != USBD_BUSY)
{
break;
}
}
return len;
}
테라텀에서 YMODEM 전송시 호출되는 명령 처리 시험
ymodem_t ymodem;
ymodemOpen(&ymodem, _DEF_UART1);
while (1)
{
if (ymodemReceive(&ymodem) == true)
{
switch(ymodem.type)
{
case YMODEM_TYPE_START:
printf("YMODEM_TYPE_START %s %d\\n", ymodem.file_name, (int)ymodem.file_length);
break;
case YMODEM_TYPE_DATA:
printf("YMODEM_TYPE_DATA seq %d len %4d addr %d, %d %%\\n",
ymodem.rx_packet.seq[0],
ymodem.file_buf_length,
(int)(ymodem.file_addr),
(int)(ymodem.file_received*100 / ymodem.file_length));
break;
case YMODEM_TYPE_END:
printf("YMODEM_TYPE_END \\n");
break;
case YMODEM_TYPE_CANCEL:
printf("YMODEM_TYPE_CANCEL \\n");
break;
case YMODEM_TYPE_ERROR:
printf("YMODEM_TYPE_ERROR \\n");
break;
default:
break;
}
ymodemAck(&ymodem);
}