背景
在工业上,当设备之间不能通过网络联通时,通常设备上有串口可以用于传输数据,该系统是利用设备的串口来达到传输文件的目的.

协议交互设计:
图片描述

图片描述

图片描述

传输协议帧设计:
图片描述

实现只贴头文件,想看实现的可以留言

#ifndef FILE_H_
#define FILE_H_

#include <stdio.h>

enum {
   OPEN_FILE_FOR_READ,
   OPEN_FILE_FOR_WRITE,
};

void file_open(const char *file_name, int mode);
void file_close();
int file_nread(void *buf, int size);
int file_nwrite(void *buf, int size);

size_t file_get_file_size(const char *file);
void file_get_file_MD5(const char *file, char *md5);
int check_file_md5(const char *file, const char *expected_md5);

#endif//FILE_H_



#ifndef FRAME_H_
#define FRAME_H_

typedef struct _frame frame_t;
enum {REQ = 1, DATA, ACK, FINISH, ERR};
enum {
   NO_ERR,
   CHECKSUM_ERR,
   SEQ_NUMBER_ERR,
   RETRY_TOO_MUCH_ERR,
   MD5_ERR,
   CTRL_C_SIG_ERR,
   UNKNOWN_PKT_TYPE,
   OUT_OF_MAX_RETRY_TIMES,
   TIME_OUT
};

int frame_init(const char *dev);
void frame_fini();
int frame_check();
void frame_set_header();
void frame_set_seq_number(int seq_number);
void frame_set_checksum();
void frame_set_len(int len);
void frame_set_op(int op);
void frame_set_status(int status);
int frame_req();//only sender --> receiver
int frame_data(unsigned char *data, int len);
int frame_ack_ok();//only receiver --> sender
int frame_ack_not_ok();//only receiver --> sender
int frame_finish(char *md5);//only sender --> receiver
int frame_err(int err);
int frame_get_op_from_raw_data();
int frame_get_err_from_raw_data();
int frame_get_status_from_raw_data();
int frame_seq_number_check();
int frame_get_seq_number_from_raw_data();
int frame_checksum_check();
void frame_calculate_receive_frame_checksum();
void frame_calculate_send_frame_checksum();
int frame_get_frame();
int frame_get_remainder_frame();
int frame_get_frame_len();
void frame_get_frame_header();
void frame_decode_frame();
int frame_get_data_len();
void* frame_get_data_pos();
int u_frame_get_op();
const char* u_frame_get_md5_from_finish_pkt(char *md5);

#endif//FRAME_H_



#ifndef GLOBAL_H_
#define GLOBAL_H_

#define MTU 512
#define MAX_DATA_LEN 501

#endif//GLOBAL_H_


#ifndef SERIAL_DEV_H_
#define SERIAL_DEV_H_

int serial_dev_init(const char *dev);//没有返回值,省去判断,只要函数没有抛异常表示一定成功
void serial_dev_fini();
int serial_dev_nread(void *buf, int size);//返回值表示实际读取的个数
int serial_dev_nwrite(void *buf, int size);
int get_fd();

#endif//SERIAL_DEV_H_

beita
1 声望1 粉丝