• 大小: 2KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-09
  • 语言: C/C++
  • 标签: ymodem  c语言  

资源简介

1、ymodem发送代码(c语言),网上大多只有接收代码,有也是写得比较乱,此代码小巧便于移植到小系统。
2、优点:io可自定义,注释清晰,传输效率高,短小精炼。

资源截图

代码片段和文件信息


/* by kh0723 */
#include “common.h“
#include “ymodem.h“
#include “string.h“
#include 
#include “vxWorks.h“
#include “crc.h“

/* 初始化输入输出接口 */
FUNCPTR ymodem_putc_fun = NULL;
FUNCPTR ymodem_getc_fun = NULL;
void ymodem_io_init(FUNCPTR putc FUNCPTR getc)
{
    ymodem_putc_fun = putc;
    ymodem_getc_fun = getc;
}

/* 输出字符 */
int ymodem_debug = 0;
void ymodem_putc(char c)
{
    if(ymodem_putc_fun)
        ymodem_putc_fun(c);
    else
        printf(“\r\n Need: ymodem_io_init()“);

    if((ymodem_debug & 0x1) == 0x1)
      printf(“t: %02x “ c);
}

/* 输入字符 */
char ymodem_getc()
{
    char c = 0xff;

    if(ymodem_getc_fun)
        c = ymodem_getc_fun();
    else
        printf(“\r\n Need: ymodem_io_init()“);        

    if((ymodem_debug & 0x2) == 0x2)
        printf(“\r\nr: %02x \r\n“ c);
        
    return c;
}

/* 延时 */
void ymodem_delay(int ticks)
{
    taskDelay(ticks);
}

/* 报文填充 */
int ymodem_pkt_fill(int pkt_mode int pkt_id char* a_data_ptr int a_data_len YMODEM_PKT* pkt)
{
    int pkt_data_len = PKT_MODE_2_DATA_LEN(pkt_mode);

    if((pkt_id < 0) || (NULL == a_data_ptr) || (a_data_len <= 0) || (NULL == pkt))
        return -1;
        
    //头: 发送模式、报文id、报文id补码
    pkt->mode = pkt_mode;
    if(EOT != pkt_mode)
    {
        pkt->id = pkt_id;
        pkt->id2 = ~pkt_id;
        //数据
        memset(pkt->data_buf 0 sizeof(pkt->data_buf));
        memcpy(pkt->data_buf a_data_ptr a_data_len);
        pkt->data_len = pkt_data_len;
        //crc
        pkt->crc16 = (int)cyg_crc16((unsigned char*)(pkt->data_buf) pkt->data_len);
    }
    
    return 0;
}

/* 报文发送 */
void ymodem_pkt_tx(YMODEM_PKT pkt)
{
    int i;

    ymodem_putc(pkt.mode);

    //非eot
    if(EOT != pkt.mode)
    {
        //printf(“\r\n pkt_mode %d pkt_id %d pkt_data_len %d pkt.crc16 %x\r\n“ pkt.mode pkt.id pkt.data_len pkt.crc16);
        ymodem_putc(pkt.id);
        ymodem_putc(pkt.id2);

        for(i = 0; i < pkt.data_len; i++)
        {
            ymodem_putc(pkt.data_buf[i]);
        }
        ymodem_putc(pkt.crc16 >> 8);
        ymodem_putc(pkt.crc16 & 0xFF);
    }
    
    //发送等待
    ymodem_delay(1);
}

/* 报文回应确认: 返回是否ok */
int ymodem_pkt_ack(YMODEM_PKT pkt)
{
    int pkt_first = 0;
    int pkt_end = 0;
    char pkt_ack ack_crc16;

    //判断pkt标记
    if((0 == pkt.id) && (0 != pkt.data_buf[0]))
        pkt_first = 1;
    else if(EOT == pkt.mode)
        pkt_end = 1;
        
    //接收等待 对端处理能力有限
    if(pkt_first)
        ymodem_delay(20);
    else
        ymodem_delay(1);

    //接收
    pkt_ack = ymodem_getc();
    if(ACK != pkt_ack)
        return 0;
    //开始和结束会返回crc    
    if(pkt_first || pkt_end)
    {
        ack_crc16 = ymodem_getc();
    }
        
    return 1;
}

/* 报文传输 */
int ymodem_pkt_transfer(int pkt_mode int pkt_id char* a_data_ptr int a_data_len)
{
    YMODEM_PKT pkt;
    int i;

    if(

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       1249  2018-08-23 16:13  ymodem.h

     文件       5879  2018-08-23 16:13  ymodem.c

----------- ---------  ---------- -----  ----

                 7128                    2


评论

共有 条评论