背景
在工业上,当设备之间不能通过网络联通时,通常设备上有串口可以用于传输数据,该系统是利用设备的串口来达到传输文件的目的.
协议交互设计:
传输协议帧设计:
实现只贴头文件,想看实现的可以留言
#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_
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。