#include "windows.h"
#include <io.h>
#include "stdio.h"
#define USB 01
#define LPT 02
#define COM 03
#define ETH 04 // via local network - ethernet
void lc_port_file_send(int type)
{
char filename[256];
char start[10] = {'s','t','a','r','t','F','T','9','9'};
char end[10] = {'e','n','d','9','9','F','T','9','9'};
char content[1024];
long file_size;
long fragments;
size_t n_read;
size_t n_write;
size_t act_size;
HANDLE hPort;
FILE *f;
DWORD dw;
OVERLAPPED ov;
printf("Please, enter file name\n");
scanf("%s", &filename);
f = fopen(&filename[0], "r");
if (!f) {
printf("Error opening file %s",filename);
return;
}
printf("File %s is opened. \n",filename);
// получение размера файла
fseek(f,0,SEEK_END);
file_size = ftell(f);
if (file_size == 0) {
printf("File is empty. Exiting...");
return;
}
fseek(f,0,0);
//количество фрагментов, на которые будет разбит файл
fragments = file_size / sizeof(content) + ((file_size%sizeof(content))?1:0);
printf("File size if %ld\n",file_size);
printf("Fragments will be sent: %ld\n",fragments);
switch (type) {
case LPT:
hPort=CreateFile("LPT1",GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
break;
case COM:
hPort=CreateFile("COM",GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
break;
}
if (hPort==INVALID_HANDLE_VALUE)
{
printf("Error opening port.\n");
return;
}
printf("Port is opened.\n");
WriteFile(hPort,start,sizeof(start),&dw,&ov);
WriteFile(hPort,&fragments,sizeof(fragments),&dw,&ov);
do {
n_read = fread(&content,sizeof(char), sizeof(content), f);
act_size = n_read;
WriteFile(hPort,&act_size,sizeof(act_size),&dw,&ov);
WriteFile(hPort,content,sizeof(content),&dw,&ov);
}
while (n_read == sizeof(content));
WriteFile(hPort,start,sizeof(start),&dw,&ov);
CloseHandle(hPort);
printf("Port is closed\n");
fclose(f);
printf("File is closed\n");
}
int main()
{
int type;
printf("This program will send a file using selected interface. Please, enter number:\n");
printf("1) USB\n");
printf("2) LPT1\n");
printf("3) COM1\n");
printf("4) Ethernet\n");
scanf("%d", &type);
switch (type) {
case USB: break;
case LPT: lc_port_file_send(type); break;
case COM: lc_port_file_send(type); break;
case ETH: break;
}
scanf("%d", &type);
}
Передача данных через USB, COM, LPT и Ethernet порты на С.
передача данных между двумя компьютерами, соединенными между собой через:
- USB порт
- СОМ порт
- LPT порт
- Еthernet порт
Честно говоря, я не видел и не слышал, чтобы компьютеры соединяли с помощью USB, COM, LPT портов, думал это для разных девайсов только используется, но задание такое, какое есть. Собственно, в чем проблема - я не нашел нигде информации по передаче данных через USB порт. Поэтому, если кто-то знает, как это можно сделать на как можно более высоком уровне, скажите пожалуйста.
И у меня нет двух компьютеров, соединенных через COM, LPT, USB , поэтому не могу протестировать программу, которая должна уже работать с COM, LPT. Если у кого-то есть такая возможность, помогите. Или просто гляньте на код, вдруг какие-то ошибки сразу бросятся в глаза. Программа, не работает с Ethernet, но думаю, что я это легко сделаю через сокеты.
Программа, отправляющая файл с одного компьютера.
Заранее, спасибо.
Код:
Программа, получающая файл на другом компьютере.
Код:
#include "windows.h"
#include "stdio.h"
#define USB 01
#define LPT 02
#define COM 03
#define ETH 04 // via local network - ethernet
int equals(char a1[10], char a2[10]) // равны ли коды?
{
int i;
int flag = 1;
for (i=0; i<10; i++)
{
if (a1 != a2) flag = 0;
}
return flag;
}
void lc_port_file_recieve(int type)
{
char filename[256];
char start[10] = {'s','t','a','r','t','F','T','9','9'};
char end[10] = {'e','n','d','9','9','F','T','9','9'};
char r_start[10];
char r_end[10];
char content[1024];
size_t act_size;
size_t n_read;
size_t n_write;
long fragments;
int i;
HANDLE hPort;
FILE *f;
DWORD dw;
OVERLAPPED ov;
printf("Please, enter file name\n");
scanf("%s", &filename);
f = fopen(&filename[0], "w");
if (!f) {
printf("Error opening file %s",filename);
return;
}
printf("File %s is opened. \n",filename);
switch (type) {
case LPT:
hPort=CreateFile("LPT1",GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
break;
case COM:
hPort=CreateFile("COM",GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
break;
}
if (hPort==INVALID_HANDLE_VALUE)
{
printf("Error opening port.\n");
return;
}
printf("Port is opened. Listening...\n");
while (1) {
ReadFile(hPort,r_start,sizeof(start),&dw,&ov);
if (equals(start, r_start)) break;
}
ReadFile(hPort,&fragments, sizeof(fragments),&dw,&ov);
for (i = 0; i<fragments; i++)
{
ReadFile(hPort,&act_size,sizeof(act_size),&dw,&ov);
ReadFile(hPort,content,sizeof(content),&dw,&ov);
n_read = fwrite(&content,sizeof(char), act_size, f);
}
//WriteFile(hPort,start,sizeof(start),&dw,&ov);
CloseHandle(hPort);
printf("Port is closed\n");
fclose(f);
printf("File is closed\n");
}
int main()
{
int type;
printf("This program will recieve a file using selected interface. Please, enter number:\n");
printf("1) USB\n");
printf("2) LPT1\n");
printf("3) COM1\n");
printf("4) Ethernet\n");
scanf("%d", &type);
switch (type) {
case USB: break;
case LPT: lc_port_file_recieve(type); break;
case COM: lc_port_file_recieve(type); break;
case ETH: break;
}
scanf("%d", &type);
}
#include "stdio.h"
#define USB 01
#define LPT 02
#define COM 03
#define ETH 04 // via local network - ethernet
int equals(char a1[10], char a2[10]) // равны ли коды?
{
int i;
int flag = 1;
for (i=0; i<10; i++)
{
if (a1 != a2) flag = 0;
}
return flag;
}
void lc_port_file_recieve(int type)
{
char filename[256];
char start[10] = {'s','t','a','r','t','F','T','9','9'};
char end[10] = {'e','n','d','9','9','F','T','9','9'};
char r_start[10];
char r_end[10];
char content[1024];
size_t act_size;
size_t n_read;
size_t n_write;
long fragments;
int i;
HANDLE hPort;
FILE *f;
DWORD dw;
OVERLAPPED ov;
printf("Please, enter file name\n");
scanf("%s", &filename);
f = fopen(&filename[0], "w");
if (!f) {
printf("Error opening file %s",filename);
return;
}
printf("File %s is opened. \n",filename);
switch (type) {
case LPT:
hPort=CreateFile("LPT1",GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
break;
case COM:
hPort=CreateFile("COM",GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
break;
}
if (hPort==INVALID_HANDLE_VALUE)
{
printf("Error opening port.\n");
return;
}
printf("Port is opened. Listening...\n");
while (1) {
ReadFile(hPort,r_start,sizeof(start),&dw,&ov);
if (equals(start, r_start)) break;
}
ReadFile(hPort,&fragments, sizeof(fragments),&dw,&ov);
for (i = 0; i<fragments; i++)
{
ReadFile(hPort,&act_size,sizeof(act_size),&dw,&ov);
ReadFile(hPort,content,sizeof(content),&dw,&ov);
n_read = fwrite(&content,sizeof(char), act_size, f);
}
//WriteFile(hPort,start,sizeof(start),&dw,&ov);
CloseHandle(hPort);
printf("Port is closed\n");
fclose(f);
printf("File is closed\n");
}
int main()
{
int type;
printf("This program will recieve a file using selected interface. Please, enter number:\n");
printf("1) USB\n");
printf("2) LPT1\n");
printf("3) COM1\n");
printf("4) Ethernet\n");
scanf("%d", &type);
switch (type) {
case USB: break;
case LPT: lc_port_file_recieve(type); break;
case COM: lc_port_file_recieve(type); break;
case ETH: break;
}
scanf("%d", &type);
}
Код вроде работающий...
А проверить работу можно и на одном компе - соединить кабель между COM1 и COM2,
и пусть одна прога пишет в один порт, а другая считает из другого. Если будет работать с COM'ом то скорее всего и с LPT
Но, если с LPT и COM портами вроде всё в порядке (мне тоже кажется, что программа будет работать), то про USB я все еще не нашел никакой информации.