Browse Source

优化修改代码

niujiuru 20 giờ trước cách đây
mục cha
commit
15100ee8b2
1 tập tin đã thay đổi với 22 bổ sung22 xóa
  1. 22 22
      ymodem/ymodem.c

+ 22 - 22
ymodem/ymodem.c

@@ -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;
 }