|
|
@@ -48,16 +48,16 @@ typedef struct
|
|
|
{
|
|
|
void *h; RingBuf rx_buf;
|
|
|
RingBufElement rx_buf_storage[2*(PACKET_1K_SIZE+PACKET_OVERHEAD)]; // 最大缓存2包数据
|
|
|
-} SYmodemUart;
|
|
|
+} SYmodemCom;
|
|
|
|
|
|
-static SYmodemUart s_myUart;
|
|
|
+static SYmodemCom s_myCom;
|
|
|
|
|
|
static int uart_getchar(int timeout_ms)
|
|
|
{
|
|
|
RingBufElement val; unsigned long stime, now;
|
|
|
if(timeout_ms >= 0) xgettickcount(&stime);
|
|
|
while(1) {
|
|
|
- if(RingBuf_get(&s_myUart.rx_buf, &val)) return (int)val;
|
|
|
+ if(RingBuf_get(&s_myCom.rx_buf, &val)) return (int)val;
|
|
|
if(timeout_ms >= 0) {
|
|
|
xgettickcount(&now);
|
|
|
if((now - stime) >= (unsigned long)timeout_ms) return -1; // timeout
|
|
|
@@ -69,7 +69,7 @@ static int uart_getchar(int timeout_ms)
|
|
|
static void uart_putchar(int c)
|
|
|
{
|
|
|
unsigned char ch = (unsigned char)c;
|
|
|
- serial_send_data(s_myUart.h, &ch, 1);
|
|
|
+ serial_send_data(s_myCom.h, &ch, 1);
|
|
|
}
|
|
|
|
|
|
/* returns 0 on success, 1 on corrupt packet, -1 on error (timeout): */
|
|
|
@@ -119,7 +119,7 @@ static int receive_packet(unsigned char *data, int *length)
|
|
|
|
|
|
static int comio_data_recv_proc(unsigned long wParam/*传递打开的串口句柄*/, unsigned long lParam/*保留暂未使用*/)
|
|
|
{
|
|
|
- SYmodemUart *pComIO = &s_myUart; void *pSerial = pComIO->h;
|
|
|
+ SYmodemCom *pComIO = &s_myCom; void *pSerial = pComIO->h;
|
|
|
const unsigned char *pRecvBuf = serial_get_recv_buffer(pSerial); int nRecvBytes = serial_get_recv_buffer_bytes(pSerial);
|
|
|
const char *send_log_prefix = serial_get_log_prefix(pSerial); RingBufElement val = pRecvBuf[nRecvBytes - 1]; // 取出1字节数据
|
|
|
if(!RingBuf_put(&pComIO->rx_buf, val)) {
|
|
|
@@ -139,19 +139,19 @@ int ymodem_recv_files(const char *dir)
|
|
|
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));
|
|
|
- s_myUart.h = serial_open(UART_DEVICE_NAME, UART_BAUD_RATE, UART_PARITY_CHECK, \
|
|
|
+ RingBuf_ctor(&s_myCom.rx_buf, s_myCom.rx_buf_storage, sizeof(s_myCom.rx_buf_storage)/sizeof(RingBufElement));
|
|
|
+ s_myCom.h = serial_open(UART_DEVICE_NAME, UART_BAUD_RATE, UART_PARITY_CHECK, \
|
|
|
comio_data_recv_proc, NULL, NULL);
|
|
|
- if(!s_myUart.h) return -1;
|
|
|
+ if(!s_myCom.h) return -1;
|
|
|
|
|
|
file_name[0] = '\0'; first_try = 1; ret = files_num = 0;
|
|
|
- for(session_done = 0, errors = 0, waits = 0; serial_recvThrd_isAlive(s_myUart.h); )
|
|
|
- { // receive files
|
|
|
+ for(session_done = 0, errors = 0, waits = 0; serial_recvThrd_isAlive(s_myCom.h); )
|
|
|
+ { // 批量的接收文件
|
|
|
if(!first_try) uart_putchar(CRC);
|
|
|
first_try = 0;
|
|
|
|
|
|
- for(packets_received = 0, file_done = 0; serial_recvThrd_isAlive(s_myUart.h); )
|
|
|
- { // receive packets
|
|
|
+ for(packets_received = 0, file_done = 0; serial_recvThrd_isAlive(s_myCom.h); )
|
|
|
+ { // 接收单个文件
|
|
|
switch(receive_packet(packet_data, &packet_length))
|
|
|
{
|
|
|
case 0: // receive success
|
|
|
@@ -213,7 +213,7 @@ int ymodem_recv_files(const char *dir)
|
|
|
}
|
|
|
|
|
|
ret_p:
|
|
|
- if(s_myUart.h) serial_close(s_myUart.h, WAITTHRD_SAFEEXIT_TIMEOUT);
|
|
|
+ if(s_myCom.h) serial_close(s_myCom.h, WAITTHRD_SAFEEXIT_TIMEOUT);
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
@@ -235,7 +235,7 @@ static void send_packet(unsigned char *data, int block_no)
|
|
|
}
|
|
|
|
|
|
/* Send block 0 (the filename block). filename might be truncated to fit. */
|
|
|
-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)
|
|
|
{
|
|
|
unsigned long count = 0; unsigned char zero_block[PACKET_SIZE];
|
|
|
@@ -333,10 +333,10 @@ int ymodem_send_file(const char *path)
|
|
|
|
|
|
if(sw_file_load(path, "rb", file_buf, file_size) != file_size) { ret = -4; goto ret_p; }
|
|
|
|
|
|
- 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, \
|
|
|
+ RingBuf_ctor(&s_myCom.rx_buf, s_myCom.rx_buf_storage, sizeof(s_myCom.rx_buf_storage)/sizeof(RingBufElement));
|
|
|
+ s_myCom.h = serial_open(UART_DEVICE_NAME, UART_BAUD_RATE, UART_PARITY_CHECK, \
|
|
|
comio_data_recv_proc, NULL, NULL);
|
|
|
- if(!s_myUart.h) { ret = -5; goto ret_p; }
|
|
|
+ if(!s_myCom.h) { ret = -5; goto ret_p; }
|
|
|
|
|
|
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; }
|
|
|
@@ -348,14 +348,14 @@ int ymodem_send_file(const char *path)
|
|
|
if(ch == ACK)
|
|
|
{
|
|
|
ch = uart_getchar(PACKET_TIMEOUT);
|
|
|
- if(ch == CRC) { ret = send_data_packets((unsigned char *)file_buf, file_size); if(ret < 0) { ret += -7; } break; }
|
|
|
+ if(ch == CRC) { ret = send_data_packets((unsigned char *)file_buf, file_size); if(ret < 0) { ret += -7; } goto ret_p; }
|
|
|
}
|
|
|
- else if((ch == CRC) && (crc_nak)) { crc_nak = 0; continue; } // 接收到CRC, 重发一次0包
|
|
|
- else if((ch != NAK) || (crc_nak)) { sw_log_error("[%s] %s 接收到错误应答: 0x%02X", UART_MODULE_NAME, send_log_prefix, ch); break; } // 接收到NAK, 需要重发一次0包
|
|
|
- } while(++retry < MAX_ERRORS && serial_recvThrd_isAlive(s_myUart.h));
|
|
|
+ else if((ch == CRC) && (crc_nak)) { crc_nak = 0; continue; } // 发送0包后, 接收到CRC, 重新开始一次发送(加强容错)
|
|
|
+ else if((ch != NAK) || (crc_nak)) { sw_log_error("[%s] %s 接收到错误应答: 0x%02X", UART_MODULE_NAME, send_log_prefix, ch); goto ret_p; } // 发送0包后, 接收到NAK, 重新开始发送
|
|
|
+ } while(++retry < MAX_ERRORS && serial_recvThrd_isAlive(s_myCom.h));
|
|
|
|
|
|
ret_p:
|
|
|
if(file_buf) free(file_buf);
|
|
|
- if(s_myUart.h) serial_close(s_myUart.h, WAITTHRD_SAFEEXIT_TIMEOUT);
|
|
|
+ if(s_myCom.h) serial_close(s_myCom.h, WAITTHRD_SAFEEXIT_TIMEOUT);
|
|
|
return ret;
|
|
|
}
|