 
        
        
    | 本帖最后由 hpdell 于 2017-12-16 14:42 编辑 请教下,使用tftP 升级固件,数据发送返回错误 ? tftp 使用的 是 tftpd32.452 这个版本的   有谁知道是怎么回事莫 ??   使用 http 更新固件,完全正常 static void IAP_tftp_recv_callback(void *arg, struct udp_pcb *upcb, struct pbuf *pkt_buf,                         const ip_addr_t *addr, u16_t port) {   tftp_opcode op;   struct udp_pcb *upcb_tftp_data;   err_t err;   uint32_t i;   char filename[40],message[40], *ptr;   /* create new UDP PCB structure */   upcb_tftp_data = udp_new();   if (!upcb_tftp_data)   {     /* Error creating PCB. Out of Memory  */     printf("Can not create pcb 1\r\n");     __LTDC_drv->LTDC_DispStringAt(12, 180,                                    LCD_COLOR_RED,                                    LCD_COLOR_WHITE,                                    &FontAscii8x16,                              (const uint8_t *)"Can not create pcb 1");     return;   }   /* bind to port 0 to receive next available free port */   /* NOTE:  This is how TFTP works.  There is a UDP PCB for the standard port   * 69 which al transactions begin communication on, however, _all_ subsequent   * transactions for a given "stream" occur on another port  */   err = udp_bind(upcb_tftp_data, IP_ADDR_ANY, 0);   if (err != ERR_OK)   {     /* Unable to bind to port */     printf("Can not create pcb 2\r\n");     __LTDC_drv->LTDC_DispStringAt(12, 200,                                    LCD_COLOR_RED,                                    LCD_COLOR_WHITE,                                    &FontAscii8x16,                              (const uint8_t *)"Can not create pcb 2");     return;   }   op = IAP_tftp_decode_op(pkt_buf->payload);   if (op != TFTP_WRQ)     // op 实际返回的值为 1,而这个 TFTP_WRQ 定义的为2 ,   {     /* remove PCB */     printf("Bad TFTP opcode \r\n");                      // 问题就出在这里了 ?????????????????????     __LTDC_drv->LTDC_DispStringAt(12, 200,                                    LCD_COLOR_RED,                                    LCD_COLOR_WHITE,                                    &FontAscii8x16,                              (const uint8_t *)"Bad TFTP opcode");     udp_remove(upcb_tftp_data);   }   else   {     ptr = pkt_buf->payload;     ptr = ptr +2;     // extract file name info      i= 0;     while (*(ptr+i)!=0x0)     {       i++;     }     strncpy(filename, ptr, i+1);     printf("IAP using TFTP \r\n");     __LTDC_drv->LTDC_DispStringAt(12, 220,                                    LCD_COLOR_RED,                                    LCD_COLOR_WHITE,                                    &FontAscii8x16,                              (const uint8_t *)"IAP using TFTP");      sprintf(message, "File: %s",filename);     printf("State: Erasing...\r\n");     __LTDC_drv->LTDC_DispStringAt(12, 240,                                    LCD_COLOR_RED,                                    LCD_COLOR_WHITE,                                    &FontAscii8x16,                              (const uint8_t *)message);         __LTDC_drv->LTDC_DispStringAt(12, 260,                                    LCD_COLOR_RED,                                    LCD_COLOR_WHITE,                                    &FontAscii8x16,                              (const uint8_t *)"State: Erasing...");          // Start the TFTP write mode     IAP_tftp_process_write(upcb_tftp_data, addr, port);   }   pbuf_free(pkt_buf); } /**   * @brief Returns the TFTP opcode    * @param buf: pointer on the TFTP packet    * @retval None   */ static tftp_opcode IAP_tftp_decode_op(char *buf) {   return (tftp_opcode)(buf[1]); } | 
 微信公众号
                微信公众号
             手机版
                手机版
             
		
	
	
	
评分
查看全部评分