Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Передача данных через USB, COM, LPT и Ethernet порты на С.

17K
29 декабря 2008 года
ALEX_
40 / / 19.04.2007
Такое у меня задание:
передача данных между двумя компьютерами, соединенными между собой через:
  1. USB порт
  2. СОМ порт
  3. LPT порт
  4. Еthernet порт
Измерить скорость передачи данных. На С.
Честно говоря, я не видел и не слышал, чтобы компьютеры соединяли с помощью USB, COM, LPT портов, думал это для разных девайсов только используется, но задание такое, какое есть. Собственно, в чем проблема - я не нашел нигде информации по передаче данных через USB порт. Поэтому, если кто-то знает, как это можно сделать на как можно более высоком уровне, скажите пожалуйста.
И у меня нет двух компьютеров, соединенных через COM, LPT, USB , поэтому не могу протестировать программу, которая должна уже работать с COM, LPT. Если у кого-то есть такая возможность, помогите. Или просто гляньте на код, вдруг какие-то ошибки сразу бросятся в глаза. Программа, не работает с Ethernet, но думаю, что я это легко сделаю через сокеты.

Программа, отправляющая файл с одного компьютера.
Заранее, спасибо.
Код:
#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);
}


Программа, получающая файл на другом компьютере.
Код:
#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);
}
39K
30 декабря 2008 года
kupec
17 / / 11.08.2008
Лучше с портами работать не через WinAPI, а тоже через fopen/fwrite/fread.
Код вроде работающий...
А проверить работу можно и на одном компе - соединить кабель между COM1 и COM2,
и пусть одна прога пишет в один порт, а другая считает из другого. Если будет работать с COM'ом то скорее всего и с LPT
17K
30 декабря 2008 года
ALEX_
40 / / 19.04.2007
Это хорошая идея, только у меня мало того, что на компе 1 порт, так еще и нет кабеля.
Но, если с LPT и COM портами вроде всё в порядке (мне тоже кажется, что программа будет работать), то про USB я все еще не нашел никакой информации.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог