资源简介
1、ymodem发送代码(c语言),网上大多只有接收代码,有也是写得比较乱,此代码小巧便于移植到小系统。
2、优点:io可自定义,注释清晰,传输效率高,短小精炼。
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
- 上一篇:Huffman 编码
- 下一篇:简单模拟一个草原生态系统
相关资源
- OSPF基于C语言的算法实现
- 52单片机定时器2作为串行口波特率发
- 首次适应算法主存空间的分配和回收
- 魔方还原算法C语言
- 进程同步实验代码c语言
- Huffman编/译码器C语言代码
- c语言实现 关键路径
- 进程控制的算法模拟 c语言实现
- C语言库函数手册--c语言大全
- C语言版本Linux环境下MD5加密函数
- C语言控制台窗口界面编程(修正版)
- 哈夫曼压缩解压算法-C语言
- rs编码c语言实现
- C语言实现表达式求值
- c语言课程设计职工信息管理系统
- 利用c语言写的理发馆排队问题模拟仿
- C语言经典编程100题+答案
- 单片机与上位机收发程序c语言实现
- UTF8转GBK C语言 单片机
- 专家PID与模糊PID的C语言实现
- c语言单纯形法c语言单纯形法
- C语言模拟实现操作系统内存的分配与
- 用C语言实现卷积计算并绘制出卷积计
- C语言实现控制台扫雷小游戏
- c语言连接sql server
- c语言写的音乐程序源代码
- C语言课程设计——宿舍管理系统
- c语言控制pc扬声器代码
- C语言编写的腐蚀膨胀开闭运算算法
- 西工大C语言大作业模板
评论
共有 条评论