|
@@ -135,9 +135,9 @@ int ymodem_recv_files(const char *dir)
|
|
|
{
|
|
{
|
|
|
unsigned char packet_data[PACKET_1K_SIZE + PACKET_OVERHEAD];
|
|
unsigned char packet_data[PACKET_1K_SIZE + PACKET_OVERHEAD];
|
|
|
int packet_length, i, file_done, session_done, ret;
|
|
int packet_length, i, file_done, session_done, ret;
|
|
|
- unsigned int packets_received, errors, first_try, files_num;
|
|
|
|
|
- char file_name[FILE_NAME_LENGTH], file_size[FILE_SIZE_LENGTH], *file_ptr;
|
|
|
|
|
- unsigned char block[PACKET_1K_SIZE]; unsigned int file_size_val = 0; char path[MAX_PATH_CHARS];
|
|
|
|
|
|
|
+ unsigned int packets_received, errors, waits, first_try, files_num;
|
|
|
|
|
+ char file_name[FILE_NAME_LENGTH], file_size[FILE_SIZE_LENGTH], *file_ptr, path[MAX_PATH_CHARS];
|
|
|
|
|
+ unsigned char file_data[PACKET_1K_SIZE]; unsigned int file_size1 = 0, file_size2 = 0;
|
|
|
|
|
|
|
|
RingBuf_ctor(&s_myUart.rx_buf, s_myUart.rx_buf_storage, sizeof(s_myUart.rx_buf_storage)/sizeof(RingBufElement));
|
|
RingBuf_ctor(&s_myUart.rx_buf, s_myUart.rx_buf_storage, sizeof(s_myUart.rx_buf_storage)/sizeof(RingBufElement));
|
|
|
s_myUart.h = serial_open(UART_DEVICE_NAME, UART_BAUD_RATE, UART_PARITY_CHECK, \
|
|
s_myUart.h = serial_open(UART_DEVICE_NAME, UART_BAUD_RATE, UART_PARITY_CHECK, \
|
|
@@ -145,7 +145,7 @@ int ymodem_recv_files(const char *dir)
|
|
|
if(!s_myUart.h) return -1;
|
|
if(!s_myUart.h) return -1;
|
|
|
|
|
|
|
|
file_name[0] = '\0'; first_try = 1; ret = files_num = 0;
|
|
file_name[0] = '\0'; first_try = 1; ret = files_num = 0;
|
|
|
- for(session_done = 0, errors = 0; serial_recvThrd_isAlive(s_myUart.h); )
|
|
|
|
|
|
|
+ for(session_done = 0, errors = 0, waits = 0; serial_recvThrd_isAlive(s_myUart.h); )
|
|
|
{ // receive files
|
|
{ // receive files
|
|
|
if(!first_try) uart_putchar(CRC);
|
|
if(!first_try) uart_putchar(CRC);
|
|
|
first_try = 0;
|
|
first_try = 0;
|
|
@@ -156,6 +156,7 @@ int ymodem_recv_files(const char *dir)
|
|
|
{
|
|
{
|
|
|
case 0: // receive success
|
|
case 0: // receive success
|
|
|
if(errors != 0) errors = 0;
|
|
if(errors != 0) errors = 0;
|
|
|
|
|
+ if(waits != 0) waits = 0;
|
|
|
switch(packet_length)
|
|
switch(packet_length)
|
|
|
{
|
|
{
|
|
|
case -1: { uart_putchar(ACK); ret = -2; goto ret_p; } // abort
|
|
case -1: { uart_putchar(ACK); ret = -2; goto ret_p; } // abort
|
|
@@ -170,11 +171,11 @@ int ymodem_recv_files(const char *dir)
|
|
|
file_name[i++] = '\0'; // 接收的文件名称
|
|
file_name[i++] = '\0'; // 接收的文件名称
|
|
|
for(++file_ptr, i = 0; *file_ptr != ' ' && i < FILE_SIZE_LENGTH; ) file_size[i++] = *file_ptr++;
|
|
for(++file_ptr, i = 0; *file_ptr != ' ' && i < FILE_SIZE_LENGTH; ) file_size[i++] = *file_ptr++;
|
|
|
file_size[i++] = '\0'; // 接收的文件大小
|
|
file_size[i++] = '\0'; // 接收的文件大小
|
|
|
- file_size_val = str_to_u32(file_size);
|
|
|
|
|
|
|
+ file_size1 = str_to_u32(file_size); file_size2 = 0;
|
|
|
|
|
|
|
|
uart_putchar(ACK); uart_putchar(CRC);
|
|
uart_putchar(ACK); uart_putchar(CRC);
|
|
|
|
|
|
|
|
- sw_log_debug("[%s] <文件: %s, 大小: %u字节> 开始接收...", UART_MODULE_NAME, file_name, file_size_val);
|
|
|
|
|
|
|
+ sw_log_debug("[%s] <文件: %s, 大小: %u字节> 开始接收...", UART_MODULE_NAME, file_name, file_size1);
|
|
|
snprintf(path, sizeof(path), "%s/%s", dir, file_name);
|
|
snprintf(path, sizeof(path), "%s/%s", dir, file_name);
|
|
|
if(sw_file_exists(path)) sw_file_delete(path);
|
|
if(sw_file_exists(path)) sw_file_delete(path);
|
|
|
}
|
|
}
|
|
@@ -185,24 +186,27 @@ int ymodem_recv_files(const char *dir)
|
|
|
}
|
|
}
|
|
|
else
|
|
else
|
|
|
{
|
|
{
|
|
|
- for(i = 0; i < packet_length; i++) { block[i] = packet_data[PACKET_HEADER+i]; }
|
|
|
|
|
|
|
+ for(i = 0; i < packet_length; i++) { file_data[i] = packet_data[PACKET_HEADER+i]; }
|
|
|
uart_putchar(ACK);
|
|
uart_putchar(ACK);
|
|
|
sw_log_debug("[%s] <文件: %s, 大小: %u字节> 收到第%u包数据, 数据包大小: %u字节", \
|
|
sw_log_debug("[%s] <文件: %s, 大小: %u字节> 收到第%u包数据, 数据包大小: %u字节", \
|
|
|
- UART_MODULE_NAME, file_name, file_size_val, packets_received, packet_length);
|
|
|
|
|
|
|
+ UART_MODULE_NAME, file_name, file_size1, packets_received, packet_length);
|
|
|
|
|
|
|
|
if(!sw_dir_exists(dir)) sw_dir_create(dir);
|
|
if(!sw_dir_exists(dir)) sw_dir_create(dir);
|
|
|
- ret = sw_file_update(path, "ab", (char *)block, packet_length);
|
|
|
|
|
|
|
+ if((file_size1-file_size2) < packet_length) packet_length = (file_size1-file_size2); // 最后一包数据可能小于PACKET_1K_SIZE
|
|
|
|
|
+ ret = sw_file_update(path, "ab", (char *)file_data, packet_length);
|
|
|
if(ret != packet_length) { uart_putchar(CAN); uart_putchar(CAN); ret = -3; goto ret_p; }
|
|
if(ret != packet_length) { uart_putchar(CAN); uart_putchar(CAN); ret = -3; goto ret_p; }
|
|
|
|
|
+ file_size2 += ret;
|
|
|
}
|
|
}
|
|
|
++packets_received; // 累加已接收包数
|
|
++packets_received; // 累加已接收包数
|
|
|
}
|
|
}
|
|
|
break;
|
|
break;
|
|
|
default: // receive error
|
|
default: // receive error
|
|
|
if(packets_received != 0) { if(++errors >= MAX_ERRORS/* too many errors */) { uart_putchar(CAN); uart_putchar(CAN); ret = -4; goto ret_p; } }
|
|
if(packets_received != 0) { if(++errors >= MAX_ERRORS/* too many errors */) { uart_putchar(CAN); uart_putchar(CAN); ret = -4; goto ret_p; } }
|
|
|
|
|
+ else { if(++waits >= MAX_START_WAITS) { uart_putchar(CAN); uart_putchar(CAN); ret = -5; goto ret_p; } } // 等待超时, 发送端一直没有开始发送则退出
|
|
|
uart_putchar(CRC);
|
|
uart_putchar(CRC);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if(file_done) { if(!session_done) sw_log_debug("[%s] 文件: %s 接收完成, 实际接收文件大小: %u字节", UART_MODULE_NAME, file_name, sw_file_getSize(path)); break; } // 文件接收完成
|
|
|
|
|
|
|
+ if(file_done) { if(!session_done) sw_log_debug("[%s] 文件: %s 接收完成, 实际接收文件的大小: %u字节", UART_MODULE_NAME, file_name, sw_file_getSize(path)); break; } // 文件接收完成
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if(session_done) { ret = files_num; break; } // 传输会话结束
|
|
if(session_done) { ret = files_num; break; } // 传输会话结束
|
|
@@ -234,20 +238,20 @@ static void send_packet(unsigned char *data, int block_no)
|
|
|
static char send_log_prefix[MAX_LINE_CHARS];
|
|
static char send_log_prefix[MAX_LINE_CHARS];
|
|
|
static void send_packet0(char *filename, unsigned long size)
|
|
static void send_packet0(char *filename, unsigned long size)
|
|
|
{
|
|
{
|
|
|
- unsigned long count = 0; unsigned char block[PACKET_SIZE];
|
|
|
|
|
|
|
+ unsigned long count = 0; unsigned char zero_block[PACKET_SIZE];
|
|
|
const char *num; const char *str = (filename ? filename : "null");
|
|
const char *num; const char *str = (filename ? filename : "null");
|
|
|
|
|
|
|
|
if(filename) {
|
|
if(filename) {
|
|
|
- while(*filename && (count < PACKET_SIZE-FILE_SIZE_LENGTH-2)) block[count++] = *filename++;
|
|
|
|
|
- block[count++] = 0;
|
|
|
|
|
|
|
+ while(*filename && (count < PACKET_SIZE-FILE_SIZE_LENGTH-2)) zero_block[count++] = *filename++;
|
|
|
|
|
+ zero_block[count++] = 0;
|
|
|
|
|
|
|
|
num = u32_to_str(size);
|
|
num = u32_to_str(size);
|
|
|
- while(*num) block[count++] = *num++;
|
|
|
|
|
|
|
+ while(*num) zero_block[count++] = *num++;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- while(count < PACKET_SIZE) block[count++] = 0;
|
|
|
|
|
|
|
+ while(count < PACKET_SIZE) zero_block[count++] = 0;
|
|
|
|
|
|
|
|
- send_packet(block, 0);
|
|
|
|
|
|
|
+ send_packet(zero_block, 0);
|
|
|
snprintf(send_log_prefix, sizeof(send_log_prefix), "<文件: %s, 大小: %lu字节>", str, size);
|
|
snprintf(send_log_prefix, sizeof(send_log_prefix), "<文件: %s, 大小: %lu字节>", str, size);
|
|
|
sw_log_debug("[%s] %s 开始发送...", UART_MODULE_NAME, send_log_prefix);
|
|
sw_log_debug("[%s] %s 开始发送...", UART_MODULE_NAME, send_log_prefix);
|
|
|
}
|
|
}
|
|
@@ -255,12 +259,17 @@ static void send_packet0(char *filename, unsigned long size)
|
|
|
static long send_data_packets(unsigned char *data, unsigned long size)
|
|
static long send_data_packets(unsigned char *data, unsigned long size)
|
|
|
{
|
|
{
|
|
|
int blockno = 1; unsigned long send_size; int ch, retry = 0;
|
|
int blockno = 1; unsigned long send_size; int ch, retry = 0;
|
|
|
- unsigned long total_sent = 0;
|
|
|
|
|
|
|
+ unsigned long total_sent = 0; unsigned char last_block[PACKET_1K_SIZE];
|
|
|
|
|
|
|
|
while(size > 0)
|
|
while(size > 0)
|
|
|
{
|
|
{
|
|
|
- if(size > PACKET_1K_SIZE) send_size = PACKET_1K_SIZE;
|
|
|
|
|
- else send_size = size;
|
|
|
|
|
|
|
+ if(size >= PACKET_1K_SIZE) send_size = PACKET_1K_SIZE;
|
|
|
|
|
+ else
|
|
|
|
|
+ { // 最后一包
|
|
|
|
|
+ memset(last_block, 0x1A, sizeof(last_block));
|
|
|
|
|
+ memcpy(last_block, data, size);
|
|
|
|
|
+ send_size = size; data = last_block;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
send_packet(data, blockno);
|
|
send_packet(data, blockno);
|
|
|
sw_log_debug("[%s] %s 已发送第%u包数据, 数据包大小: %lu字节", UART_MODULE_NAME, send_log_prefix, blockno, send_size);
|
|
sw_log_debug("[%s] %s 已发送第%u包数据, 数据包大小: %lu字节", UART_MODULE_NAME, send_log_prefix, blockno, send_size);
|
|
@@ -287,7 +296,7 @@ static long send_data_packets(unsigned char *data, unsigned long size)
|
|
|
|
|
|
|
|
retry = 0; do {
|
|
retry = 0; do {
|
|
|
uart_putchar(EOT);
|
|
uart_putchar(EOT);
|
|
|
- sw_log_debug("[%s] %s 文件发送已完成, 实际发送字节数: %lu字节", UART_MODULE_NAME, send_log_prefix, total_sent);
|
|
|
|
|
|
|
+ sw_log_debug("[%s] %s 文件发送完成, 实际发送的字节数: %lu字节", UART_MODULE_NAME, send_log_prefix, total_sent);
|
|
|
ch = uart_getchar(PACKET_TIMEOUT);
|
|
ch = uart_getchar(PACKET_TIMEOUT);
|
|
|
} while((ch != ACK) && (ch != -1) && (++retry < MAX_ERRORS));
|
|
} while((ch != ACK) && (ch != -1) && (++retry < MAX_ERRORS));
|
|
|
|
|
|
|
@@ -329,7 +338,7 @@ int ymodem_send_file(const char *path)
|
|
|
comio_data_recv_proc, NULL, NULL);
|
|
comio_data_recv_proc, NULL, NULL);
|
|
|
if(!s_myUart.h) { ret = -5; goto ret_p; }
|
|
if(!s_myUart.h) { ret = -5; goto ret_p; }
|
|
|
|
|
|
|
|
- retry = 0; do { ch = uart_getchar(PACKET_TIMEOUT); } while(ch != CRC && ++retry < 30); // 等待接收CRC, 而后才开始发送文件
|
|
|
|
|
|
|
+ retry = 0; do { ch = uart_getchar(PACKET_TIMEOUT); } while(ch != CRC && ++retry < MAX_START_WAITS); // 等待接收CRC, 而后才开始发送文件
|
|
|
if(ch != CRC) { uart_putchar(CAN); uart_putchar(CAN); ret = -6; goto ret_p; }
|
|
if(ch != CRC) { uart_putchar(CAN); uart_putchar(CAN); ret = -6; goto ret_p; }
|
|
|
|
|
|
|
|
retry = 0; do
|
|
retry = 0; do
|