Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / COM port / 25 сообщений из 37, страница 1 из 2
20.12.2019, 21:30
    #39906390
Mizer73
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COM port
Изучаю работу ком-порта.
научился передавать/принимать символы по одиночке.
Но мне надо передать/принять более длинные данные в шестнадцетеричной системе.
Команда открытия канала связи со счетчиком:
Код запроса =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
20.12.2019, 21:34
    #39906393
Mizer73
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COM port
надо передать такие данные

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

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


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

Mizer73Научите.

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




да, это я понимаю.
я не понимаю, как мой запрос из значений HEX собрать в data?
...
Рейтинг: 0 / 0
21.12.2019, 01:22
    #39906426
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COM port
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
21.12.2019, 01:25
    #39906427
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COM port
Mizer73

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

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


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

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

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

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

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

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


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


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

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

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

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


это кусок из многопоточной реализации отправки/приёма данных по ком порту.
мне все, что вокруг сейчас не интересно.
мне интересно, как исходя из этого кода запихнуть в компорт последовательность символов (командную строку).
это я и написал.
физически с приемом и отправкой сообщений проблем нет.
...
Рейтинг: 0 / 0
21.12.2019, 17:40
    #39906503
Mizer73
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COM port
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
21.12.2019, 17:52
    #39906508
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COM port
Mizer73полностью код отправки выглядит так

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

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

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

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

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

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

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


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

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

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

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

Это потому что ты ещё не задал ни одного внятного вопроса.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
21.12.2019, 19:43
    #39906531
Mizer73
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COM port
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
21.12.2019, 19:50
    #39906533
Mizer73
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COM port
при

Код: plaintext
1.
#define nullptr 0



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

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


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

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



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


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



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

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

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

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

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

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


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

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

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

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

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

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


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