С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/74: Рейтинг темы: голосов - 74, средняя оценка - 4.88
64 / 64 / 10
Регистрация: 19.10.2009
Сообщений: 234

Работа с Com портом

05.07.2010, 14:04. Показов 14134. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем! У меня собственно такая ситуация, есть bluetooth и телефон Nokia устанавливаю соединение через виртуальный com порт, мне необходимо: 1) с компьютера заставить звонить телефон на нужные номера, 2) определять номера на которые звонят с телефона. Я никогда не работал с com портами, но посидев денек в инете 1 пункт мне удалось сделать, да там ничего особенного как оказалось и нету. А вот как сделать 2 пункт? Чет у меня ваще не получается получить какие нибудь данные с com порта, помогите организовать получение данных просто получение, плиз.......

Добавлено через 6 часов 25 минут
Тему можно закрывать, все сделал
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.07.2010, 14:04
Ответы с готовыми решениями:

Работа с COM портом
по COM порту через Agilen подключается вольтметр с адресом 1. необходимо "прозвонить" все порты и автоматически сделать рабочим тот,...

Работа с COM портом
Здравствуйте! В процессе написания программы работы с устройством, подключенным к ПК через преобразователь интерфейсов RS485 - USB,...

Работа с COM-портом
Подскажите, какие компоненты нужны для работы с ком-портами? а именно (хотя бы для начала) отправка шестнадцатиричного кода на порт, к...

10
Покинул форум
3189 / 1368 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
05.07.2010, 14:31
Larsus, если сделали, то покажите то, что сделали. Вполне возможно, что еще не один человек столкнется с такой проблемой, а так решение бедут найденно и ему не придется создавать новую тему.
1
64 / 64 / 10
Регистрация: 19.10.2009
Сообщений: 234
06.07.2010, 13:37  [ТС]
Выкладывать пока не буду код ещё не приведен в порядок, но могу дать ссылки на ресурсы которые мне очень помогли

Получение данных с Com порта

AT команды
1
Покинул форум
3189 / 1368 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
06.07.2010, 14:09
Larsus, а первая ссылка вирусная. Каким образом она вам помогла? А за остальные две ссылки спасибо.
0
64 / 64 / 10
Регистрация: 19.10.2009
Сообщений: 234
06.07.2010, 15:38  [ТС]
Цитата Сообщение от Nitan Посмотреть сообщение
Larsus, а первая ссылка вирусная. Каким образом она вам помогла? А за остальные две ссылки спасибо.
Извиняюсь, но мой антивирь молчит когда я её открываю
Там статья Олега Титова “Работа с коммуникационными портами (COM и LPT) в программах для Win32”
вот ссылка на PDF work_with_communication_ports.pdf
в вот ещё похожий ресур Работа с последовательными портами
1
 Аватар для El Fuego
16 / 15 / 2
Регистрация: 07.12.2009
Сообщений: 52
06.07.2010, 15:41
вот тут тоже есть немного информации
Вложения
Тип файла: pdf COM_port_potoki_TThread_WINAPI.pdf (488.8 Кб, 858 просмотров)
2
 Аватар для El Fuego
16 / 15 / 2
Регистрация: 07.12.2009
Сообщений: 52
06.07.2010, 15:51
Цитата Сообщение от Larsus Посмотреть сообщение
bluetooth и телефон Nokia устанавливаю соединение через виртуальный com порт
а у тебя драйвера стоят от нокиа или чужие?
не пробовал установить соединение на чужом драйвере, например PL-2303

но кажется блютуф всё равно зацепит родные
0
64 / 64 / 10
Регистрация: 19.10.2009
Сообщений: 234
06.07.2010, 16:01  [ТС]
Цитата Сообщение от El Fuego Посмотреть сообщение
а у тебя драйвера стоят от нокиа или чужие?
не пробовал установить соединение на чужом драйвере, например PL-2303

но кажется блютуф всё равно зацепит родные
Я никакие дрова от Nokia не ставил, просто установил bluetooth в bluetooth окружении нашел мобильник и создал виртуальное com соединение и все =)
0
 Аватар для El Fuego
16 / 15 / 2
Регистрация: 07.12.2009
Сообщений: 52
06.07.2010, 16:12
Цитата Сообщение от Larsus Посмотреть сообщение
в bluetooth окружении нашел мобильник и создал виртуальное com соединение и все =)
значит на семёрке работаешь или висте

ну да ладно...спасб
0
64 / 64 / 10
Регистрация: 19.10.2009
Сообщений: 234
09.07.2010, 10:36  [ТС]
Ну вот теперь я поправил исходники и могу поделиться. Полностью проверено с телефоном Nokia, и Bluetooth 2.1
Файл ClassComPort.h
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
//---------------------------------------------------------------------------
#ifndef ClassComPortH
#define ClassComPortH
#include <Classes.hpp>
//---------------------------------------------------------------------------
#define BUFSIZE 255 //ёмкость буфера
HANDLE COMport;
OVERLAPPED overlapped;                          //будем использовать для операций чтения (см. поток ReadThread)
OVERLAPPED overlappedwr;                        //будем использовать для операций записи (см. поток WriteThread)
unsigned char bufrd[BUFSIZE], bufwr[BUFSIZE];
unsigned long counter;
bool fl=0;                                      //флаг, указывающий на успешность операций записи (1 - успешно, 0 - не успешно)
//---------------------------------------------------------------------------
class TComPort
{
private:
    void __fastcall ComClose();
protected:
public:
    void __fastcall ComOpen(String NamePort, String SpeedPort, String Appointment);
    void __fastcall SendCommand(String ATComand);
    __fastcall TComPort();
    int PhoneEvents;                            //соятояние телефона
                                                //0 - мониторинг входящих вызовов
                                                //1 - мониторинг исходящих вызов
    String PhoneEvantsStr;
    String Phone;
};
//---------------------------------------------------------------------------
//клас потока отсылки сообщений
class SendThread : public TThread
{
private:
    void __fastcall SendPrinting();
protected:
    void __fastcall Execute();
public:
    __fastcall SendThread(bool CreateSuspended);
};
SendThread *SendMessages;
//---------------------------------------------------------------------------
//клас потока приема сообщений
class GetThread : public TThread
{
private:
    void __fastcall GetPrinting();
//  void __fastcall ClearPrinting();
protected:
    void __fastcall Execute();
public:
    __fastcall GetThread(bool CreateSuspended);
};
GetThread *GetMessages; //объект потока GetThread
//---------------------------------------------------------------------------
//клас потока приема сообщений
class ClearThread : public TThread
{
private:
    void __fastcall ClearPrinting();
protected:
    void __fastcall Execute();
public:
    __fastcall ClearThread(bool CreateSuspended);
};
ClearThread *ClearMessages; //объект потока ClearThread
//---------------------------------------------------------------------------
#endif
Файл ClassComPort.cpp

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
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
//---------------------------------------------------------------------------
#pragma hdrstop
#include "ClassComPort.h"
#include "MainUnit.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
//---------------------------------------------------------------------------
//конструктор класса
__fastcall TComPort::TComPort()
{
}
//---------------------------------------------------------------------------
//конструктор потока отправки сообщений
__fastcall SendThread::SendThread(bool CreateSuspended) : TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
//потоки приема сообщений
__fastcall GetThread::GetThread(bool CreateSuspended) : TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
//потоки очистки сообщений
__fastcall ClearThread::ClearThread(bool CreateSuspended) : TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall TComPort::ComOpen(String NamePort, String SpeedPort, String Appointment)
{
    DCB dcb;                                                                    //структура для общей инициализации порта DCB
    COMMTIMEOUTS timeouts;                                                      //структура для установки таймаутов
    //открыть порт, для асинхронных операций обязательно  нужно указать флаг FILE_FLAG_OVERLAPPED
    COMport = CreateFile(NamePort.t_str(),GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
    //здесь:
    // - NamePort.t_str() - имя порта в качестве имени файла, t_str() преобразует строку типа String в строку в виде массива типа char, иначе функция не примет
    // - GENERIC_READ | GENERIC_WRITE - доступ к порту на чтение/записть
    // - 0 - порт не может быть общедоступным (shared)
    // - NULL - дескриптор порта не наследуется, используется дескриптор безопасности по умолчанию
    // - OPEN_EXISTING - порт должен открываться как уже существующий файл
    // - FILE_FLAG_OVERLAPPED - этот флаг указывает на использование асинхронных операций
    // - NULL - указатель на файл шаблона не используется при работе с портами
    if(COMport == INVALID_HANDLE_VALUE) //если ошибка открытия порта
    {
        //обработать ошибку открытия порта
        return;
    }
    //инициализация порта
    dcb.DCBlength = sizeof(DCB);                                                //в первое поле структуры DCB необходимо занести её длину, она будет использоваться функциями настройки порта для контроля корректности структуры
    //считать структуру DCB из порта
    if(!GetCommState(COMport, &dcb))                                            //если не удалось - закрыть порт и вывести сообщение об ошибке в строке состояния
    {
        ComClose();
        //обработать ошибку считывания DBC
        return;
    }
    //инициализация структуры DCB
    dcb.BaudRate = StrToInt(SpeedPort);                                         //задаём скорость передачи 115200 бод
    dcb.fBinary = TRUE;                                                         //включаем двоичный режим обмена
    dcb.fOutxCtsFlow = FALSE;                                                   //выключаем режим слежения за сигналом CTS
    dcb.fOutxDsrFlow = FALSE;                                                   //выключаем режим слежения за сигналом DSR
    dcb.fDtrControl = DTR_CONTROL_DISABLE;                                      //отключаем использование линии DTR
    dcb.fDsrSensitivity = FALSE;                                                //отключаем восприимчивость драйвера к состоянию линии DSR
    dcb.fNull = FALSE;                                                          //разрешить приём нулевых байтов
    dcb.fRtsControl = RTS_CONTROL_DISABLE;                                      //отключаем использование линии RTS
    dcb.fAbortOnError = FALSE;                                                  //отключаем остановку всех операций чтения/записи при ошибке
    dcb.ByteSize = 8;                                                           //задаём 8 бит в байте
    dcb.Parity = 0;                                                             //отключаем проверку чётности
    dcb.StopBits = 0;                                                           //задаём один стоп-бит
    //загрузить структуру DCB в порт
    if(!SetCommState(COMport, &dcb))                                            //если не удалось - закрыть порт и вывести сообщение об ошибке в строке состояния
    {
        ComClose();
        //обработать ошибку установку DBC
        return;
    }
    //установить таймауты
    timeouts.ReadIntervalTimeout = 0;                                           //таймаут между двумя символами
    timeouts.ReadTotalTimeoutMultiplier = 0;                                    //общий таймаут операции чтения
    timeouts.ReadTotalTimeoutConstant = 0;                                      //константа для общего таймаута операции чтения
    timeouts.WriteTotalTimeoutMultiplier = 0;                                   //общий таймаут операции записи
    timeouts.WriteTotalTimeoutConstant = 0;                                     //константа для общего таймаута операции записи
    //записать структуру таймаутов в порт
    if(!SetCommTimeouts(COMport, &timeouts))                                    //если не удалось - закрыть порт и вывести сообщение об ошибке в строке состояния
    {
        ComClose();
        //обработать ошибку установки тайм - аутов
        return;
    }
    //установить размеры очередей приёма и передачи
    SetupComm(COMport,2000,2000);
    PurgeComm(COMport, PURGE_RXCLEAR);                                          //очистить принимающий буфер порта
    GetMessages = new GetThread(false);                                         //создать и запустить поток чтения байтов
    GetMessages->FreeOnTerminate = true;                                         //установить это свойство потока, чтобы он автоматически уничтожался после завершения
}
//---------------------------------------------------------------------------
void __fastcall TComPort::ComClose()
{
    if(SendMessages) SendMessages->Terminate();                                 //если поток записи работает, завершить его; проверка    if(writer) обязательна, иначе возникают ошибки
    if(GetMessages) GetMessages->Terminate();                                   //если поток чтения работает, завершить его; проверка    if(reader) обязательна, иначе возникают ошибки
    CloseHandle(COMport); //закрыть порт
    COMport=0; //обнулить переменную для дескриптора порта
}
//---------------------------------------------------------------------------
//отправка команд
void __fastcall TComPort::SendCommand(String ATComand)
{
    char *Commandbuf = ATComand.t_str();
    memset(bufwr,0,BUFSIZE);                                                    //очистить программный передающий буфер, чтобы данные не накладывались друг на друга
    PurgeComm(COMport, PURGE_TXCLEAR);                                          //очистить передающий буфер порта
    strcpy(bufwr,Commandbuf);                                                   //занести в программный передающий буфер строку
    SendMessages = new SendThread(false);                                       //создать и активировать поток записи данных в порт
    SendMessages->FreeOnTerminate = true;
}
//---------------------------------------------------------------------------
//главная функция потока отправки команд
void __fastcall SendThread::Execute()
{
    DWORD temp, signal;                                                         //temp - переменная-заглушка
    overlappedwr.hEvent = CreateEvent(NULL, true, true, NULL);                  //создать событие
    WriteFile(COMport, bufwr, strlen(bufwr), &temp, &overlappedwr);             //записать байты в порт (перекрываемая операция!)
    signal = WaitForSingleObject(overlappedwr.hEvent, INFINITE);                //приостановить поток, пока не завершится перекрываемая операция WriteFile
    if((signal == WAIT_OBJECT_0) && (GetOverlappedResult(COMport, &overlappedwr, &temp, true))) fl = true; //если операция завершилась успешно, установить соответствующий флажок
    else fl = false;
    Synchronize(SendPrinting); //вывести состояние операции в строке состояния
    CloseHandle(overlappedwr.hEvent); //перед выходом из потока закрыть объект-событие
}
//---------------------------------------------------------------------------
//вывод состояния передачи данных на экран
void __fastcall SendThread::SendPrinting()
{
    if(!fl)                                                                     //проверяем состояние флажка
    {
        //обработать ошибку передачи сообщения
        return;
    }
}
//---------------------------------------------------------------------------
//главная функция потока получения сообщений
void __fastcall GetThread::Execute()
{
    COMSTAT comstat;                                                            //структура текущего состояния порта, в данной программе используется для определения  количества принятых в порт байтов
    DWORD btr, temp, mask, signal;                                              //переменная temp используется в качестве заглушки
    overlapped.hEvent = CreateEvent(NULL, true, true, NULL);                    //создать сигнальный объект-событие для асинхронных операций
    SetCommMask(COMport, EV_RXCHAR);                                            //установить маску на срабатывание по событию приёма байта в порт
    while(!Terminated)                                                          //пока поток не будет прерван, выполняем цикл
    {
        if(ClearMessages) ClearMessages->Terminate();
        ClearMessages = new ClearThread(false);                                 //создать и активировать поток очистки данных в порту
        ClearMessages->FreeOnTerminate = true;
        WaitCommEvent(COMport, &mask, &overlapped);                             //ожидать события приёма байта (это и есть перекрываемая операция)
        signal = WaitForSingleObject(overlapped.hEvent, INFINITE);              //приостановить поток до прихода байта
        if(signal == WAIT_OBJECT_0)                                             //если событие прихода байта произошло
        {
            if(GetOverlappedResult(COMport, &overlapped, &temp, true))          //проверяем, успешно ли завершилась перекрываемая операция WaitCommEvent
            if((mask & EV_RXCHAR)!=0)                                           //если произошло именно событие прихода байта
            {
                ClearCommError(COMport, &temp, &comstat);                       //нужно заполнить структуру COMSTAT
                btr = comstat.cbInQue;                                          //и получить из неё количество принятых байтов
                if(btr)                                                         //если действительно есть байты для чтения
                {
                    ReadFile(COMport, bufrd, btr, &temp, &overlapped);          //прочитать байты из порта в буфер программы
                    counter += btr;                                             //увеличиваем счётчик байтов
                    Synchronize(GetPrinting);                                   //вызываем функцию для вывода данных на экран и в файл
                }
            }
        }
    }
    CloseHandle(overlapped.hEvent);                                             //перед выходом из потока закрыть объект-событие
}
//---------------------------------------------------------------------------
//вывод состояния получения данных на экран
void __fastcall GetThread::GetPrinting()
{
    MainForm->ThisPort->PhoneEvantsStr = "Свободен";
    String TextMessages = (char*)bufrd;                                         //выводим принятую строку (char*)bufrd
    int PositionIn = TextMessages.Pos("\"");
    if (PositionIn!= 0)
    {
        TextMessages = TextMessages.SubString(PositionIn + 1,TextMessages.Length() - PositionIn +1);
        TextMessages = "8" + TextMessages.SubString(3,TextMessages.Pos("\"")-3);
        MainForm->ThisPort->PhoneEvantsStr = "Входящий звонок";
        MainForm->Edit1->Text = TextMessages;
        MainForm->Label1->Caption = MainForm->ThisPort->PhoneEvantsStr;
        MainForm->ThisPort->PhoneEvents = 0;
    }
    PositionIn = TextMessages.Pos("+CLCC:");
    if (PositionIn!= 0)
    {
        int StatusPhone = StrToInt(TextMessages.SubString(14,1));
        //0     Соединение активно
        //1     Соединение удерживается
        //2     Осуществляется набор
        //3     Вызывается абонент
        //4     Входящее соединение
        //5     Ожидающее входящее соединение
        switch (StatusPhone)
        {
            case 0 :
                MainForm->ThisPort->PhoneEvantsStr = "Соединение активно";
                MainForm->Edit1->Text = MainForm->ThisPort->Phone;
                MainForm->Label1->Caption = MainForm->ThisPort->PhoneEvantsStr;
                MainForm->ThisPort->PhoneEvents = 1;
            break;
            case 1 :
                MainForm->ThisPort->PhoneEvantsStr = "Соединение удерживается";
                MainForm->Edit1->Text = MainForm->ThisPort->Phone;
                MainForm->Label1->Caption = MainForm->ThisPort->PhoneEvantsStr;
                MainForm->ThisPort->PhoneEvents = 1;
            break;
            case 2 :
                MainForm->ThisPort->PhoneEvantsStr = "Осуществляется набор";
                MainForm->Edit1->Text = MainForm->ThisPort->Phone;
                MainForm->Label1->Caption = MainForm->ThisPort->PhoneEvantsStr;
                MainForm->ThisPort->PhoneEvents = 1;
            break;
            case 3 :
                MainForm->ThisPort->PhoneEvantsStr = "Вызывается абонент";
                MainForm->Edit1->Text = MainForm->ThisPort->Phone;
                MainForm->Label1->Caption = MainForm->ThisPort->PhoneEvantsStr;
                MainForm->ThisPort->PhoneEvents = 1;
            break;
            default :
                MainForm->ThisPort->PhoneEvents = 0;
            break;
        }
//      MainForm->Memo1->Lines->Add(IntToStr(StatusPhone));                     //не требуется пока
    }
    else
    {
        MainForm->ThisPort->PhoneEvents = 0;
    }
    MainForm->Memo1->Lines->Add(TextMessages);
    memset(bufrd, 0, BUFSIZE);                                                  //очистить буфер (чтобы данные не накладывались друг на друга)
}
//---------------------------------------------------------------------------
//главная функция потока очистки сообщений
void __fastcall ClearThread::Execute()
{
    Sleep(5000);                                                                //самый оптимальный вариант засекал моргания почти нет
    if (!Terminated)
    {
        Synchronize(ClearPrinting);
    }
}
//---------------------------------------------------------------------------
//очистка выведенных данных
void __fastcall ClearThread::ClearPrinting()
{
    switch (MainForm->ThisPort->PhoneEvents)
    {
        case 0 :                                                                //если нет исходящего вызова
            MainForm->Edit1->Text = "";
            MainForm->Label1->Caption = "Свободен";
        break;
        case 1 :                                                                //если есть исходящий вызов
            MainForm->ThisPort->SendCommand("AT+CLCC;\r");                      //посылаем команду на проверку состояния
        break;
    }
}

Для примера киньте на форму два буттона 2 едита, и мемо

ну а дальше вот

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
    : TForm(Owner)
{
    ThisPort = new TComPort();
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::Button1Click(TObject *Sender)
{
    ThisPort->ComOpen("COM4", "19200", "");
    ThisPort->PhoneEvents = 0;
    ThisPort->SendCommand("AT+CLIP=1;\r");                 //команда для того чтобы телефон нам присылал в ответе номер входящего вызова
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::Button2Click(TObject *Sender)
{
    ThisPort->Phone = Edit2->Text;
    ThisPort->PhoneEvents = 1;
    ThisPort->SendCommand("ATD"+Edit2->Text+";\r");
    Sleep(500);                                                         //пауза нужна чтобы телефон уже начал набор номера а потом мы отправляем команду для проверки состояния
    ThisPort->SendCommand("AT+CLCC;\r");
}
//---------------------------------------------------------------------------

может местами можно было сделать и проще но увы я не придумал как, думаю и эта реализация может кому нибудь пригодиться.

Добавлено через 2 минуты
И забыл указать OC: XP, никаких дополнительных драйверов кроме тех что шли с Bluetooth не ставил
2
1 / 1 / 0
Регистрация: 04.10.2011
Сообщений: 10
14.10.2011, 08:46
А нет ли у кого нибудь dll работающей с com-portom. Чтение и запись. rs232/
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.10.2011, 08:46
Помогаю со студенческими работами здесь

Работа с COM портом на С++ Builder 6
Работаю я с GSM модемами, пишу под них программу на C++ Builder 6. Посылаю в модем, через COM порт соответственно, AT команды (строку...

И снова работа с COM портом
Приветствую всех. Уже измучился и измаялся весь пытаясь написать функцию. Помогите, пожалуйста... Описание задачи Создается...

Работа с USB портом.
Доброго всем времени суток! Суть задачи в следующем: Есть устройство (USB принтер этикеток) и им можно управлять при помощи...

Работа с COM портом и вообще...
Друзья спасайте! Для обмена необходимо выдать сигналы DTR = 1(+) и RTS = 0(-). Как это сделать? Я знаю регистры в которые нужно...

Асинхронная работа с COM портом.
Здравствуйте, Как известно, в Windows с COM портом можно работать в синхронном и асинхронном режиме. Для работы в асинхронном режиме...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru