資源簡(jiǎn)介
串口傳輸文件可以采用三種協(xié)議xmodem、ymodem、zmodem,本程序只做針對(duì)ymodem協(xié)議的實(shí)現(xiàn),包括發(fā)送方的程序和接收方的程序,下載后在linux平臺(tái)下執(zhí)行make即可用,已通過(guò)多次測(cè)試。
代碼片段和文件信息
#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? 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? buf[i]?=?get_char(fd);
putchar(buf[i]);
}
tmp_char?=?get_char(fd);
printf(“%x?“?tmp_char);
tmp_char?=?get_char(
評(píng)論
共有 條評(píng)論