Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Триган
1 / 1 / 0
Регистрация: 23.11.2013
Сообщений: 39
#1

Старый добрый COMPORT - C++

25.06.2015, 14:33. Просмотров 1172. Ответов 12
Метки нет (Все метки)

Как же надоели эти ком порты, уже неделю занимаюсь с ними а толку ноль. У меня C++ Bulder. Собственно никаких элементов управления для работы с ком портами у меня нет. Находил видео как чувак пользуется компонентом ComPort но он платный и не дешёвый а значит мне не подходит, идём по другому пути. Находил в инете много примеров для работы с ком портами и вы не поверите ни один пример не работает и при запуске выдаёт такую кучу ошибок что господи боже.

Попытки написать даже что то самое простое типа
C++ (Qt)
1
2
HANDLE port;
port=CreateFile("COM2",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
и о чудо 3 ошибки непонятно откуда

Прошу не кидайте в ответ сообщения типа: посмотри тут/здесь и куча ссылок (все ссылки конечно же ведут на кибер форум где чувак задаёт вопрос про ком порты и ниже ему отвечают "посмотри тут/здесь") и так по кругу.

Собственно что по заданию: имеется у меня ардуино уно, на ардуино светодиод, хочу создать форму на неё поместить 2 кнопки вкл и выкл. Нажал вкл диод вкл нажал выкл диод соответственно потух. Для ардуино код написал, это лекго. С помощью processing управлял светодиодом но этого мне мало. И вот я пришёл к C++ bulder и упёрся в эти ком порты.

Не пишите что я идиот или то что моя затея идиотская, я это и так знаю, просто очень хочется.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.06.2015, 14:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Старый добрый COMPORT (C++):

Где можно скачать компонент ComPort? - C++
Где можно скачать компонент ComPort? Весь гугл перерыл, ничего толкового найти не удалось. Самое нормальное нашёл тут...

Чтение данных из COMport - C++ Builder
Хоть эта тема уже поднималось не раз, но проблему я так решить и не смог. Задача: Нужно что бы программа считывала информацию из com...

Не компилится с ComPort Library - C++ Builder
Привет! Для того, чтобы программа запускалась на чужом компе, что делать прочитал в теме вверху, спасибо! Я использую ComPort Library...

ComPort library Потеря символов - C++ Builder
Кто то может работал с этой библой, делаю отправку 10 символов по нажатию кнопки с поля Edit1, первые 10 символов улетают полностью при...

Ищу исходники модуля ComSignal для работы с ComPort - C++ Builder
Помогите откомпилировать программу для работы с Com портом, требовались файлы ComPort и ComSignal, ComPort нашел, а вот ComSignal.hpp и...

Добрый день, кто сталкивался с подобными заданиями? - C++ Builder
Не могу понять как это можно сделать, не силен в с++ . Отблагодарю за помощь)

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Почтальон
Модератор
363 / 285 / 50
Регистрация: 22.03.2015
Сообщений: 2,232
Завершенные тесты: 1
25.06.2015, 14:39 #2
Вы даже не искали походу Где можно скачать компонент ComPort?
Триган
1 / 1 / 0
Регистрация: 23.11.2013
Сообщений: 39
25.06.2015, 14:45  [ТС] #3
Цитата Сообщение от Почтальон Посмотреть сообщение
Вы даже не искали походу Где ComPort?
Искал и никакого упоминания про BComPort не нашёл, мало того гугл постоянно правит эту запись когда ищу для C++ для делфи норм
Почтальон
Модератор
363 / 285 / 50
Регистрация: 22.03.2015
Сообщений: 2,232
Завершенные тесты: 1
25.06.2015, 15:56 #4
А разница в чем, если вы компоненту будете качать ?
Триган
1 / 1 / 0
Регистрация: 23.11.2013
Сообщений: 39
25.06.2015, 16:10  [ТС] #5
Цитата Сообщение от Почтальон Посмотреть сообщение
А разница в чем, если вы компоненту будете качать ?
Хорошо, скачал я его вот readme к нему

===============================================================================
Компонент TBComPort
===============================================================================

Автор : Брусникин Игорь Викторович - majar@nm.ru

Версия : 2.10 - 24.11.2005

Статус : Свободно распостраняемый (freeware).

Назначение : Компонент для обмена данными с внешними устройствами через
интерфейс RS-232 в асинхронном или синхронном режиме. Работает
с Delphi 2..7 под Windows 9X/ME/NT4/2K/XP.

Установка : Для Delphi2:
- в меню Component выберите команду Install...
- в диалоге Install Components щелкните кнопку Add...
- в диалоге Add Module щелкните кнопку Browse и выберите файл
BCPort.pas
- в диалоге Add Module щелкните кнопку OK.
Для Delphi3 и выше:
- в меню File выберите команду Open
- выберите файл BComPortD3.dpk .. BComPortD7.dpk для
Delphi3 .. Delphi7 соответственно
- в диалоге Package щелкните кнопку Install.
В палитре компонентов на вкладке Samples появится компонент.

Подробно о свойствах, методах и событиях компонента TBComPort см. в файле
справки BComPort.chm. Каталог Demo содержит демонстрационные примеры
использования компонента.
Компонент разработан основе идей одной из лучших свободно-распостраняемых
библиотек ComPort Library от Dejan Crnila.

===============================================================================

История версий:

1.00 - Базовая версия от 08.07.2001;
1.10 - 14.03.2002 - Добавлено управление выходными линиями порта DTR и RTS.
1.20 - 22.05.2003 - Добавлена возможность чтения/записи в асинхронном режиме.
Добавлена поддержка событий. Файл справки Readme.doc.
2.00 - 01.03.2005 - Компонент полностью переработан на основе идей
ComPort Library ver.2.51 от Dejan Crnila. Файл справки BComPort.chm.
2.10 - 24.11.2005 - Изменения с учетом ComPort Library ver.3.0, оптимизация
кода. Добавлены демонстрационные примеры. Первый публичный релиз.

===============================================================================

Установить не получается если следовать инструкции, ему не нравятся файлы формата dpk. У вас есть другой метод? Тогда прошу в студию
Croessmah
Модератор
Эксперт CЭксперт С++
13147 / 7410 / 830
Регистрация: 27.09.2012
Сообщений: 18,244
Записей в блоге: 3
Завершенные тесты: 1
26.06.2015, 03:55 #6
Цитата Сообщение от Триган Посмотреть сообщение
У меня C++ Bulder.
На счет этого не в курсе, но

Цитата Сообщение от Триган Посмотреть сообщение
идём по другому пути.

ГКОД с примером (Gtkmm3.0 + boost::asio::serial_port, ide - codeblocks(gcc), os - ubuntu):
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
#include <string>
#include <vector>
#include <functional>
 
#include <boost/asio/serial_port.hpp>
#include <gtkmm.h>
 
class SPWiter
{
public:
    SPWiter( unsigned int baud, const std::string & deviceName )
        : m_serialPort ( m_io_service, deviceName )
    {
        if ( !m_serialPort.is_open() )
        {
            std::cerr << "error: can not open \"" << deviceName << "\" device\n" ;
            return ;
        }
        m_serialPort.set_option( boost::asio::serial_port_base::baud_rate( baud ) ) ;
        m_serialPort.set_option( boost::asio::serial_port_base::character_size( 8 ) ) ;
        m_serialPort.set_option( boost::asio::serial_port_base::stop_bits( boost::asio::serial_port_base::stop_bits::one ) ) ;
        m_serialPort.set_option( boost::asio::serial_port_base::parity( boost::asio::serial_port_base::parity::none ) ) ;
        m_serialPort.set_option( boost::asio::serial_port_base::flow_control( boost::asio::serial_port_base::flow_control::none ) ) ;
 
    }
    void write ( const std::vector<char> & data )
    {
        if ( m_serialPort.is_open() )
            m_serialPort.write_some ( boost::asio::buffer ( data ) ) ;
    }
 
    ~SPWiter()
    {
        if ( m_serialPort.is_open() ) {
            m_serialPort.cancel();
            m_serialPort.close();
        }
        m_io_service.stop();
        m_io_service.reset();
    }
 
 
 
private:
    boost::asio::io_service m_io_service ;
    boost::asio::serial_port m_serialPort ;
} ;
 
 
 
class MainWindow : public Gtk::Window
{
public:
    MainWindow ()
        : writer ( 9600 , "/dev/ttyUSB0" )
    {
        set_default_size( 200 , 200 ) ;
 
        m_buttonOn.set_border_width( 10 ) ;
        m_buttonOn.set_label( "LED ON" ) ;
        m_buttonOn.signal_clicked().connect ( std::bind( &SPWiter::write, &writer, std::vector<char>{'1'} ) ) ;
 
        m_buttonOff.set_border_width( 10 ) ;
        m_buttonOff.set_label( "LED OFF" ) ;
        m_buttonOff.signal_clicked().connect ( std::bind( &SPWiter::write, &writer, std::vector<char>{'0'} ) ) ;
 
        m_mainVBox.pack_start ( m_buttonOn ) ;
        m_mainVBox.pack_start ( m_buttonOff ) ;
        add ( m_mainVBox ) ;
        show_all_children() ;
    }
    ~MainWindow() {}
private:
    Gtk::Button m_buttonOff ;
    Gtk::Button m_buttonOn ;
    Gtk::VBox m_mainVBox ;
    SPWiter writer ;
} ;
 
 
 
 
 
int main( int argc , char ** argv )
{
    Glib::RefPtr < Gtk::Application > application = Gtk::Application::create( argc, argv ) ;
    MainWindow mainWindow ;
    mainWindow.set_position( Gtk::WindowPosition::WIN_POS_CENTER  ) ;
    return application->run( mainWindow ) ;
}

И код в самом uno(использовал Serial, но не суть):
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int ledPin = 9 ;
 
void setup() {
  pinMode ( ledPin , OUTPUT ) ;
  digitalWrite ( ledPin , LOW ) ;
  Serial.begin ( 9600 ) ;
}
 
void loop() {
  int incomingByte = 0 ;
  if ( Serial.available () > 0 )
  {
    incomingByte = Serial.read() ;
    if ( incomingByte == '1' )
    {
      digitalWrite ( ledPin , HIGH ) ;
    } else
    {
      digitalWrite ( ledPin , LOW ) ;
    }
  }
}
результат работы ГКОДА
Почтальон
26.06.2015, 08:24
  #7

Не по теме:

Прикольно

Триган
1 / 1 / 0
Регистрация: 23.11.2013
Сообщений: 39
26.06.2015, 08:50  [ТС] #8
Цитата Сообщение от Croessmah Посмотреть сообщение
ГКОД с примером (Gtkmm3.0 + boost::asio::serial_port, ide - codeblocks(gcc), os - ubuntu):
Можно по подробнее про это?
Ну и про сам код на с++ а то практически ничего не понятно
Croessmah
Модератор
Эксперт CЭксперт С++
13147 / 7410 / 830
Регистрация: 27.09.2012
Сообщений: 18,244
Записей в блоге: 3
Завершенные тесты: 1
26.06.2015, 09:28 #9
Цитата Сообщение от Триган Посмотреть сообщение
Можно по подробнее про это?
Про Gtkmm у них хорошая документация на сайте http://www.gtkmm.org/en/documentation.html
На boost::asio::serial_port ссылка выше.
Статья на хабре о boost::asio
Цитата Сообщение от Триган Посмотреть сообщение
Ну и про сам код на с++ а то практически ничего не понятно
Код с некоторыми комментами под спойлером, но всё же нужно будет читать документацию
Кликните здесь для просмотра всего текста
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
#include <string>
#include <vector>
#include <functional>
 
#include <boost/asio/serial_port.hpp>
#include <gtkmm.h>
 
class SPWiter
{
public:
    SPWiter( unsigned int baud, const std::string & deviceName )
        : m_serialPort ( m_io_service, deviceName ) //Создаем объект порта, передаем ему io_service и имя порта
    {
        if ( !m_serialPort.is_open() ) //Если порт не открылся, то
        {
            std::cerr << "error: can not open \"" << deviceName << "\" device\n" ; //Выведем сообщение в strerr
            return ;
        }
        //Настройка параметров соединения
        m_serialPort.set_option( boost::asio::serial_port_base::baud_rate( baud ) ) ;
        m_serialPort.set_option( boost::asio::serial_port_base::character_size( 8 ) ) ;
        m_serialPort.set_option( boost::asio::serial_port_base::stop_bits( boost::asio::serial_port_base::stop_bits::one ) ) ;
        m_serialPort.set_option( boost::asio::serial_port_base::parity( boost::asio::serial_port_base::parity::none ) ) ;
        m_serialPort.set_option( boost::asio::serial_port_base::flow_control( boost::asio::serial_port_base::flow_control::none ) ) ;
 
    }
    void write ( const std::vector<char> & data )
    {
        if ( m_serialPort.is_open() ) //Если порт открыт
            m_serialPort.write_some ( boost::asio::buffer ( data ) ) ; //Пишем в него наш вектор
    }
 
    ~SPWiter()
    {
        if ( m_serialPort.is_open() ) { //Если порт открыт
            m_serialPort.cancel(); //Пытаемся заверть все ассинхронные операции
            m_serialPort.close(); //Закрываем порт
        }
        m_io_service.stop(); //Останавливаем цикл обработки
        m_io_service.reset(); //Сбрасываем состояние io_service
    }
private:
    boost::asio::io_service m_io_service ;
    boost::asio::serial_port m_serialPort ;
} ;
 
 
class MainWindow : public Gtk::Window //Наследуемся от класса окна
{
public:
    MainWindow ()
        : writer ( 9600 , "/dev/ttyUSB0" ) //Создаем объект порта, передаем ему скорость 9600 и имя порта (в винде будет COM1, COM2 или как там, не помню)
    {
        set_default_size( 200 , 200 ) ; //Задаем размер окна
 
        m_buttonOn.set_border_width( 10 ) ; //Размер границ элемента
        m_buttonOn.set_label( "LED ON" ) ; //Надпись на кнопке
        //std::bind( &SPWiter::write, &writer, std::vector<char>{'1'} - получим функтор, вызывающий writer.write ( наш_вектор_с_единичкой )
        //Соединяем сигнал clicked с полученным функтором
        m_buttonOn.signal_clicked().connect ( std::bind( &SPWiter::write, &writer, std::vector<char>{'1'} ) ) ;
        //Те же операции с другой кнопкой, только букавки другие на кнопке и в векторе нолик
        m_buttonOff.set_border_width( 10 ) ;
        m_buttonOff.set_label( "LED OFF" ) ;
        m_buttonOff.signal_clicked().connect ( std::bind( &SPWiter::write, &writer, std::vector<char>{'0'} ) ) ;
 
        //Компануем кнопки в вертикальный бокс
        m_mainVBox.pack_start ( m_buttonOn ) ;
        m_mainVBox.pack_start ( m_buttonOff ) ;
        //Добавляем бокс в окно
        add ( m_mainVBox ) ;
        //Отображаемвсех детей
        show_all_children() ;
    }
    ~MainWindow() {}
private:
    Gtk::Button m_buttonOff ;
    Gtk::Button m_buttonOn ;
    Gtk::VBox m_mainVBox ;
    SPWiter writer ;
} ;
 
 
int main( int argc , char ** argv )
{
    Glib::RefPtr < Gtk::Application > application = Gtk::Application::create( argc, argv ) ; //Создаем объект Gtk::Application
    MainWindow mainWindow ; //Создаем наше окно
    mainWindow.set_position( Gtk::WindowPosition::WIN_POS_CENTER  ) ; //Окно пусть будет по центру экрана
    return application->run( mainWindow ) ; //Запускаем цикл
}
SatanaXIII
Супер-модератор
Эксперт С++
5610 / 2644 / 245
Регистрация: 01.11.2011
Сообщений: 6,505
Завершенные тесты: 1
26.06.2015, 10:43 #10
Триган, вот старый-добрый ком порт, да падет на вашу голову Авазарт:
Ссылка на конкретный подробный материал с примерами раз
Ссылка на конкретный подробный материал с примерами два

Но вы его не хотите. Вы хотите волшебную кнопочку "сделать красиво".
Вот такой подход - "и о чудо 3 ошибки непонятно откуда" - это очень плохо. (Хотел тут написать шесть абзацев об ударении пальцев о другие пальцы, но смягчился)

Не открывать
Цитата Сообщение от Триган Посмотреть сообщение
ни один пример не работает и при запуске выдаёт такую кучу ошибок что господи боже
Avazart
Эксперт С++
7152 / 5329 / 278
Регистрация: 10.12.2010
Сообщений: 23,585
Записей в блоге: 17
12.07.2015, 15:16 #11
Цитата Сообщение от Croessmah Посмотреть сообщение
На счет этого не в курсе, но
Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
class SPWiter
Опечатка SPWriter наверное.

И у меня правда скейтч другой немного
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int ledPin= 13;
 
void setup() 
{
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(ledPin,OUTPUT);
}
 
void loop() 
{
  if(Serial.available()>0)
  {
    String val= Serial.readStringUntil('\n');
    if(val=="on")
       digitalWrite(ledPin,HIGH);
    else if(val=="off")  
       digitalWrite(ledPin,LOW);
    else   
       Serial.println("Wrong command!");
  }
}
Вложения
Тип файла: zip C++BuidlerXE3+boost_asio+serialport+arduino.zip (1.52 Мб, 7 просмотров)
Croessmah
12.07.2015, 15:35
  #12

Не по теме:

Цитата Сообщение от Avazart Посмотреть сообщение
Опечатка SPWriter наверное.
нет, не наверное, а точно

Avazart
Эксперт С++
7152 / 5329 / 278
Регистрация: 10.12.2010
Сообщений: 23,585
Записей в блоге: 17
12.07.2015, 15:42 #13

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
нет, не наверное, а точно
Ну может если ардуина китайская, то вероятно и код должен соответствовать ...


Кстати по теме, неплохо бы и пример с чтением с ардуины/порта.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.07.2015, 15:42
Привет! Вот еще темы с ответами:

День добрый по функциям текстового редактора подскажите - C++ Builder
День добрый по функциям текстового редактора подскажите Наипростейших редактор с одним полем мемо пара кнопок ну и меню в котором теже...

Как открыть старый проект в RAD Studio 2010 - C++ Builder
Здравствуйте! Нашел в сети проект. Но не могу его открыть в RAD Studio 2010. В проекте файлы .bpr. У товарища установлен C++Builder 6 и он...

Перенос проекта с 6 на 2009 Builder. Старый дизайн под Windows 2000 - C++ Builder
Здравствуйте перенёс проект с 6 на 2009. Остался старый дизайн после компиляции под 2009. Как это победить?

Снова старый добрый DOS - C++
/* Текст программы и выходные результаты */ #include &lt;stdio.h&gt; #include &lt;dos.h&gt; main() { int h,i; unsigned char...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
12.07.2015, 15:42
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru