15 / 14 / 2
Регистрация: 24.09.2009
Сообщений: 68
|
||||||
1 | ||||||
Подключить устройство через COM-порт и отправить на него данные31.03.2010, 17:05. Показов 54573. Ответов 38
Метки нет (Все метки)
Всем доброго времени суток.
Потребовалось подключить устройство через COM-порт, и чтобы программа считывала и отправляла не него данные. Начал разбираться в теме и нашел примерно такой код:
ошибки все из разряда "missing storage-class or type specifiers" и "missing ';' before identifier" что-то у меня совсем нет идей как с этим бороться. Подскажите пожалуйста куда копать. Спасибо!
1
|
31.03.2010, 17:05 | |
Ответы с готовыми решениями:
38
Подскажите как отправить пакет 10 байт на устройство через com порт Можно ли подключить USB устройство через COM-порт? Отправить команду на устройство, подключенное к компьютеру через ethernet, и принять от него ответ Отправить данные на открытый порт |
31.03.2010, 17:08 | 2 |
http://msdn.microsoft.com/en-u... 85%29.aspx
слово public: убрать надо бы
0
|
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
|
|
31.03.2010, 17:10 | 3 |
если мне память не изменяет, работа с COM портом в ОС Windows осуществляется точно так же как чтение и запись в файл с именем "COMn", где n - номер порта. (сильно ногами не пинать, могу и ошибаться)
0
|
15 / 14 / 2
Регистрация: 24.09.2009
Сообщений: 68
|
||||||
31.03.2010, 17:18 [ТС] | 4 | |||||
я с таким раньше не сталкивался, поэтому не очень знаю что делать.. функции из этого файла использовать придется все равно, а если редактировать файл, то тогда как?
0
|
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
|
|
31.03.2010, 17:30 | 5 |
если честно, то да же и не подскажу наверное.... я больше по части C#, это только последний месяц на С++ пишу, вот и хожу по форуму да и пытаюсь вспоминать как и что на плюсах
0
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
|
31.03.2010, 22:46 | 6 |
GennDALF, код (хотя и не твой) - честно говоря, очень и очень слабый, на уровне студента-троечника, с массой ошибок. Рекомендую поискать в Сети другие примеры, их хватает. А этот - отправить прямиком в Корзину.
0
|
15 / 14 / 2
Регистрация: 24.09.2009
Сообщений: 68
|
|
31.03.2010, 23:39 [ТС] | 7 |
CheshireCat, я не программист по специальности, а занимаюсь этим по необходимости и на весьма любительском уровне. Так что вместо того чтобы тыкать носом (ах какой плохой код!) и отправлять в Сеть, лучше бы указал на ошибки и пути их исправления. Я, заметь, ни разу не попросил написать мне готовый код, я лишь прошу посоветовать, на что обратить внимание и что исправить.
Какой толк от вас, профессионалов, если вы чуть что "поищи в Сети"??
0
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
||||||
01.04.2010, 10:36 | 8 | |||||
1
|
15 / 14 / 2
Регистрация: 24.09.2009
Сообщений: 68
|
||||||
01.04.2010, 22:40 [ТС] | 9 | |||||
Спасибо, так значительно лучше! ))
насчет оконного приложения вы правы, код взят из книги Фленова "С++ глазами хакера", он там приводит пример с оконным приложением.. я его сперва просто переписал и попытался скомпилировать в таком виде, а тут эта ошибка с хэдером.. про то, что должно быть <windows.h> я уже нашел и потом сразу исправил большинство указанных вами ошибок и опечаток.. между открытием и закрытием я запихнул функцию определения типа порта и поэтому там все нормально. вообще программа приобрела такой вид:
как можно дать потоку сигнал? и зачем?
1
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
||||||
02.04.2010, 11:26 | 10 | |||||
Хмм.... Я бы сказал, что книга Михаила Фленова "С++ глазами хакера" - не из лучших. Листинги содержат массу грубых ошибок.
Так, теперь о TerminateThread. Применять этот способ завершения потока в "мирных условиях" нельзя - его применение оправдано только от безысходности, в исключительной ситуации, когда все другие способы завершить поток оказались безуспешными. Причина состоит в том, что при вызове TerminateThread поток убивается решительно и немедленно, - а достоверно неизвестно, какой код он в этот момент исполняет (а может случиться, что и в глубине какой-нибудь системной функции), - и, разумеется, все переменные, которые затрагивает его исполнение, остаются в несогласованном состоянии, не вызываются деструкторы локальных объектов и т.п. - короче, система остается в потенциально нестабильном состоянии. Если тебе повезет, то ничего фатального не случится. Если же не повезет.... значит, не повезет :-) Более грамотный способ - просигнализировать потоку о необходимости завершения, и дождаться его нормального завершения. Это можно сделать либо с помощью объектов синхронизации (пример - событие, event), либо с помощью переменных, имеющих булевское значение (возможно, придется применять Interlocked-функции). Например, так:
1
|
537 / 459 / 3
Регистрация: 08.07.2009
Сообщений: 2,625
|
|
02.04.2010, 13:33 | 11 |
Работа с параллельными портами - это не для любительского уровня, а для специалистов. Много ещё подводных комней, подобно тому, что описал CheshireCat.
0
|
15 / 14 / 2
Регистрация: 24.09.2009
Сообщений: 68
|
||||||
02.04.2010, 21:24 [ТС] | 12 | |||||
так, хорошо.. На понятийном уровне все замечательно и вызывать TerminateThread() мы, так и быть, не будем..
но только вот дождаться завершения не получается. На вызове WaitForSingleObject() прога либо виснет, либо еще как-то.
или от порта здесь ничего не зависит?
0
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
|
02.04.2010, 21:55 | 13 |
Полный код приведи. Потоковая функция событие проверяет? Как именно? Если WaitFor... виснет - значит, поток не завершился. Вот и любопытно знать, почему.
0
|
537 / 459 / 3
Регистрация: 08.07.2009
Сообщений: 2,625
|
|
02.04.2010, 22:13 | 14 |
В функцию WaitForSingleObject() передаётся параметр INFINITE. Вот она и ждёт как сказано - неопределённое время (подвисает). Верно бы было сделать так: определить крайний интервал, например 6 секунд и ждать его. По результу определить, из-за чего завершилась данная функция и если из-за того, что вышел интервал - терминайтить тред и написать об ошибке.
0
|
125 / 123 / 0
Регистрация: 30.03.2009
Сообщений: 766
|
|
02.04.2010, 22:23 | 15 |
Airhand, верно сделать так, чтобы дочерний поток завершался за 10ms
0
|
15 / 14 / 2
Регистрация: 24.09.2009
Сообщений: 68
|
||||||
03.04.2010, 06:27 [ТС] | 16 | |||||
0
|
537 / 459 / 3
Регистрация: 08.07.2009
Сообщений: 2,625
|
|
03.04.2010, 12:52 | 17 |
Не знаешь - лучше молчи. А если девайс что-то делает в это время, а ты его хлопнешь ? Непредсказуемые последствия. Для этого и нужен интервал не менее 2 секунд.
0
|
125 / 123 / 0
Регистрация: 30.03.2009
Сообщений: 766
|
|
03.04.2010, 13:57 | 18 |
Airhand, ты просто няшка ^___^
Добавлено через 1 минуту а я говорю о том, что с большой вероятностью неправильно написан код дочернего потока и ошибку надо искать там, чтобы он не зависал в принципе.
0
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
|
03.04.2010, 18:47 | 19 |
dwResult == 258 - это WAIT_TIMEOUT (можно посмотреть в winerror.h) - а значит, потоковая фунция не завершается за указанное время. Естественно, если стоит INFINITE - она не завершается никогда. Согласен с мнением Lolcht0 - код потоковой функции в студию!
0
|
15 / 14 / 2
Регистрация: 24.09.2009
Сообщений: 68
|
|
03.04.2010, 19:48 [ТС] | 20 |
эхм.. вообще-то я выложил весь код, который в деле.. )
функция write_data() еще не подключена, и между open_port() и close_port() стоит только check_port() ее код я тоже выкладывал..
0
|
03.04.2010, 19:48 | |
03.04.2010, 19:48 | |
Помогаю со студенческими работами здесь
20
Отправить данные на открытый порт Отправить данные на COM порт и вывести ответ Принять данные с одного порта, распарсить и отправить на другой порт Удалённое устройство или ресурс не принимает подключения через порт Отправить файл прошивки устройству через COM порт Как отправить байты, содержащиеся в некотором буфере через COM-порт? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |