void ChooseFile(void) { char file[260], *fname, b; int handle; unsigned long fsize, i, crc; struct ftime ft; FILE *f; Header("ПЕРЕДАЧА ФАЙЛУ"); cprintf(" Введiть шлях та iм'я файлу: "); ShowCursor(1); scanf(" %[^\n]",file); ShowCursor(0); f = fopen(file,"rb"); if (f) { if (strrchr(file,'\\')) fname = strrchr(file,'\\')+1; else fname = file; cprintf("\r\n Iм'я файлу: %s\r\n",fname); handle = fileno(f); fsize = filelength(handle); cprintf(" Розмiр файлу: "); ShowSize(fsize); getftime(handle,&ft); cprintf(" Дата редагування: %02u.%02u.%02u, %02u:%02u\r\n",ft.ft_day,ft.ft_month,ft.ft_year+1980,ft.ft_hour,ft.ft_min); crc = crc32f(f,fsize); cprintf(" CRC32: %08lx\r\n",crc); strcpy(hello.info.fname,fname); hello.info.fsize = fsize; hello.info.ft = ft; hello.info.crc = crc; hello.info.isize = C.PackSize; SendStr(hello.data,27); bufi[n] = 0; if(SendFile(f)) cprintf("\r\n Файл переданий."); else cprintf("\r\n Перевiрте кабель."); fclose(f); } else { cprintf("\r\n Не вдалось вiдкрити файл."); } getch(); } //--------------------------------------------------------------------------- int SendFile(FILE *f) { // передача файла unsigned long i, q; q = hello.info.fsize / C.PackSize; for (i = 0; i < q; i++) { fread(buffer[n^1],C.PackSize,1,f); if(!SendStr(buffer[n^1],C.PackSize)) return 0; bufi[n^1] = 0; } q = hello.info.fsize % C.PackSize; fread(buffer[n^1],q,1,f); SendStr(buffer[n^1],q); return 1; } //--------------------------------------------------------------------------- int SendStr(char *str, int len) { // передача строки int i; for (i = 0; i < len; i++) { // шлем данные while ((inportb(C.PortAddr+5) & 0x20) == 0); if (CheckErrors()) { getch(); return 0; } outportb(C.PortAddr,str[i]); } return 1; } //--------------------------------------------------------------------------- void ReceiveFile(void) { FILE *f; unsigned long i, q; int handle; Header("ПРИЙОМ ФАЙЛУ"); cprintf(" Очiкування iнформацiї про файл..."); while (bufi[n] < 27) { if (kbhit()) if (getch() == 27) return; if (CheckErrors()) { getch(); return; } } memcpy(hello.data,buffer[n],27); bufi[n] = 0; cprintf("\r\n Iм'я файлу: %s\r\n",hello.info.fname); cprintf(" Розмiр файлу: "); ShowSize(hello.info.fsize); cprintf(" Дата редагування: %02u.%02u.%02u, %02u:%02u\r\n",hello.info.ft.ft_day,hello.info.ft.ft_month,hello.info.ft.ft_year+1980,hello.info.ft.ft_hour,hello.info.ft.ft_min); cprintf(" CRC32: %08lx\r\n",hello.info.crc); cprintf(" Розмiр пакету: "); ShowSize(hello.info.isize); f = fopen(hello.info.fname,"wb"); if (f) { q = hello.info.fsize / C.PackSize; for (i = 0; i < q; i++) { while (bufi[n^1] < C.PackSize) if (CheckErrors()) { getch(); return; } fwrite(buffer[n^1],C.PackSize,1,f); bufi[n^1] = 0; } q = hello.info.fsize % C.PackSize; while (bufi[n^1] < q) CheckErrors(); fwrite(buffer[n^1],q,1,f); bufi[n^1] -= q; handle = fileno(f); setftime(handle,&hello.info.ft); fclose(f); } else { cprintf("Не вдалось створити файл."); } getch(); } //--------------------------------------------------------------------------- int CheckErrors(void) { // проверка состояния линии LSR lsr; lsr.byte = inportb(C.PortAddr+5); if (lsr.bit.overflow) { cprintf("\r\n Помилка переповнення."); return 1; } else if (lsr.bit.parity) { cprintf("\r\n Помилка парностi."); return 2; } else if (lsr.bit.synch) { cprintf("\r\n Помилка синхронiзацiї."); return 3; } else if (lsr.bit.timeout) { cprintf("\r\n Таймаут."); return 4; } else if ((bufi[0] > 0) && (bufi[1] > 0)) { cprintf("\r\n Помилка буферизацiї."); return 5; } else return 0; } //--------------------------------------------------------------------------- void interrupt far PortISR(void) { // обработчик прерывания порта - прием данных LSR lsr; do { lsr.byte = inportb(C.PortAddr+5); if (lsr.bit.in_ready) { buffer[n][bufi[n]++] = inportb(C.PortAddr); if (bufi[n] == C.PackSize) n ^= 1; } } while (lsr.bit.in_ready); outportb(0x20,0x20); } |