Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.50/14: Рейтинг темы: голосов - 14, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 25.04.2015
Сообщений: 23

Как принять по rs232 информацию от frid readera в VB6 и приписать дату и время?

17.03.2020, 13:42. Показов 3390. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
друзья,
задача такая,
от rfid reader-а поступает сигнал (номер карты)в формате HEX и по rs232 поступает на сом порт компьютера.
нужно зафиксировать номер карты и время и дату поступления в непрерывном режиме используя VB6.
в инете о----очень много информации о том, как читать данные из сом порта в VB6, используя MSComm или API функции.
вроде все выложено, все размельчено ,но когда дело доходит до реального воплощения, начинают появляться вопросительные знаки.
видимо ответчики думают, что беседуют всегда с подготовленными людьми, примерно их уровня и определенные детали не договаривают для полной ясности.
это- либо дают код и не указывают, как его использовать, либо дают часть кода и как дальше его связать с программой тоже не ясно и т. д.
неужели ,кто нибудь не может по человеческий указать последовательность действии.
например;
-запустите standart exe,
-перетащите MSComm на панель инструментов,
-создайте Lable или Text окно где и будет вписаться информация,
-открыть порт таким то кодом формы,
-для приема использовать такой то код, который нужно разместить куда то,
-подать сигнал на порт и наслаждаться результатом.
-или использовать функции API вписывая их куда то и т .д.
друзья если бы мы- простые люди все понимали с полуслова или знали все, может и не нужно было столько форумов.
но мы же не гуру.
так будь любезны если уж делайте доброе дело и помогайте не знающим людям, так помогите по человеческий .
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.03.2020, 13:42
Ответы с готовыми решениями:

К названию файла приписать дату и время
имеется вот такой код. Как к названию файла приписывать дату и время? нужно создавать каждый раз новую копию если что procedure...

Как принять информацию из БД
Код ищет в строке 123 и заменяет символы на "ok" потом выводит. Проверено. <?php $text='abc123fed'; $search = '123'; ...

Приписать к строке дату и месяц
Есть строка, пусть это будет всего одно слово - Предварительный. Вывожу эту строку так: echo MyString1; Задача такая, нужно...

29
Модератор
1245 / 676 / 292
Регистрация: 10.11.2019
Сообщений: 1,406
19.03.2020, 19:10
Студворк — интернет-сервис помощи студентам
Возможно моя скромная разработка поможет. Это терминальная программа, которую я делал
для обмена с платой Arduino. На мой взгляд небольшой трюк состоит в наличии в программе
таймера, который опрашивает вход COM порта и считывает приходящие байты.
Вложения
Тип файла: zip s_test98.zip (60.5 Кб, 4 просмотров)
1
0 / 0 / 0
Регистрация: 25.04.2015
Сообщений: 23
19.03.2020, 20:39  [ТС]
qbfan
спасибо за содействие.
у меня виндоус 7 скачал и установил VB6 и вроде работает.
ваша программа чего то не пошла. может нужно 98?

Добавлено через 6 минут
ой заработала!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!1
не верится дайте время придти в себя!!!!!!!!!!!!!!!!!!

Добавлено через 24 секунды
ой заработала!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!1
не верится дайте время придти в себя!!!!!!!!!!!!!!!!!!

Добавлено через 38 минут
в общем есть над чем поработать
The trick и qbfan дают надежду что все закончится благополучно
позвольте пару вопросов по коду
нужно передать на ком восьмиразрядное хекс число например 0xAABBCCDD в десятичной форме
я воспользовался алгоритмом найденным в инете

Для машины нет разницы между 0хFFFF и 65536 или 0xFF и 255.

Допустим пришло число в виде 0xFFFF но мы знаем что это число 65535 в DEC.
Чтобы в терминале оно отобразилось, мы должны передать

0x06+0x30,0x05+0x30,0x05+0x30,0x03+0x30, 0x05+0x30

добавление 0x30 как раз даст нужный символ согласно ASCII таблицы.

А чтобы разбить на эти байты. Можно отнимать сначала по 10000 или 0x2710, от числа которое пришло с датчика,

и подсчитывать количество отсчетов. Для 60000 количество отсчетов будет равно 6 или 0x06.

Потом смотрим - если число меньше 10000, тогда начинаем отнимать по 1000 или 0x3E8

и подсчитывать количество отсчетов. Для 5000 количество отсчетов будет равно 5 или 0x05.

Потом смотрим - если число меньше 1000, тогда начинаем отнимать по 100 или 0x64

и подсчитывать количество отсчетов. Для 500 количество отсчетов будет равно 5 или 0x05.

Потом смотрим - если число меньше 100, тогда начинаем отнимать по 10 или 0x0A

и подсчитывать количество отсчетов. Для 30 количество отсчетов будет равно 3 или 0x03.

Потом смотрим - если число меньше 10, тогда оставшееся мы передаем просто в том же виде.

И в итоге в терминал придет не 0xFFFF разбитое на два байта 0xFF и 0xFF, а 5 байт и отображено как 65535

и написал код в CVAVR

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
189
190
//======================0x3B9ACA00
  if(k[0]<0x3B9ACA00)
  putchar(0x30);
  else
  {
  for(a1=1;a1<11;a1++)
  {
  k[0]=k[0]-0x3B9ACA00;
  if(k[0]<0x3B9ACA00)
  {
   b1[0]=a1; 
   putchar(b1[0]+0x30);
   a1=0;
   b1[0]=0;
  
   break;
  }
  }  
  }
  //========================0x5F5E100
  if(k[0]<0x5F5E100)
  putchar(0x30);
  else
  {
   for(a2=1;a2<11;a2++)
  {
  k[0]=k[0]-0x5F5E100;
  if(k[0]<0x5F5E100)
  {
   b2[0]=a2; 
   putchar(b2[0]+0x30); 
   a2=0;
   b2[0]=0;
  
   break;
  }
  } 
  } 
    //========================0x989680
    if(k[0]<0x989680)
  putchar(0x30);
  else
  {
   for(a3=1;a3<11;a3++)
  {
  k[0]=k[0]-0x989680;
  if(k[0]<0x989680)
  {
   b3[0]=a3; 
   putchar(b3[0]+0x30); 
   a3=0;
   b3[0]=0;
  
   break;
  }
  } 
  } 
    //========================0xF2440
    if(k[0]<0xF2440)
     putchar(0x30);
     else
  {
   for(a4=1;a4<11;a4++)
  {
  k[0]=k[0]-0xF2440;
  if(k[0]<0xF2440)
  {
   b4[0]=a4; 
   putchar(b4[0]+0x30); 
   a4=0;
   b4[0]=0;
  
   break;
  }
  }
  }  
  //========================0x186A0
    if(k[0]<0x186A0)
     putchar(0x30);
     else
  {
   for(a5=1;a5<11;a5++)
  {
  k[0]=k[0]-0x186A0;
  if(k[0]<0x186A0)
  {
   b5[0]=a5; 
   putchar(b5[0]+0x30); 
   a5=0;
   b5[0]=0;
  
   break;
  }
  }
  } 
   //========================0x2710    //???
  if(k[0]<0x2710)
  putchar(0x30);
  else
  {
  for(a6=1;a6<11;a6++)
  {
  k[0]=k[0]-0x2710;
  if(k[0]<0x2710)
  {
   b6[0]=a6; 
   putchar(b6[0]+0x30);
   a6=0;
   b6[0]=0;
  
  }
  }  
  }
  //========================0x3E8
  if(k[0]<0x3E8)
  putchar(0x30);
  else
  {
   for(a7=1;a7<11;a7++)
  {
  k[0]=k[0]-0x3E8;
  if(k[0]<0x3E8)
  {
   b7[0]=a7; 
   putchar(b7[0]+0x30); 
   a7=0;
   b7[0]=0;
  
   break;
  }
  } 
  } 
    //======================== 0x64
    if(k[0]<0x64)
  putchar(0x30);
  else
  {
   for(a8=1;a8<11;a8++)
  {
  k[0]=k[0]-0x64;
  if(k[0]<0x64)
  {
   b8[0]=a8; 
   putchar(b8[0]+0x30); 
   a8=0;
   b8[0]=0;
  
   break;
  }
  } 
  } 
    //========================0xA
    if(k[0]<0xA)
     putchar(0x30);
     else
  {
   for(a9=1;a9<11;a9++)
  {
  k[0]=k[0]-0xA;
  if(k[0]<0xA)
  {
   b9[0]=a9; 
   putchar(b9[0]+0x30); 
   a9=0;
   b9[0]=0;
   
   break;
  }
  }
  }  
  //========================0x01
    if(k[0]<0x01)
     putchar(0x30);
     else
  {
   for(a10=1;a10<11;a10++)
  {
  k[0]=k[0]-0x01;
  if(k[0]<0x01)
  {
   b10[0]=a10; 
   putchar(b10[0]+0x30); 
   a10=0;
   b10[0]=0;
   
   break;
  }
  }
  } 
--------------------------------
он исправно работает, когда исходное число intejer, например k[0]=0xAABB , но когда число unsigned long, например k[0]=0xAABBCCDD дает ошибку на последний пять разряда.идет процесс выяснения причины

Добавлено через 25 секунд
в общем есть над чем поработать
The trick и qbfan дают надежду что все закончится благополучно
позвольте пару вопросов по коду
нужно передать на ком восьмиразрядное хекс число например 0xAABBCCDD в десятичной форме
я воспользовался алгоритмом найденным в инете

Для машины нет разницы между 0хFFFF и 65536 или 0xFF и 255.

Допустим пришло число в виде 0xFFFF но мы знаем что это число 65535 в DEC.
Чтобы в терминале оно отобразилось, мы должны передать

0x06+0x30,0x05+0x30,0x05+0x30,0x03+0x30, 0x05+0x30

добавление 0x30 как раз даст нужный символ согласно ASCII таблицы.

А чтобы разбить на эти байты. Можно отнимать сначала по 10000 или 0x2710, от числа которое пришло с датчика,

и подсчитывать количество отсчетов. Для 60000 количество отсчетов будет равно 6 или 0x06.

Потом смотрим - если число меньше 10000, тогда начинаем отнимать по 1000 или 0x3E8

и подсчитывать количество отсчетов. Для 5000 количество отсчетов будет равно 5 или 0x05.

Потом смотрим - если число меньше 1000, тогда начинаем отнимать по 100 или 0x64

и подсчитывать количество отсчетов. Для 500 количество отсчетов будет равно 5 или 0x05.

Потом смотрим - если число меньше 100, тогда начинаем отнимать по 10 или 0x0A

и подсчитывать количество отсчетов. Для 30 количество отсчетов будет равно 3 или 0x03.

Потом смотрим - если число меньше 10, тогда оставшееся мы передаем просто в том же виде.

И в итоге в терминал придет не 0xFFFF разбитое на два байта 0xFF и 0xFF, а 5 байт и отображено как 65535

и написал код в CVAVR

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
189
190
 //======================0x3B9ACA00
  if(k[0]<0x3B9ACA00)
  putchar(0x30);
  else
  {
  for(a1=1;a1<11;a1++)
  {
  k[0]=k[0]-0x3B9ACA00;
  if(k[0]<0x3B9ACA00)
  {
   b1[0]=a1; 
   putchar(b1[0]+0x30);
   a1=0;
   b1[0]=0;
  
   break;
  }
  }  
  }
  //========================0x5F5E100
  if(k[0]<0x5F5E100)
  putchar(0x30);
  else
  {
   for(a2=1;a2<11;a2++)
  {
  k[0]=k[0]-0x5F5E100;
  if(k[0]<0x5F5E100)
  {
   b2[0]=a2; 
   putchar(b2[0]+0x30); 
   a2=0;
   b2[0]=0;
  
   break;
  }
  } 
  } 
    //========================0x989680
    if(k[0]<0x989680)
  putchar(0x30);
  else
  {
   for(a3=1;a3<11;a3++)
  {
  k[0]=k[0]-0x989680;
  if(k[0]<0x989680)
  {
   b3[0]=a3; 
   putchar(b3[0]+0x30); 
   a3=0;
   b3[0]=0;
  
   break;
  }
  } 
  } 
    //========================0xF2440
    if(k[0]<0xF2440)
     putchar(0x30);
     else
  {
   for(a4=1;a4<11;a4++)
  {
  k[0]=k[0]-0xF2440;
  if(k[0]<0xF2440)
  {
   b4[0]=a4; 
   putchar(b4[0]+0x30); 
   a4=0;
   b4[0]=0;
  
   break;
  }
  }
  }  
  //========================0x186A0
    if(k[0]<0x186A0)
     putchar(0x30);
     else
  {
   for(a5=1;a5<11;a5++)
  {
  k[0]=k[0]-0x186A0;
  if(k[0]<0x186A0)
  {
   b5[0]=a5; 
   putchar(b5[0]+0x30); 
   a5=0;
   b5[0]=0;
  
   break;
  }
  }
  } 
   //========================0x2710    //???
  if(k[0]<0x2710)
  putchar(0x30);
  else
  {
  for(a6=1;a6<11;a6++)
  {
  k[0]=k[0]-0x2710;
  if(k[0]<0x2710)
  {
   b6[0]=a6; 
   putchar(b6[0]+0x30);
   a6=0;
   b6[0]=0;
  
  }
  }  
  }
  //========================0x3E8
  if(k[0]<0x3E8)
  putchar(0x30);
  else
  {
   for(a7=1;a7<11;a7++)
  {
  k[0]=k[0]-0x3E8;
  if(k[0]<0x3E8)
  {
   b7[0]=a7; 
   putchar(b7[0]+0x30); 
   a7=0;
   b7[0]=0;
  
   break;
  }
  } 
  } 
    //======================== 0x64
    if(k[0]<0x64)
  putchar(0x30);
  else
  {
   for(a8=1;a8<11;a8++)
  {
  k[0]=k[0]-0x64;
  if(k[0]<0x64)
  {
   b8[0]=a8; 
   putchar(b8[0]+0x30); 
   a8=0;
   b8[0]=0;
  
   break;
  }
  } 
  } 
    //========================0xA
    if(k[0]<0xA)
     putchar(0x30);
     else
  {
   for(a9=1;a9<11;a9++)
  {
  k[0]=k[0]-0xA;
  if(k[0]<0xA)
  {
   b9[0]=a9; 
   putchar(b9[0]+0x30); 
   a9=0;
   b9[0]=0;
   
   break;
  }
  }
  }  
  //========================0x01
    if(k[0]<0x01)
     putchar(0x30);
     else
  {
   for(a10=1;a10<11;a10++)
  {
  k[0]=k[0]-0x01;
  if(k[0]<0x01)
  {
   b10[0]=a10; 
   putchar(b10[0]+0x30); 
   a10=0;
   b10[0]=0;
   
   break;
  }
  }
  } 
--------------------------------
он исправно работает, когда исходное число intejer, например k[0]=0xAABB , но когда число unsigned long, например k[0]=0xAABBCCDD дает ошибку на последний пять разряда.идет процесс выяснения причины
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
19.03.2020, 22:52
Не проще перевести это в unsigned long. Число в BCD есть, теперь просто складываем разряды умноженные на степени 10? Проще вообще из шестнадцатеричного представления перевести в unsigned long. Получаем разряд, вычисляем значение, поразрядное OR, и сдвиг на ч разряда если нужно. Кодом на C не могу помочь для AVR, т.к. для AVR пишу на ассемблере, только на нем могу предоставить процедуру если нужно.

Добавлено через 5 минут
Я понял, нужно в AVR перевести в BCD и вывести на экран. Я подумал нужно принять число в BCD и преобразовать. Минуточку

Добавлено через 31 минуту
Да код на с элементарный вообще.
C
1
2
3
4
unsigned long l = 0xAABBCCDD;
char bBuf[11];
ultoa(l, bBuf, 10);
puts(bBuf);
0
19.03.2020, 23:10

Не по теме:

Цитата Сообщение от The trick Посмотреть сообщение
для AVR пишу на ассемблере
Время AVR уже прошло. Сейчас доступны недорогие 32-ух битные МК с аппаратной поддержкой плавающей точки. Например МК с тактовой частотой 480 МГц, с 2 МБ флеша и 1 МБ ОЗУ, и с поддержкой аппаратной отладки стоит около 4$.
Но это обсуждение не для этой темы.

0
19.03.2020, 23:12

Не по теме:

locm, да я знаю. Мне пока возможностей AVR хватает, хотя не раз уже собирался на STM перейти, пока как-то не идет.

0
20.03.2020, 00:23

Не по теме:

Цитата Сообщение от The trick Посмотреть сообщение
не раз уже собирался на STM перейти, пока как-то не идет.
При первом знакомстве нужно правильно выбрать IDE. Профессиональные среды типа Keil, IAR не самые подходящие, потому что не сразу получается разобраться что к чему из-за чего знакомство с STM хочется оставить на потом.
Я выбрал для начала среду EmBitz и до сих пор пишу в ней. Это вероятно самая простая IDE для STM32. В ней по умолчанию есть библиотеки SPL и CMSIS которые добавляются в проект при его создании. То есть достаточно создать проект и можно работать без необходимости вникать в мелочи. Вначале это важно, а со временем можно разобраться с мелочами.
Пара ссылок по теме. Форум, т. к. на других сайтах этой информации нет.
http://purebasic.mybb.ru/viewtopic.php?id=575
http://purebasic.mybb.ru/viewtopic.php?id=564

0
0 / 0 / 0
Регистрация: 25.04.2015
Сообщений: 23
20.03.2020, 11:44  [ТС]
речь идет о передаче bcd числа который легко формируется из hex на терминал через ком
пример поступил 0xAASSCCDD преобразовали в bcd 2864434397 и теперь его передаем на терминал
0x32,0x38,----0x37

Добавлено через 9 минут
тут еще один вопрос .при приеме от источника 8 разрядного hex. это число принимается по байтно и размещается в регистре.
например. принимается AABBCCDD и размещается в r[8]={0x41,0x41,0x42,0x42,0x43,0x43,0x44,0x4 4};
как теперь из этого дробленого числа получить unsigned long [1]={AABBCCDD};
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
20.03.2020, 12:16
Лучший ответ Сообщение было отмечено davita как решение

Решение

Для перевода из строки в unsigned long существует функция strtoul.
0
0 / 0 / 0
Регистрация: 25.04.2015
Сообщений: 23
20.03.2020, 13:12  [ТС]
ага буду пробовать.

Добавлено через 51 минуту
а как указать что r[8]={0x41,0x41,0x42,0x42,0x43,0x43,0x44,0x4 4}; есть AABBCCDD ? если есть

Добавлено через 1 минуту
как из r[8]={0x41,0x41,0x42,0x42,0x43,0x43,0x44,0x4 4}; сделать AABBCCDD?

Добавлено через 40 секунд
ТОЖЕ hex
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
20.03.2020, 14:10
davita, я дал Вам код, посмотрите чему равен буфер bBuf после ultoa. Это элементарные действия.
Этот раздел не по программированию AVR, а VB6. Если у Вас есть вопросы по VB6 - задавайте тут. По AVR есть другой раздел.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.03.2020, 14:10
Помогаю со студенческими работами здесь

Как принять информацию от TCP сервера вычитать ключ который он прислал?
Собственно, все в названии. Есть так же нужный код на C#, но перевести не могу, нет скилла=) public bool Check(string login, string...

Как переконвертировать время из unix epoch формата в понятную дату и время?
Уважаемые форумчане! Не могу нигде найти адекватного решения обратной конвертации из формата unix epoch в человекочитабельную форму! Есть...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru