资源简介
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 编码
- 下一篇:简单模拟一个草原生态系统
相关资源
- C++中头文件与源文件的作用详解
- C语言代码高亮html输出工具
- 猜数字游戏 c语言代码
- C语言课程设计
- 数字电位器C语言程序
- CCS FFT c语言算法
- 使用C语言编写的病房管理系统
- 通信过程中的RS编译码程序(c语言)
- 计算机二级C语言上机填空,改错,编
- 用回溯法解决八皇后问题C语言实现
- 简易教务管理系统c语言开发文档
- 操作系统课设 读写者问题 c语言实现
- 小波变换算法 c语言版
- C流程图生成器,用C语言代码 生成C语
- 3des加密算法C语言实现
- 简单的C语言点对点聊天程序
- 单片机c语言源程序(51定时器 八个按
- 个人日常财务管理系统(C语言)
- c语言电子商务系统
- 小甲鱼C语言课件 源代码
- 将图片转换为C语言数组的程序
- C语言实现的一个内存泄漏检测程序
- DES加密算法C语言实现
- LINUX下命令行界面的C语言细胞游戏
- 用单片机控制蜂鸣器播放旋律程序(
- 学校超市选址问题(数据结构C语言版
- 电子时钟 有C语言程序,PROTEUS仿真图
- 尚观培训linux许巍老师关于c语言的课
- 算符优先语法分析器(C语言编写)
- 基于C语言的密码锁程序
评论
共有 条评论