Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
 Аватар для Сергей 190
365 / 348 / 74
Регистрация: 18.03.2015
Сообщений: 1,293

Как перенести код Unit1 в Unit2?

15.11.2015, 16:04. Показов 2925. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте господа профессионалы!
Написал на Builder 6 программу для общения чрез COM порт.
Все работает. Теперь, чтобы навести порядок и дальше не запутаться, некоторые функции нужно из Unit1 перенести в другой Unit.
На форме есть Button: «открыть порт» и «закрыть порт». Есть ComboBox «Выбрать номер порта».

Читал Архангельского. Читал на форуме похожие темы. Ничего не получается.

Подскажите, пожалуйста, чайнику:

1- как оставив Button и ComboBox в первой форме перенести функции их обработки в Unit2?

2- Возможно ли ф-ю «void __fastcall TForm1::ComboBox1Change(TObject *Sender) //Выбрать номер порта» написать «красивее»?

3- Почему порты COM1 – COM9 открываются, а выше COM10 – нет?

Unit1.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
// ...
 char* pcComPort= "COM9 ";
 HANDLE hCom;
 DWORD  b;
 OVERLAPPED   ov;
 int TIMEOUT = 1000;
 int baudrate=115200; //9600, 14400, 19200,38400, 57600, 115200
 DWORD bytesRead = 0;
 
// ...
 
void __fastcall TForm1::Button1Click(TObject *Sender)       //открыть порт
{    
hCom =CreateFile(pcComPort,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
 
    if(hCom == (HANDLE)-1) {
        hCom = 0;
            ShowMessage("Ошибка открытия порта");
    }
        else{
        ShowMessage("Порт открыт");
        }
    SetCommMask(hCom, EV_RXCHAR);
    SetupComm(hCom, 1500, 1500);
    COMMTIMEOUTS CommTimeOuts;
    CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF;
    CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
    CommTimeOuts.ReadTotalTimeoutConstant = TIMEOUT;
    CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
    CommTimeOuts.WriteTotalTimeoutConstant = TIMEOUT;
 
    if(!SetCommTimeouts(hCom, &CommTimeOuts)) {
        hCom = 0;
    }
 
    DCB ComDCM;
    memset(&ComDCM,0,sizeof(ComDCM));
    ComDCM.DCBlength = sizeof(DCB);
    GetCommState(hCom, &ComDCM);
    ComDCM.BaudRate = DWORD(baudrate);
    ComDCM.ByteSize = 8;
    ComDCM.Parity = NOPARITY;
    ComDCM.StopBits = ONESTOPBIT;
    ComDCM.fAbortOnError = TRUE;
    ComDCM.fDtrControl = DTR_CONTROL_DISABLE;
    ComDCM.fRtsControl = RTS_CONTROL_DISABLE;
    ComDCM.fBinary = TRUE;
    ComDCM.fParity = FALSE;
    ComDCM.fInX = FALSE;
            ComDCM.fOutX = FALSE;
    ComDCM.XonChar = 0;
    ComDCM.XoffChar = (unsigned char)0xFF;
    ComDCM.fErrorChar = FALSE;
    ComDCM.fNull = FALSE;
    ComDCM.fOutxCtsFlow = FALSE;
    ComDCM.fOutxDsrFlow = FALSE;
    ComDCM.XonLim = 128;
    ComDCM.XoffLim = 128;
 
    if(!SetCommState(hCom, &ComDCM)) {
        CloseHandle(hCom);
        hCom = 0;
    }
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button2Click(TObject *Sender)        //закрыть порт
{  
    CloseHandle(hCom);
    ShowMessage("Порт закрыт");
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::ComboBox1Change(TObject *Sender)        //Выбрать номер порта
{  
switch (ComboBox1->ItemIndex) {
case 0: pcComPort= "COM3";
break;
case 1: pcComPort= "COM4";
break;
case 2: pcComPort= "COM5";
break;
case 3: pcComPort= "COM6";
break;
case 4: pcComPort= "COM7";
break;
case 5: pcComPort= "COM8";
break;
case 6: pcComPort= "COM9";
break;
case 7: pcComPort= "COM10";
break;
case 8: pcComPort= "COM11";
break;
case 9: pcComPort= "COM12";
break;
case 10: pcComPort= "COM13";
break;
case 11: pcComPort= "COM14";
break;
case 12: pcComPort= "COM15";
break;
  }
 Label12->Caption=(pcComPort);
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.11.2015, 16:04
Ответы с готовыми решениями:

Не компилируется программа при попытке вызова функции из Unit1 в Unit2
Добрый день. Пишу программу, которая должна считывать данные с АЦП и обрабатывать определенным методом. Код считывание с АЦП предоставляет...

Перенести функции и процедуры в Unit2, и подключить к Unit1
Помогите пожалуйста, перенести процедуры и функции которые находятся в {фигурных скобках} во второй юнит, и подключить к первому.Спасибо

Как передать данные из UNit1 в Unit2
Как передать данные из UNit1 в Unit2, а точнее у меня есть массив в который собирается информация в Unit1, а в Unit2 я должен считать эту...

33
 Аватар для Сергей 190
365 / 348 / 74
Регистрация: 18.03.2015
Сообщений: 1,293
17.11.2015, 15:21  [ТС]
Студворк — интернет-сервис помощи студентам
Спасибо!
Завтра сделаю.
0
+1
345 / 178 / 53
Регистрация: 24.08.2010
Сообщений: 1,028
18.11.2015, 00:03
Цитата Сообщение от Сергей 190 Посмотреть сообщение
В View->Project Manager Pot1.cpp виден, а Pot1.txt – нет. Оказалось Pot1.txt находится в другой папке.
Я ничего не понимаю. Кто сможет объяснить?
В менеджере проекта Pot1.txt и не должен быть виден, ты создал его из винды.
Положить его надо в папку со всеми юнитами.
#include "Pot1. txt" писать не в шапке, а среди кода, как-нибудь так
C++
1
2
3
4
5
6
7
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
#include "Pot1.txt"
предполагая, что из этого места кусок кода перенесен в файл Pot1.txt и компилятор будет воспринимать Unit1.cpp и Pot1.txt как единый сплошной код одного юнита.
Лучше, конечно, делать *.cpp, так легче его редактировать прямо из билдера.
0
 Аватар для Lelik-pahan
1709 / 905 / 207
Регистрация: 25.11.2009
Сообщений: 1,858
18.11.2015, 09:09
Цитата Сообщение от +1 Посмотреть сообщение
#include "Pot1. txt" писать не в шапке, а среди кода
Лучше все подключения делать именно в шапке, чтобы потом не искать, как же всё это работает и откуда ноги растут. При нормальном офрмлении код, вырезанный и середины юнита, не испортит программу, если его подинклудить вверху.

И переносить обработчик событий в другой файл, конечно, можно, но на мой взгляд правильнее перенести код, обёрнутый в отдельную функцию, и просто вызывать её из обработчика. Тогда не возникнет путаницы.
0
 Аватар для Сергей 190
365 / 348 / 74
Регистрация: 18.03.2015
Сообщений: 1,293
18.11.2015, 14:48  [ТС]
Собрал рабочий проект в один Unit1.cpp. Работает.
Создал Unit2 и сохранил как PORT.
По Вашим рекомендациям перенес в PORT две ф-ии.

Unit1.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
//Порт 1_1---------------------------------------------------------------------------
//    sketch  Тестовое управление  Test_in_Arduino_5
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
#include "PORT.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//********************************************************************
 #include <windows.h>
 #include <string.h>
 
 
 #include "stdio.h" // для sprintf
 AnsiString pcComPort= "COM9 ";
 HANDLE hCom;
 DWORD  b;
 OVERLAPPED   ov;
 //int TIMEOUT = 1000;
// int baudrate=115200; //9600, 14400, 19200, 38400, 57600, 115200
 DWORD bytesRead = 0;
 char  In_arduino[111];//буфер для передачи в Ардуино
 char  buf2[55],buf1[1] ; //буфер для чтения из Ардуино
int x;
 
 int  tekx=0, znakX=0;
//Код символа 120"x" 88"X"  121"y" 89"Y" 122 "z" 90 "Z" 97 "a" 65 "A"
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{  //Передаём ДАННЫЕ
.
.
.
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit2KeyPress(TObject *Sender, char &Key)
{ //Передаём НАСТРОЙКИ длительности импульса
.
.
.
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Edit3KeyPress(TObject *Sender, char &Key)
{//Передаём НАСТРОЙКИ скважность
.
.
.
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button3Click(TObject *Sender)
{  // Чтение настроек Ардуино
.
.
.
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
OpenPort(pcComPort, hCom);
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button2Click(TObject *Sender)
{
   ClosePort(hCom);
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{  //Выбрать номер порта
pcComPort = "\\\\.\\COM" + IntToStr(ComboBox1->ItemIndex+3);
}
PORT.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
//---------------------------------------------------------------------------
#pragma hdrstop
#include "PORT.h"
//---------------------------------------------------------------------------
 
 int TIMEOUT = 1000;
int baudrate = 115200; //9600, 14400, 19200,38400, 57600, 115200
 
void OpenPort(AnsiString pcComPort, HANDLE &hCom)
{  //открыть порт
 
 hCom =CreateFile(pcComPort.c_str(),GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
 
    if(hCom == (HANDLE)-1) {
            hCom = 0;
            ShowMessage("Ошибка открытия порта");
    }
        else{
        Label11->Caption=StringReplace(pcComPort,"\\\\.","",TReplaceFlags());
        Button1->Enabled = false; // выключить
        Button2->Enabled = true; // включить
        Button3->Enabled = true; // включить
        }
    SetCommMask(hCom, EV_RXCHAR);
    SetupComm(hCom, 1500, 1500);
 
    COMMTIMEOUTS CommTimeOuts;
    CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF;
    CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
    CommTimeOuts.ReadTotalTimeoutConstant = TIMEOUT;
    CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
    CommTimeOuts.WriteTotalTimeoutConstant = TIMEOUT;
 
    if(!SetCommTimeouts(hCom, &CommTimeOuts)) {
        hCom = 0;
    }
 
    DCB ComDCM;
    memset(&ComDCM,0,sizeof(ComDCM));
    ComDCM.DCBlength = sizeof(DCB);
    GetCommState(hCom, &ComDCM);
    ComDCM.BaudRate = DWORD(baudrate);
    ComDCM.ByteSize = 8;
    ComDCM.Parity = NOPARITY;
    ComDCM.StopBits = ONESTOPBIT;
    ComDCM.fAbortOnError = TRUE;
    ComDCM.fDtrControl = DTR_CONTROL_DISABLE;
    ComDCM.fRtsControl = RTS_CONTROL_DISABLE;
    ComDCM.fBinary = TRUE;
    ComDCM.fParity = FALSE;
    ComDCM.fInX = FALSE;
        ComDCM.fOutX = FALSE;
    ComDCM.XonChar = 0;
    ComDCM.XoffChar = (unsigned char)0xFF;
    ComDCM.fErrorChar = FALSE;
    ComDCM.fNull = FALSE;
    ComDCM.fOutxCtsFlow = FALSE;
    ComDCM.fOutxDsrFlow = FALSE;
    ComDCM.XonLim = 128;
    ComDCM.XoffLim = 128;
 
    if(!SetCommState(hCom, &ComDCM)) {
        CloseHandle(hCom);
        hCom = 0;
    }
}
//---------------------------------------------------------------------------
void ClosePort(HANDLE &hCom)
{//закрыть порт
    CloseHandle(hCom);
    Label11->Caption=("Порт НЕ выбран");
        Button1->Enabled = true; // включить
        Button2->Enabled = false; // выключить
        Button3->Enabled = false; // выключить
}
//---------------------------------------------------------------------------
 
#pragma package(smart_init)
PORT.h
C++
1
2
3
4
5
6
7
8
9
10
//---------------------------------------------------------------------------
 
#ifndef PORTH
#define PORTH
//---------------------------------------------------------------------------
void OpenPort(AnsiString pcComPort, HANDLE &hCom);
void ClosePort(HANDLE &hCom);
//---------------------------------------------------------------------------
 
#endif
На строку void OpenPort(AnsiString pcComPort, HANDLE &hCom); в PORT.h
Получил следующее:

[C++ Error] PORT.h(6): E2147 'AnsiString' cannot start a parameter declaration
[C++ Error] PORT.h(6): E2303 Type name expected
[C++ Error] PORT.h(7): E2147 'HANDLE' cannot start a parameter declaration
[C++ Error] PORT.cpp(17): E2147 'AnsiString' cannot start a parameter declaration
[C++ Error] PORT.cpp(17): E2303 Type name expected
0
 Аватар для Lelik-pahan
1709 / 905 / 207
Регистрация: 25.11.2009
Сообщений: 1,858
18.11.2015, 14:57
Цитата Сообщение от Сергей 190 Посмотреть сообщение
По Вашим рекомендациям
В моих рекомендациях в Unit2.cpp первой строчкой написано
C++
1
#include <vcl.h>
1
 Аватар для Сергей 190
365 / 348 / 74
Регистрация: 18.03.2015
Сообщений: 1,293
18.11.2015, 15:58  [ТС]
Спасибо. Заработало. Но начало ругаться на
Label11->Caption=StringReplace(pcComPort,"\\\\." ,"",TReplaceFlags());
Button1->Enabled = false; // выключить
Button2->Enabled = true; // включить
Button3->Enabled = true; // включить

в Unit2.cpp
0
 Аватар для Lelik-pahan
1709 / 905 / 207
Регистрация: 25.11.2009
Сообщений: 1,858
18.11.2015, 16:17
А откуда в Unit2.cpp появились Label11 и Button`ы?

Зря ты их впихнул в функцию ClosePort. Лучше оставь это в первом юните
C++
1
2
3
4
5
6
7
8
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    ClosePort(hCom);
    Label11->Caption=("Порт НЕ выбран");
    Button1->Enabled = true; // включить
    Button2->Enabled = false; // выключить
    Button3->Enabled = false; // выключить
}
А вообще, если так уж нужно обращаться к компонентам первой формы из второго юнита, то в Unit2.cpp Добавь
C++
1
#include<Unit1.h>
и обращайся так
C++
1
Form1->Label1->Caption
1
 Аватар для Сергей 190
365 / 348 / 74
Регистрация: 18.03.2015
Сообщений: 1,293
19.11.2015, 13:10  [ТС]
Спасибо. Заработало!

Возникли еще вопросы:
В функции поставил проверку «открыт ли порт».
if(hCom == 0) ShowMessage("Сначала надо открыть порт.");
else{…….}
При запуске программы – работает. Если порт НЕ открыт – выводит сообщение "Сначала надо открыть порт." Если порт открыт – начинается работа с Ардуино.

Но если закрыть порт, ничего не происходит. Ни сообщения, ни работы.
Если потом заново открыть порт, то работает.

Когда не было проверки, то программа, при НЕ открытом порте, просто зависала.
Как ПРАВИЛЬНО проверить, открыт ли порт?
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
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{  //Передаём ДАННЫЕ
 if ( Key == VK_RETURN) {// реагируем на клавишу <Enter>
 if(hCom == 0) ShowMessage("Сначала надо открыть порт.");
 else{
x = StrToFloat (Edit1->Text); // получить данные из полей ввода
String Data=x;        //Переводим переменную х в строку
int len=Data.Length(); //Определяем длину строки Data–непосредственно разбиваемая строка
for (int i=1;i<=len;i++) buffer[i]=Data.SubString(i,1); //для отладки
sprintf (In_arduino,"x%s", Edit1->Text);//записываем в буфер значение из поля Edit1
WriteFile(hCom,In_arduino,len+1,&b,&ov);  //Пишем в порт
Edit1->Text="";  //обнуляем поле Edit1
  Label7->Caption=(In_arduino), Label7->Refresh();  // "Отправляем в порт"
  for (int jj=0; jj<33; jj++) (buf2[jj]=0);  // обнулить buf2
 //    FlushFileBuffers(hCom); // Вытолкнуть остаток из буфера.
    //*************
   int  jjj=0;
   tekx=0;
   Label8->Caption=("         "), Label8->Refresh(); //"Читаем порт"
 
   do  {
 Label10-> Color = clRed;
 Label10->Caption=("Читаем                      "),Label10->Refresh();
 Label10-> Color = clWhite ;
    ReadFile(hCom, buf1, 1, &bytesRead, &ov);   /* Начинаем чтение данных */
 if (bytesRead>0){
    if (buf1[0]==120) znakX=-1;  //Код символа "x"
    if (buf1[0]==88) znakX=1;  //Код символа "X"
    if (buf1[0]!=120 && buf1[0]!=88) {
        if (buf1[0]==62){   //Код символа ">"
          jjj++;
          Label8->Caption=(tekx*znakX), Label8->Refresh();
          tekx=0;
        }
        else tekx=tekx*10+buf1[0]-48;
        }
        }
   } while   (buf1[0]!=42 && buf1[0]!=33);   //Код символа * или !
    if (buf1[0]==42) Label10->Caption=("Чтение закончено ");
    if (buf1[0]==33) Label10->Caption=("Аварийный останов");
}
}
}
И один из моих первых вопросов.
Почему НЕ открывается COM10 и выше?
При подключении Ардуино, образовался COM.
Из среды разработки Ардуино, какой бы это порт не был (COM3 или COM33), работает.
Из моей программы работает только до COM9. Из консольной программы, написанной на Dev-C++, тоже не открывается.
Я бы не заморачивался. Но при подключении активного USB удлинителя, ставятся какие то драйвера.
Ардуино улетает с COM9 на COM13. Никакие переназначения порта из винды не помогают.
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
19.11.2015, 13:48
Цитата Сообщение от Сергей 190 Посмотреть сообщение
Никакие переназначения порта из винды не помогают
- вот это странно. В диспетчере устройств в свойствах порта (Параметры порта - Дополнительно) можно установить его номер, желательно тот, что не занят... .
Может, потребуется перезагрузить систему.
0
 Аватар для Сергей 190
365 / 348 / 74
Регистрация: 18.03.2015
Сообщений: 1,293
19.11.2015, 14:12  [ТС]
В винде порты, которые использовались ранее, отмечены как используемые, даже если устройства нет.
У меня одна Ардуина встала на COM6 две другие на COM9. Подключаю только одну. Но другой порт остается занятым. Если на него переопределить подключенную Ардуино, вылезет сообщение «порт занят», но переподключится и будет работать. Но с USB удлинителем такой номер не проходит даже из среды разработки Ардуино.
0
 Аватар для Lelik-pahan
1709 / 905 / 207
Регистрация: 25.11.2009
Сообщений: 1,858
19.11.2015, 16:56
Цитата Сообщение от Сергей 190 Посмотреть сообщение
Но если закрыть порт, ничего не происходит. Ни сообщения, ни работы.
добавь в конец функции ClosePort(HANDLE &hCom) строчку
C++
1
    hCom = 0;
Думаю, это поможет.


На счёт порта с двузначным номером - а ты точно открываешь порт с таким именем
C++
1
pcComPort = "\\\\.\\COM" + IntToStr(...);
а не вернулся к первоначальному варианту
C++
1
pcComPort = "COM" + IntToStr(...);
?
1
 Аватар для Сергей 190
365 / 348 / 74
Регистрация: 18.03.2015
Сообщений: 1,293
21.11.2015, 10:05  [ТС]
Добавил
C++
1
hCom = 0;
Заработало. Как сам до такой мелочи не догадался))).

Двухзначный порт не открывался, кода даже не было ф-ии выбора порта.
Тогда
C++
1
2
3
char* pcComPort= "COM13";
...
hCom =CreateFile(pcComPort,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
Ни из Dev-C++, ни из C++Builder 6

Мистика…
0
1409 / 573 / 127
Регистрация: 31.10.2011
Сообщений: 1,960
21.11.2015, 10:17
Цитата Сообщение от Сергей 190 Посмотреть сообщение
Мистика…
нет здесь никакой мистики. COM1-COM9 - зарегистрированные имена, в отличии от COM10 и дальше

http://www.vsokovikov.narod.ru... conven.htm
0
 Аватар для Сергей 190
365 / 348 / 74
Регистрация: 18.03.2015
Сообщений: 1,293
21.11.2015, 10:25  [ТС]
Столкнулся с еще одной непоняткой.
Есть несколько ф-ий передачи настроек и, отдельной кнопкой, ф-я чтения настроек.
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
void __fastcall TForm1::Edit3KeyPress(TObject *Sender, char &Key)
{//Передаём НАСТРОЙКИ скважность
     if ( Key == VK_RETURN) {// реагируем на клавишу <Enter>
 
x = StrToFloat (Edit3->Text); // получить данные из полей ввода
String Data=x;        //Переводим переменную х в строку
int len=Data.Length(); //Определяем длину строки Data–непосредственно разбиваемая строка
sprintf (In_arduino,"s%s", Edit3->Text);//записываем в буфер значение из поля Edit1
WriteFile(hCom,In_arduino,len+1,&b,&ov);  //Пишем в порт значение из поля Edit1
 
 Edit1->SetFocus();
 }
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button3Click(TObject *Sender)
{  // Чтение настроек Ардуино
    int jjj;
    for (jjj=0; jjj<=33; jjj++) buf2[jjj]=0; //обнуляем предыдущие значения в буфере
    WriteFile(hCom,"K",1,&b,&ov);  //Пишем в порт команда на передачу настроек
    ReadFile(hCom, buf2, 33, &bytesRead, &ov);//читаем порт
    if (bytesRead>0)     Label9->Caption=(buf2);
Edit1->SetFocus();
}
После передачи всех настроек глупо отдельно их запрашивать.
Написал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void __fastcall TForm1::Edit3KeyPress(TObject *Sender, char &Key)
{//Передаём НАСТРОЙКИ скважность
     if ( Key == VK_RETURN) {// реагируем на клавишу <Enter>
 
x = StrToFloat (Edit3->Text); // получить данные из полей ввода
String Data=x;        //Переводим переменную х в строку
int len=Data.Length(); //Определяем длину строки Data–непосредственно разбиваемая строка
sprintf (In_arduino,"s%s", Edit3->Text);//записываем в буфер значение из поля Edit1
WriteFile(hCom,In_arduino,len+1,&b,&ov);  //Пишем в порт значение из поля Edit1
 
// Чтение настроек Ардуино
     int jjj;
     for (jjj=0; jjj<=33; jjj++) buf2[jjj]=0; //обнуляем предыдущие значения в буфере
WriteFile(hCom,"K",1,&b,&ov);  //Пишем в порт команда на передачу настроек
      ReadFile(hCom, buf2, 33, &bytesRead, &ov);//читаем порт
if (bytesRead>0)     Label9->Caption=(buf2);
 Edit1->SetFocus();
 }
}
Компилируется без ошибок, но программа виснет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.11.2015, 10:25

Unit1 и Unit2
Здраствуйте,столкнулся с следующей проблемой. В юните2 сделал описание некоторых процедур и хочу их использовать в первом юните.Тоесть ...

Применение кода из Unit1 в Unit2
Здравствуйте. Как можно применить один код в нескольких Unit-ах ссылаясь на Unit1. В Unit1, Unit2, Unit3 .... много формул и из-за этого...

Вызов Unit1 из Unit2 и наоборот
День добрый! В программе имеется unit1 и unit2. Unit2 возникает при нажатии на кнопку из unit1. А при нажатии на кнопку в unit2 должен...

Circular unit reference between Unit2 and Unit1
Подскажите, в чем ошибка. Вот код всей программы: unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils,...

Вызов процедуры в Unit1 из Unit2 c параметрами
Всем добрый день! Уже умаялся, просмотрел многие сообщение, все мучаются, а толкового примера так и не нашел. В Unit1 есть много...


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

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса Калибровка параметров симбиотической модели: технический обзор Содержание: Введение Постановка проблемы Технические аспекты реализации Процесс внедрения изменений
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru