215 / 214 / 114
Регистрация: 14.01.2013
Сообщений: 459
1

Общаться с устройством (аналог HyperTerminal)

14.01.2013, 17:08. Показов 2559. Ответов 2
Метки нет (Все метки)

Здравствуйте. Собственно нужно соединится с двумя устройствами с одним по COM порту с другим по TCP/IP посылать им команды - получать от них нужные ответы, и в дальнейшем использовать эти данные в программе.. В общем-то объяснять алгоритм всей программы не имеет смысла.. Мне лишь нужно узнать названия классов и/или библиотек для соединения с устройствами... Прогу написал в Матлабе.. Всё хорошо работает, но вот захотелось написать хорошее независимое приложение на С++.. В Матлабе всё это делается не реально просто, вот вырезки:
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
    objname= instrfind('Type', 'tcpip', 'RemoteHost', '192.168.2.21', 'RemotePort', 23, 'Tag', '', 'Timeout',1); % Создаём объект (параметры, думаю, все понятны)
    if isempty(objname)                                 %
        objname = tcpip('192.168.2.21', 23);      %
    else                                                      %
        fclose(objname);                                 %
        objr = objname(1);                              %
    end                                                       %
    set(objname, 'Terminator', {'CR','CR'});        % Задаём параметры терминала (добавление в конец строки символа возврата коретки)
    fopen(objname);                                      % Открываем
    query(objname, 'rc 0x10');                         % Посылаем команду 'rc 0x10' - которую понимает устройство
    data6=fscanf(objname);                            % Сохраняем ответ в строке data6
    fclose(objname);                                      % Закрываем
-----------------------------------------------------------------
С устройством к которому присоединяемся по COM порту тоже самое, только первая строка будет выгладить по-другому
Matlab M
1
obja = instrfind('Type', 'serial', 'Port', 'COM1', 'Tag', '','Timeout', 5);
Как я уже говорил в Матлабе делается это очень просто, я понимаю, что в С++ всё будет гораздо сложнее, и то что в двух строках это всё не описать, но всё же направьте меня пожалуйста в нужное русло.. Заранее спасибо!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.01.2013, 17:08
Ответы с готовыми решениями:

HyperTerminal
Здравствуйте! Существует ли аналог HyperTerminal для windows server 2008

Hyperterminal and USB
Привет. Возможно работать с устройством через hyperterminal, если оно подключается через usb, так...

C# подключение к HyperTerminal
Добрый день ! В С# я новичок, поэтому за любую помощь или идею большое спасибо ! подскажите...

Hyperterminal и диски Seagate
Недавно вышел из строя мой HDD SeaGate Barracuda 7200.11 и я его оживлял подпаявшись к нему через...

2
Модератор
3332 / 2113 / 343
Регистрация: 13.01.2012
Сообщений: 8,247
14.01.2013, 21:47 2
Лучший ответ Сообщение было отмечено es_ как решение

Решение

пример TCP IP (берем страницу с сайта)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
//------------------------------------------------------------------------------
#include <winsock>
#include <stdio.h>
//------------------------------------------------------------------------------
int get_addr(char *host_name)
{
    int res = -1;
 
    HOSTENT *phe = gethostbyname(host_name);
    if (phe)
        for (int i = 0; i < 4; i++)
            ((BYTE *)&res)[i] = phe->h_addr_list[0][i];
 
    return res;
}
//------------------------------------------------------------------------------
int main(int argc, char* argv[])
{
    WSADATA wsa_data;
    if (WSAStartup(0x101, &wsa_data))
    {
        printf("WSAStartup error (%i)\n", WSAGetLastError());
        system("pause");
        return -1;
    }
 
    if (wsa_data.wVersion != 0x101)
    {
        printf("Bad WSA version (%i)\n", wsa_data.wVersion);
        system("pause");
        return -1;
    }
 
    SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (s == INVALID_SOCKET)
    {
        printf("socket error (%i)\n", WSAGetLastError());
        system("pause");
        return -1;
    }
 
    int use_host_name;
    char host_name[256];
    char host_ip[256];
    int host_port;
    char doc[256];
 
    printf("use_host_name (0 for host_ip or 1 for host_name): ");
    scanf("%i", &use_host_name);
 
    if (use_host_name)
    {
        printf("host_name: ");
        scanf("%s", host_name);
    }
    else
    {
        printf("host_ip: ");
        scanf("%s", host_ip);
    }
 
    printf("host_port: ");
    scanf("%i", &host_port);
 
    printf("doc (for example /index.htm or /): ");
    scanf("%s", doc);
 
    SOCKADDR_IN sa;
    sa.sin_family = AF_INET;
    sa.sin_port = htons(host_port);
    sa.sin_addr.S_un.S_addr = use_host_name? get_addr(host_name) : inet_addr(host_ip);
 
    printf("wait for server...\n");
 
    while (true)
    {
        int connect_res = connect(s, (SOCKADDR *)&sa, sizeof(sa));
        if (!connect_res) break;
 
        Sleep(250);
    }
 
    printf("connected\n");
 
    char message[256];
 
    int message_size = sprintf
    (
        message,
        "GET [url]http://%s:%i%s[/url] HTTP/1.1\r\n"
        "Host: %s:%i\r\n"
        "Connection: Close\r\n"
        "\r\n",
        (use_host_name? host_name : host_ip),
        host_port,
        doc,
        (use_host_name? host_name : host_ip),
        host_port
    );
 
    if (send(s, message, message_size, 0) == SOCKET_ERROR)
    {
        printf("send error (%i)\n", WSAGetLastError());
        system("pause");
        return -1;
    }
 
    char buffer[100000];
    int buffer_size = sizeof(buffer);
    buffer_size = recv(s, buffer, buffer_size, 0);
    if (buffer_size == SOCKET_ERROR)
    {
        printf("recv error (%i)\n", WSAGetLastError());
        system("pause");
        return -1;
    }
    buffer[buffer_size] = '\0';
    printf("from_server: %s\n", buffer);
 
    closesocket(s);
 
    WSACleanup();
 
    system("pause");
    return 0;
}
пример реализации класса для работы с COM-портом
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
//------------------------------------------------------------------------------
class com_port
{
public:
    com_port(void);
    virtual ~com_port(void);
 
    std::string system_name;
 
    DCB dcb;
    COMMTIMEOUTS cto; 
 
    virtual bool open(void);
    virtual bool close(void);
 
    bool get_cfg(void);
    bool set_cfg(void);
 
    bool purge(void);
 
    bool write(unsigned char *out, unsigned long sizeof_out);
    bool read(unsigned char *in, unsigned long * const sizeof_in);
    bool wr
    (
        unsigned char *out, unsigned long sizeof_out,
        unsigned char *in, unsigned long * const sizeof_in
    );
 
    bool clear_error(unsigned long * const errors);
    bool clear_break(void);
 
private:
    HANDLE h;
};
//------------------------------------------------------------------------------
com_port::com_port(void):
    h(INVALID_HANDLE_VALUE)
{
    memset(&dcb, 0, sizeof(dcb));
    memset(&cto, 0, sizeof(cto));
 
    dcb.BaudRate = CBR_9600;
    dcb.fBinary = true;
    dcb.fParity = false;
    dcb.fOutxCtsFlow = false;
    dcb.fOutxDsrFlow = false;
    dcb.fDtrControl = DTR_CONTROL_DISABLE;
    dcb.fDsrSensitivity = false;
    dcb.fTXContinueOnXoff = false;
    dcb.fOutX = false;
    dcb.fInX = false;
    dcb.fErrorChar = false;
    dcb.fNull = false;
    dcb.fRtsControl = RTS_CONTROL_DISABLE;
    dcb.fAbortOnError = false;
    dcb.ByteSize = 8;
    dcb.Parity = 0;
    dcb.StopBits = 0;
    dcb.XonChar = '\x11';
    dcb.XoffChar = '\x13';
    dcb.ErrorChar = '\x00';
    dcb.EofChar = '\x00';
    dcb.EvtChar = '\x00';
 
    cto.ReadIntervalTimeout = 0;
    cto.ReadTotalTimeoutMultiplier = 0;
    cto.ReadTotalTimeoutConstant = 1000;
    cto.WriteTotalTimeoutMultiplier = 0;
    cto.WriteTotalTimeoutConstant = 1000;
}
//------------------------------------------------------------------------------
com_port::~com_port(void)
{
    close();
}
//------------------------------------------------------------------------------
bool com_port::open(void)
{
    close();
 
    h = CreateFile
    (
        system_name.c_str(), //lpFileName
        GENERIC_READ | GENERIC_WRITE, //dwDesiredAccess
        0, //dwShareMode
        0, //lpSecurityAttributes
        OPEN_EXISTING, //dwCreationDistribution
        FILE_ATTRIBUTE_NORMAL, //dwFlagsAndAttributes
        0 //hTemplateFile
    );
 
    if (h == INVALID_HANDLE_VALUE) return false;
 
    _active =
    PurgeComm
    (
        h,
        PURGE_RXABORT | PURGE_TXABORT | PURGE_RXCLEAR | PURGE_TXCLEAR
    ) &&
    (
        !dcb.DCBlength?
            true :
            SetCommState(h, &dcb) && SetCommTimeouts(h, &cto)
    ) &&
    GetCommState(h, &dcb) && GetCommTimeouts(h, &cto);
 
    if (!_active) CloseHandle(h);
 
    return _active;
}
//------------------------------------------------------------------------------
bool com_port::close(void)
{
    if (!_active) return true;
    _active = false;
    close_connections();
    PurgeComm
    (
        h,
        PURGE_RXABORT | PURGE_TXABORT | PURGE_RXCLEAR | PURGE_TXCLEAR
    );
    return CloseHandle(h);
}
//------------------------------------------------------------------------------
bool com_port::get_cfg(void)
{
    if (!_active) return false;
    return GetCommState(h, &dcb) && GetCommTimeouts(h, &cto);
}
//------------------------------------------------------------------------------
bool com_port::set_cfg(void)
{
    if (!_active) return false;
    return SetCommState(h, &dcb) && SetCommTimeouts(h, &cto);
}
//------------------------------------------------------------------------------
bool com_port::purge(void)
{
    if (!_active) return false;
    return
    PurgeComm
    (
        h,
        PURGE_RXABORT | PURGE_TXABORT | PURGE_RXCLEAR | PURGE_TXCLEAR
    );
}
//------------------------------------------------------------------------------
bool com_port::write(unsigned char *out, unsigned long sizeof_out)
{
    if (!_active) return false;
    unsigned long sizeof_out_real;
    return
    WriteFile(h, out, sizeof_out, &sizeof_out_real, 0) &&
    sizeof_out_real == sizeof_out;
}
//------------------------------------------------------------------------------
bool com_port::read(unsigned char *in, unsigned long * const sizeof_in)
{
    if (!_active) return false;
    unsigned long sizeof_in_max = *sizeof_in;
    return
    ReadFile(h, in, sizeof_in_max, sizeof_in, 0);
}
//------------------------------------------------------------------------------
bool com_port::wr
(
    unsigned char *out, unsigned long sizeof_out,
    unsigned char *in, unsigned long * const sizeof_in
)
{
    if (!_active) return false;
    unsigned long sizeof_out_real;
    unsigned long sizeof_in_max = *sizeof_in;
    return
    WriteFile(h, out, sizeof_out, &sizeof_out_real, 0) &&
    sizeof_out_real == sizeof_out &&
    ReadFile(h, in, sizeof_in_max, sizeof_in, 0);
}
//------------------------------------------------------------------------------
bool com_port::clear_error(unsigned long * const errors)
{
    return ClearCommError(h, errors, 0);
}
//------------------------------------------------------------------------------
bool com_port::clear_break(void)
{
    return ClearCommBreak(h);
}
1
215 / 214 / 114
Регистрация: 14.01.2013
Сообщений: 459
15.01.2013, 08:29  [ТС] 3
Спасибо большое! Теперь разберусь!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.01.2013, 08:29

Hyperterminal или работа с модемом
Доброго времени суток! задача в кратце такова: есть два компьтера, 2 модема. Один выступает в роли...

Меню устройства в hyperterminal(по UART)
Сегодня работал с железякой которая имеет подобную менюшку. Смысл примерно такой комп подключаеться...

Какие функции использовать для написания расширенного HyperTerminal-a?
Существует задача написания расширенного HyperTerminal-a. Подскажите пожалуйста какие функции для...

Проблемы с COM портом, необходимо полностью эмулировать в программе работу HyperTerminal
Здравствуйте! Помогите, пожалуйста, с проблемой, с перерывами бьюсь над ней уже несколько месяцев...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.