powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / COM port
25 сообщений из 37, страница 1 из 2
COM port
    #39906390
Mizer73
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изучаю работу ком-порта.
научился передавать/принимать символы по одиночке.
Но мне надо передать/принять более длинные данные в шестнадцетеричной системе.
Команда открытия канала связи со счетчиком:
Код запроса =1h
(1 байт)
Уровень доступа
(1 байт)
Пароль (6 байт)
Например:
01 02 02 02 02 02 02 02


попробовал так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
      ...
                       memset(bufwr,0,BUFSIZE);

                       int data[] = { 1, 1, 2, 2, 2, 2, 2, 2};
			for (int i = 0; i < 7; i++)
			{
				w = data[i];
				q = q + w;
			}
                        PurgeComm(COMport, PURGE_TXCLEAR); //очистить передающий буфер порта
			strcpy(bufwr, q.c_str()); //занести в программный передающий буфер строку из Edit1
			writer = new WriteThread(false); //создать и активировать поток записи данных в порт
			writer->FreeOnTerminate = true;



чую - фигня, и монитор порта молчит - не пошло. Хотя по символу если отправлять - всё идет.

Научите.
...
Рейтинг: 0 / 0
COM port
    #39906393
Mizer73
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
надо передать такие данные

Запрос: 03 01 01 00 01 00 1F 00 1F 00
...
Рейтинг: 0 / 0
COM port
    #39906406
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mizer73Научите.

Код: sql
1.
WriteFile(COMport, data, sizeof(data), &written, nullptr);


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
COM port
    #39906411
Mizer73
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

Mizer73Научите.

Код: sql
1.
WriteFile(COMport, data, sizeof(data), &written, nullptr);




да, это я понимаю.
я не понимаю, как мой запрос из значений HEX собрать в data?
...
Рейтинг: 0 / 0
COM port
    #39906426
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mizer73я не понимаю, как мой запрос из значений HEX собрать в data?

Код: sql
1.
unsigned char data[] = { 0x03, 0x01, 0x01, 0x00, 0x01, 0x00, 0x1F, 0x00, 0x1F, 0x00 };


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
COM port
    #39906427
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mizer73

[src C++]
strcpy(bufwr, q.c_str()); //занести в программный передающий буфер строку из Edit1
Научите.

Edit1... Скажите, это Борланд?
...
Рейтинг: 0 / 0
COM port
    #39906471
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mizer73
Изучаю...


1) код у Вас совсем не алё, от слова совсем. Что за магические переменные
w, q, bufwr, COMport
???
Обычно перед составлением вопроса на форуме надо пытаться самому разобраться досконально в том что делаешь. После этого убрать всё лишнее, оставив рыбу = саму суть вопроса. Код который Вы сюда постите должен(!) быть либо условно понятным либо готовым к компиляции. Иначе сообщество начнёт именно с этого - не компилляется...

2) При передачи данных вне компа, чётко описанные интерфейсы (как у Вас) - используют структуры как правило, выравненные на 1 байт. Заведите структуру, в ней опишите необходимые поля. А то по отношению к логики интерфейса у Вас сплошные магические числа 1,1,2,2 и т.д... А со структурой оно понятно и легче читается, сапотится, наследуется, юзается...

3) перед тем как бросаться в многопоточность, попытайтесь сделать в одном потоке(убрать всё лишнее).
4) если Вы поток не контролируете при подъёме - то рекомендую вообще его не запускать - Вам же пофигу встал он в обработчик оси или нет (а оно может секундами, минутами, часами не стартовать
- читай про многопоточность)....Так зачем же нагружать тупой работой ось???

удачи Вам
(круглый)
...
Рейтинг: 0 / 0
COM port
    #39906501
Mizer73
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
petrav
Mizer73

[src C++]
strcpy(bufwr, q.c_str()); //занести в программный передающий буфер строку из Edit1
Научите.

Edit1... Скажите, это Борланд?


да
...
Рейтинг: 0 / 0
COM port
    #39906502
Mizer73
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kolobok0
Mizer73
Изучаю...


1) код у Вас совсем не алё, от слова совсем. Что за магические переменные
w, q, bufwr, COMport
???
Обычно перед составлением вопроса на форуме надо пытаться самому разобраться досконально в том что делаешь. После этого убрать всё лишнее, оставив рыбу = саму суть вопроса. Код который Вы сюда постите должен(!) быть либо условно понятным либо готовым к компиляции. Иначе сообщество начнёт именно с этого - не компилляется...

2) При передачи данных вне компа, чётко описанные интерфейсы (как у Вас) - используют структуры как правило, выравненные на 1 байт. Заведите структуру, в ней опишите необходимые поля. А то по отношению к логики интерфейса у Вас сплошные магические числа 1,1,2,2 и т.д... А со структурой оно понятно и легче читается, сапотится, наследуется, юзается...

3) перед тем как бросаться в многопоточность, попытайтесь сделать в одном потоке(убрать всё лишнее).
4) если Вы поток не контролируете при подъёме - то рекомендую вообще его не запускать - Вам же пофигу встал он в обработчик оси или нет (а оно может секундами, минутами, часами не стартовать
- читай про многопоточность)....Так зачем же нагружать тупой работой ось???

удачи Вам
(круглый)


это кусок из многопоточной реализации отправки/приёма данных по ком порту.
мне все, что вокруг сейчас не интересно.
мне интересно, как исходя из этого кода запихнуть в компорт последовательность символов (командную строку).
это я и написал.
физически с приемом и отправкой сообщений проблем нет.
...
Рейтинг: 0 / 0
COM port
    #39906503
Mizer73
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kolobok0
Mizer73
Изучаю...


1) код у Вас совсем не алё, от слова совсем. Что за магические переменные
w, q, bufwr, COMport
???
Обычно перед составлением вопроса на форуме надо пытаться самому разобраться досконально в том что делаешь. После этого убрать всё лишнее, оставив рыбу = саму суть вопроса. Код который Вы сюда постите должен(!) быть либо условно понятным либо готовым к компиляции. Иначе сообщество начнёт именно с этого - не компилляется...

2) При передачи данных вне компа, чётко описанные интерфейсы (как у Вас) - используют структуры как правило, выравненные на 1 байт. Заведите структуру, в ней опишите необходимые поля. А то по отношению к логики интерфейса у Вас сплошные магические числа 1,1,2,2 и т.д... А со структурой оно понятно и легче читается, сапотится, наследуется, юзается...

3) перед тем как бросаться в многопоточность, попытайтесь сделать в одном потоке(убрать всё лишнее).
4) если Вы поток не контролируете при подъёме - то рекомендую вообще его не запускать - Вам же пофигу встал он в обработчик оси или нет (а оно может секундами, минутами, часами не стартовать
- читай про многопоточность)....Так зачем же нагружать тупой работой ось???

удачи Вам
(круглый)


полностью код отправки выглядит так:
Код: plaintext
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.
void __fastcall WriteThread::Execute()
{
	//NameThreadForDebugging(System::String(L"WriteThread"));
	//---- Place thread code here ----
	DWORD temp1, signal1; //temp1 - переменная-заглушка
	overlappedwr.hEvent = CreateEvent(NULL, true, true, NULL); //создать событие
	WriteFile(Ex_Operator->COMport1, Ex_Operator->bufwr1, strlen(Ex_Operator->bufwr1), &temp1, &overlappedwr); //записать байты в порт (перекрываемая операция!)
	signal1 = WaitForSingleObject(overlappedwr.hEvent, INFINITE); //приостановить поток, пока не завершится перекрываемая операция WriteFile
	if((signal1 == WAIT_OBJECT_0) && (GetOverlappedResult(Ex_Operator->COMport1, &overlappedwr, &temp1, true)))
		fl = true; //если операция завершилась успешно, установить соответствующий флажок
	else
		fl = false;
	Synchronize(Printing); //вывести состояние операции в строке состояния
	CloseHandle(overlappedwr.hEvent); //перед выходом из потока закрыть объект-событие
}

//---------------------------------------------------------------------------

//вывод состояния передачи данных на экран
void __fastcall WriteThread::Printing()
{
	if(!fl) //проверяем состояние флажка
	{
		//Form1->StatusBar1->Panels->Items[0]->Text = "Ошибка передачи";
		return;
	}
	//Form1->StatusBar1->Panels->Items[0]->Text = "Передача прошла успешно";
}
//---------------------------------------------------------------------------
...
Рейтинг: 0 / 0
COM port
    #39906508
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mizer73полностью код отправки выглядит так

Копи-паст, бессмысленный и беспощадный.

Ты можешь внятно объяснить зачем overlapped вывод стоит сразу рядом с бесконечным
ожиданием его завершения?

А если коды для отправки у тебя вводит пользователь, то их преобразование в двоичный вид -
простенький цикл работы конечного автомата.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
COM port
    #39906518
Mizer73
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

Mizer73полностью код отправки выглядит так

Копи-паст, бессмысленный и беспощадный.

Ты можешь внятно объяснить зачем overlapped вывод стоит сразу рядом с бесконечным
ожиданием его завершения?

А если коды для отправки у тебя вводит пользователь, то их преобразование в двоичный вид -
простенький цикл работы конечного автомата.


это обслуживание события.
создаёт события по компорту
...
Рейтинг: 0 / 0
COM port
    #39906519
Mizer73
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
до чего люди странные.
Просишь помощи в одном, дают советы в другом.
Если код считаете плохим, скажите как лучше.

ТОлько еще ни одного ответа на свой вопрос не получил.
...
Рейтинг: 0 / 0
COM port
    #39906522
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mizer73Если код считаете плохим, скажите как лучше

Убрать overlapped. Везде.
Убрать потоки. Везде.

Mizer73ТОлько еще ни одного ответа на свой вопрос не получил.

Это потому что ты ещё не задал ни одного внятного вопроса.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
COM port
    #39906531
Mizer73
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

потоки мне нужны. Пользуюсь потоком на чтение. А иначе как? У меня нет варианта ждать ответа. Все работает в онлайн.


А как без оверлапт?

Вопрос:
мне надо передать в порт несколько байт. Такой вариант решения верный?

Код: plaintext
1.
2.
int data[] = { 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02};
WriteFile(COMport, data, sizeof(data), &temp, &overlappedwr);




п.с.
WriteFile(COMport, data, sizeof(data), &temp, nullptr); - не пошел, ругается на nullptr
...
Рейтинг: 0 / 0
COM port
    #39906533
Mizer73
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
при

Код: plaintext
1.
#define nullptr 0



пошло
Код: plaintext
1.
WriteFile(COMport, data, sizeof(data), &written, nullptr);
...
Рейтинг: 0 / 0
COM port
    #39906536
Mizer73
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как без
Код: plaintext
1.
Event

отслеживать событие отправки? Если использовать
Код: plaintext
1.
WriteFile(COMport, Ex_Operator->bufwr1, strlen(Ex_Operator->bufwr1), &written, nullptr);
...
Рейтинг: 0 / 0
COM port
    #39906574
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mizer73
Код: plaintext
1.
WriteFile(COMport, Ex_Operator->bufwr1, strlen(Ex_Operator->bufwr1), &written, nullptr);


WriteFile здесь синхронный, отслеживать нечего
...
Рейтинг: 0 / 0
COM port
    #39906581
Mizer73
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил, тут - наверно нечего.
А здесь

Код: plaintext
1.
overlappedwr.hEvent = CreateEvent(NULL, true, true, NULL); //создать событие



создаётся событие, которое отслеживается
...
Рейтинг: 0 / 0
COM port
    #39906582
Mizer73
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил
Mizer73
Код: plaintext
1.
WriteFile(COMport, Ex_Operator->bufwr1, strlen(Ex_Operator->bufwr1), &written, nullptr);


WriteFile здесь синхронный, отслеживать нечего



или имеется в виду, что если уж ушло, значит ушло?
...
Рейтинг: 0 / 0
COM port
    #39906594
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mizer73Пользуюсь потоком на чтение. А иначе как?

Вариантов много, но поток - вполне правильный. На чтение.

На запись поток не нужен.

Overlapped убрать отовсюду. Если WriteFile вернулось без ошибки, значит всё записалось.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
COM port
    #39906615
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mizer73,

Выше перечень с чего начать дал. Если с лёту не понял - значит дальнейший разговор мимо.
Попытка с Вашей стороны упорствовать в ереси - похвально в плане упорства, но вот вектор направлять нужно не на тех кто подсказывает правильную дверь, а на гранит накопленных ранее человечеством знаний.
Набор буковок называемое Вами кодом - обсуждать даже не охота, если нет от Вас вектора на обучение.
За такой код - выгоняют сразу, ну или срезают зарплату в двое для начала... имхо конечно же.

Из книг, для понимания - рекомендую альма матер = K&R
Многопоточность для Вас пока рано. от слова совсем... Если гложит дух сомнений - тогда рекомендую погрызть книгу Рихтера "Windows для профессионалов". Там фундамент по синхронизации для форточек. Правда по скоростным решениям устарело - но фундамент тот-же и без него дальше Вы будете постоянно косячить.


удачи Вам,
она Вам потребуется, если не услышите
(круглый)
...
Рейтинг: 0 / 0
COM port
    #39906713
Mizer73
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

Mizer73Пользуюсь потоком на чтение. А иначе как?

Вариантов много, но поток - вполне правильный. На чтение.

На запись поток не нужен.

Overlapped убрать отовсюду. Если WriteFile вернулось без ошибки, значит всё записалось.

понял, спасибо
...
Рейтинг: 0 / 0
COM port
    #39906715
Mizer73
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вопрос. Имею данные
int data[] = { 0xd5,0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x12, 0x92};

пытаюсь передать массив int data[] в функцию, которая их отошлёт их в порт.

Код: plaintext
1.
bool __fastcall TForm1::WriteComData(int data[])




Код: plaintext
1.
2.
 int data[] = { 0xd5,0x05, 0x31, 0x00, 0x0D}; //05 31 00
	WriteComData(data);



принимает из массива только первый байт
...
Рейтинг: 0 / 0
COM port
    #39906717
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мозг включи. Ты же размер не передаёшь. И int это четыре байта, кстати.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 37, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / COM port
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]