anqier 2019-06-27
背景
在工业上,当设备之间不能通过网络联通时,通常设备上有串口可以用于传输数据,该系统是利用设备的串口来达到传输文件的目的.
协议交互设计:
传输协议帧设计:
实现只贴头文件,想看实现的可以留言
#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_