Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.02.2014, 22:53   #11
nikolay1982
Пользователь
 
Регистрация: 31.12.2013
Сообщений: 47
По умолчанию

Под Windows необходимо менять код почти полностью.
Для программирования по ком порт можно примянять примерно такой код:
Код:
#ifndef D2SERIAL_C
#define D2SERIAL_C

#include "d2serial.h"
#include "d2lib.h"
//#include "mini_edt.h"

//H Section
#define __USE_UNIX98
#include "d2lib.h"
#include <windows.h>


#include <stdlib.h>

#include <stdio.h>
#include <string.h>

#include <errno.h>

typedef struct
{
    HANDLE fid;
    COMMTIMEOUTS commTimeouts;
    DCB dcb;
} WIN_SERIAL_PORT_DATA;
speed_spec speeds[] =
{
    {"1200", CBR_1200,1200},
    {"2400", CBR_2400,2400},
    {"4800", CBR_4800,4800},
    {"9600", CBR_9600,9600},
    {"19200", CBR_19200,19200},
    {"38400", CBR_38400,38400},
    {"57600", CBR_57600,57600},
    {"115200", CBR_115200,115200},
    {NULL, 0,0}
};


int get_speed_by_index(int ix)
{
    return speeds[ix].flag;
};

int get_speed_by_str(char *name)
{
    speed_spec *s;
    //int speed;
    for (s = speeds; s->name; s++)
    {
        if (strcmp(s->name, name) == 0)
        {
            return  s->flag;
            //return speed;
            //fprintf(stderr, "setting speed %s\n", s->name);
            //break;
        }
    }
    return 0;
}

int get_speed_by_number(int speed)
{
    return speed;

}

void port_get_name(char *dst,int index)
{
    //strcpy(dst,"/dev/ttyS")
    sprintf(dst,"com%i",(index+1));
}
int open_port(SERIAL_PORT *port)
{
    char buf [16];
    WIN_SERIAL_PORT_DATA *data;
    LPCOMMTIMEOUTS tm;
    LPDCB lpDCB;
    if (port==NULL) return 1;
    if (port->data) close_port(port);
    port->fid=-1;
    //data=(WIN_SERIAL_PORT_DATA*)port->data;
    int speed;
    data=(WIN_SERIAL_PORT_DATA*)malloc(sizeof(WIN_SERIAL_PORT_DATA));
    port_get_name(buf,port->index);
    data->fid=CreateFile(buf,GENERIC_READ | GENERIC_WRITE,
                         0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    if (data->fid >0)
    {
        tm=&data->commTimeouts;
        lpDCB=&data->dcb;
        tm->ReadIntervalTimeout = 1;
        tm->ReadTotalTimeoutMultiplier = 0;
        tm->ReadTotalTimeoutConstant = 1;
        tm->WriteTotalTimeoutMultiplier = 2;
        tm->WriteTotalTimeoutConstant = 2;
        if (!SetCommTimeouts(data->fid,tm))
        {
            return 2;
        };
        if (!SetupComm(data->fid, 4096, 4096)) return 4;

        lpDCB->DCBlength=sizeof(DCB);
        GetCommState(data->fid,lpDCB);
        lpDCB->BaudRate = port->speed;
        //lpDCB->Flags=12305;
        lpDCB->wReserved=0;
        lpDCB->XonLim=600;
        lpDCB->XoffLim=150;
        lpDCB->ByteSize=8;
        lpDCB->Parity=0;
        lpDCB->StopBits=0;
        lpDCB->XonChar=17;
        lpDCB->XoffChar=19;
        lpDCB->ErrorChar=0;
        lpDCB->EofChar=0;
        lpDCB->EvtChar=0;
        lpDCB->wReserved1=65;
        if (!SetCommState(data->fid, lpDCB)) return 5;
        port->fid=(int)data->fid;
        if (port->fid<0)  port->fid=1;
        //out_str2=ok_connect_str;
        return 0;//ok open port
    }//else out_str2=er_connect_str;
    return 3;

}//return 0 if OK ,if error non zero return
int port_read_byte(SERIAL_PORT *port,unsigned char *c)
{
    int ret;
    DWORD co;
    WIN_SERIAL_PORT_DATA* data;
    if (port==NULL) return 1;
    data=(WIN_SERIAL_PORT_DATA*)port->data;
    if (data)
    {
        if (!ReadFile(data->fid, c, 1, &co, NULL)) return 2;
        if (co==0) return 1;
        return 0;
    }
    return 3;

}//return 0 if OK ,if error non zero return
int port_write_byte(SERIAL_PORT *port,unsigned char c)
{
    if (port==NULL) return 1;
    int ret;
    DWORD co;
    WIN_SERIAL_PORT_DATA* data=(WIN_SERIAL_PORT_DATA*)port->data;

    if (data)
    {
        if (!WriteFile(data->fid, &c, 1, &co, NULL)) return 2;
        if (co==0) return 1;
        return 0;
    }
    return 3;

}//return 0 if OK ,if error non zero return

int close_port(SERIAL_PORT *port)
{
    if (port==NULL) return 1;
    WIN_SERIAL_PORT_DATA* data=(WIN_SERIAL_PORT_DATA*)port->data;
    if  (data)
    {
        // if (port->fid>-1){
        CloseHandle(data->fid);
        //tcsetattr(port->fid,TCSANOW,(struct termios*)(port->data));
        free(data);
        port->data=NULL;
    }
    port->fid=-1;
    //};
    return 0;


}
;//return 0 if OK ,if error non zero return

//int read_byte(int from, char *c);


int read_byte(int from,unsigned char *c)
{
    int ret;
    do
    {
        ret = read(from, &c, 1);
    }
    while (ret < 0 && errno == EINTR);
    if (ret == 1)
    {
        return 0;
    }
    return -2;

}

#endif
Если нужны .h файлы и такой же API под Linux могу скинуть.
nikolay1982 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как сделать код более качественным rUs_LAN C# (си шарп) 3 23.11.2011 14:28
Процедура! Нужно код сделать процедурой : ) JasperCRT Общие вопросы Delphi 9 14.03.2011 09:28
Помогите сделать код работоспособным (с++) Александр Елис Помощь студентам 6 18.08.2009 20:42
Модернизировать код, сделать его быстрее Rusl92 Общие вопросы Delphi 5 03.11.2008 19:23