资源简介
串口传输文件可以采用三种协议xmodem、ymodem、zmodem,本程序只做针对ymodem协议的实现,包括发送方的程序和接收方的程序,下载后在linux平台下执行make即可用,已通过多次测试。
代码片段和文件信息
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include “ymodem.h“
#include “serial.h“
#define RESEND 0
#define SENDED 1
#define PACKET_SIZE 128
//#define PACKET_SIZE 1024
enum STATE{
START
RECEIVE_DATA
END
STOP
};
int ymodem_receive(const char *path int fd) {
int fd_file;
unsigned char start_char tmp_char;
int state len i;
int trans_end = 0;
char packet_num;
int packet_size;
int file_size = 0;
char buf[1024] = {0};
fd_file = open(path O_RDWR | O_CREAT | O_TRUNC 0644);
if (fd_file < 0)
perror(“open() file“);
packet_num = 0;
packet_size = 0;
state = START;
while(1) {
if (trans_end == 1) break;
switch(state) {
case START:
printf(“\033[32mSTART_MODE:\033[0m\n“);
put_char(fd ‘C‘);
//start_char = get_char(fd);
//printf(“%x error \n“ start_char);
start_char = get_char(fd);
if (start_char == SOH)
printf(“SOH: packet_128\n“);
else if (start_char == STX)
printf(“STX: packet_1024\n“);
else {
printf(“start_char %x error \n“ start_char);
//exit(1);
}
if (start_char == SOH || start_char == STX){
tmp_char = get_char(fd);
if (tmp_char != 0x00)
return -1; //not 00
printf(“0x00: %x\n“ tmp_char);
tmp_char = get_char(fd);
if (tmp_char != 0xff) {
printf(“0xff: %x error\n“ tmp_char);
return -1; //not ff
}
printf(“0xff: %x\n“ tmp_char);
//receive data
printf(“sizeof buf is %d\n“ sizeof(buf));
for (i = 0; i < PACKET_SIZE; i++) {
buf[i] = get_char(fd);
//printf(“i = %d “ i);
}
//get name and file size
printf(“receive file name: %s length :%d\n“buf strlen(buf));
//printf(“file size: %s\n“ (buf + strlen(buf) + 1));
file_size = atoi((buf + strlen(buf) + 1));
printf(“file size: %d\n“ file_size);
}
//crc
tmp_char = get_char(fd);
printf(“crc1 : %x\n“ tmp_char);
tmp_char = get_char(fd);
printf(“crc2 : %x\n“ tmp_char);
put_char(fd ACK);
packet_num = 1;
put_char(fd ‘C‘);
state = RECEIVE_DATA;
break;
case RECEIVE_DATA:
printf(“RECEIVE_DATA:\n“);
start_char = get_char(fd);
switch(start_char){
case EOT:
state = END;
printf(“\033[32mEOT\033[0m\n“);
put_char(fd ACK);
break;
case STX:
packet_size = 1024;
printf(“STX “);
break;
case SOH:
packet_size = 128;
printf(“SOH “);
break;
case CAN: break;
default: break;
}
if (state == END) break;
tmp_char = get_char(fd);
printf(“%x “ tmp_char);
tmp_char = get_char(fd);
printf(“%x “ tmp_char);
for(i = 0; i < packet_size; i++){
buf[i] = get_char(fd);
putchar(buf[i]);
}
tmp_char = get_char(fd);
printf(“%x “ tmp_char);
tmp_char = get_char(
- 上一篇:计算机专业考研复试英语自我介绍
- 下一篇:DDR3 PCB布线规则
相关资源
- LINUX 串口与SPI操作
- PSoc4串口收(中断)发
- 串口通讯+modbus通讯协议
- 基于socket的文件传输软件的设计与实
- Verilog HDL编写的FPGA RS232串口发送代码
- usb2.0-serial驱动
- 超级终端工具支持Xmodem、Ymodem、Zmod
- 微机原理与接口技术综合实验报告
- 串口两线转一线原理图
- PIC串口发送接收多字节
- Qt实现TCP文件传输
- PIC 单片机软件模拟串口
- 兼容超级终端Ymodem协议的stm32程序更新
- 串口通信 控制tdc-gpx芯片
- 局域网文件传输 毕业设计 word文档
- PortMon串口监听工具和中文使用说明文
- 基于LABView上位机 自动保存数据
- UART Verilog (串口通信Verilog HDL代码)
- usart hmi的串口驱动,测试单片机为S
- qt串口通信,实现发送和接收
- 基于labview的温度串口接收及波形显示
- modbus rtu 串口通信
- NRF24l01_51单片机+232串口传输
- STM32上串口与CAN的完整程序,全中断方
- Delphi XE 8 采用PosixAPI标准函数实现串口
- QT5 QSerialPort 串口收发
- pic16f877a串口通信
- spcomm 串口 xe2 版
- PCommLite.NET2.0
- QT编写的串口设备调试工具终极版
评论
共有 条评论