Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/176: Рейтинг темы: голосов - 176, средняя оценка - 4.69
5 / 5 / 0
Регистрация: 01.12.2017
Сообщений: 36
1

Работа с COM-портом в C++ (соединение с Arduino)

01.12.2017, 12:51. Показов 35111. Ответов 24
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток, уважаемые коллеги!
Мне для проекта требуется соединить Arduino и компьютер через СОМ-порт. Скачал библиотеку CSerialPort, написал программу - не работайт! Пожалуйста, помогите разобраться, желательно с примерами кода, поменьше WinAPI (Я не профи в этой области).
Заранее благодарю.

Добавлено через 1 минуту
P. S.: Я использую VisualStudio!
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.12.2017, 12:51
Ответы с готовыми решениями:

работа с COM портом
здравствуйте всем,я в форумах в первие ,и просил бы не судить очень строго. помогите пожалуйста ,...

Работа с COM портом
Здравствуйте! В процессе написания программы работы с устройством, подключенным к ПК через...

Работа с COM-портом
Подскажите, какие компоненты нужны для работы с ком-портами? а именно (хотя бы для начала) отправка...

Работа с COM портом
по COM порту через Agilen подключается вольтметр с адресом 1. необходимо "прозвонить" все порты и...

24
управление сложностью
1687 / 1300 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
01.12.2017, 13:14 2
Что значит не работает ?
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 1
01.12.2017, 13:24 3
скачать архив.
глянуть файл app.cpp
сделать аналогично.
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
01.12.2017, 16:13 4
Цитата Сообщение от ProHacker2006 Посмотреть сообщение
Скачал библиотеку CSerialPort, написал программу - не работайт!
1. Приведи свой код.
2. Что именно не работает?
0
5 / 5 / 0
Регистрация: 01.12.2017
Сообщений: 36
01.12.2017, 20:35  [ТС] 5
Давно это было...
Не работало: ноль реакции на программу.
Ну, я и "обиделся" на библиотеку, удалил ее, а прогу не сохранил.
Но нашел другой источник. Тестирую.

Добавлено через 26 минут
Вроде работает :
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
#include <windows.h>
#include <iostream>
#include <conio.h>
using namespace std;
 
HANDLE hSerial;
 
int main(int argc, CHAR* argv[]) {
    LPCTSTR sPortName = LPCTSTR("COM4");
    hSerial = ::CreateFile(sPortName, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    if (hSerial == INVALID_HANDLE_VALUE) {
        if (GetLastError() == ERROR_FILE_NOT_FOUND) {
            cerr << "Serial port does not exist.\n";
        }
        cerr << "Some other error occurred.\n";
    }
    DCB dcbSerialParams = { 0 };
    dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
    if (!GetCommState(hSerial, &dcbSerialParams)) {
        cerr << "Getting state error.\n";
    }
    dcbSerialParams.BaudRate = CBR_9600;
    dcbSerialParams.ByteSize = 8;
    dcbSerialParams.StopBits = ONESTOPBIT;
    dcbSerialParams.Parity = NOPARITY;
    if (!SetCommState(hSerial, &dcbSerialParams)) {
        cerr << "Error setting serial port state.\n";
    }
    char data[] = "Hello from C++";
    DWORD dwSize = strlen(data);
    DWORD dwBytesWritten = sizeof(data);
    cout << dwSize << " Lengh string. " << dwBytesWritten << " Bytes sended." << endl;
    /*void ReadCOM() {;
        DWORD iSize;
        char sReceivedChar;
        while (true) {
            ReadFile(hSerial, &sReceivedChar, 1, &iSize, 0);
            if (iSize > 0) { cout << sReceivedChar; }
        }
    }*/
    while (_getch() != 13) {}
    return 0;
}
1
1375 / 519 / 72
Регистрация: 21.07.2015
Сообщений: 1,304
02.12.2017, 22:48 6
Цитата Сообщение от ProHacker2006 Посмотреть сообщение
Вроде работает
Что-то я не вижу в этом коде непосредственно отправки данных (WriteFile)...
1
5 / 5 / 0
Регистрация: 01.12.2017
Сообщений: 36
05.12.2017, 17:30  [ТС] 7
О, спасибо БОЛЬШОЕ! До этого не заметил.
1
5 / 5 / 0
Регистрация: 01.12.2017
Сообщений: 36
27.01.2018, 11:36  [ТС] 8
Ребята, сие заработало!!! Спасибо, blablacode.
Вот рабочий код, комп:
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
#include <windows.h>
#include <iostream>
using namespace std;
 
HANDLE hSerial;
 
void ReadCOM() {
    DWORD iSize;
    char sReceivedChar;
    while(true) {
        ReadFile(hSerial, &sReceivedChar, 1, &iSize, 0);  // получаем 1 байт
        if(iSize > 0)   // если что-то принято, выводим
            cout << sReceivedChar;
    }
}
 
int main() {
    LPCTSTR sPortName = "COM3";
    hSerial = ::CreateFile(sPortName, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    DCB dcbSerialParams = { 0 };
    dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
    if(!GetCommState(hSerial, &dcbSerialParams)){
        cout << "getting state error\n";
    }
    dcbSerialParams.BaudRate = CBR_9600;
    dcbSerialParams.ByteSize = 8;
    dcbSerialParams.StopBits = ONESTOPBIT;
    dcbSerialParams.Parity = NOPARITY;
    if(!SetCommState(hSerial, &dcbSerialParams)){
        cout << "error setting serial port state\n";
    }
    char data[] = "Hello from C++";  // строка для передачи
    DWORD dwSize = sizeof(data);   // размер этой строки
    DWORD dwBytesWritten;    // тут будет количество собственно переданных байт
    BOOL iRet = WriteFile(hSerial, data, dwSize, &dwBytesWritten, NULL);
    while(true) {
        ReadCOM();
    }
}
И ардуино:
C++
1
2
3
4
5
6
7
8
void setup() {
  Serial.begin(9600);
  while (Serial.available() == 0) {}
}
 
void loop() {
  Serial.write("HI!!!\n");
}
(Бесконечно выводит на порт "HI!!!")
1
Неэпический
17871 / 10636 / 2054
Регистрация: 27.09.2012
Сообщений: 26,738
Записей в блоге: 1
27.01.2018, 16:56 9
Если что, в теме Старый добрый COMPORT имеется пример соединения с Arduino с помощью boost::asio.
0
5 / 5 / 0
Регистрация: 01.12.2017
Сообщений: 36
27.01.2018, 22:16  [ТС] 10
Нее, непонятно там. ��
0
Неэпический
17871 / 10636 / 2054
Регистрация: 27.09.2012
Сообщений: 26,738
Записей в блоге: 1
28.01.2018, 05:59 11
ProHacker2006, ну надо же когда-то учиться.
1
5 / 5 / 0
Регистрация: 01.12.2017
Сообщений: 36
10.02.2018, 13:24  [ТС] 12
Как найду свободное время - обязательно
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.02.2018, 16:24 13
Я бы советовал использовать С++Qt классы QSerialPort, QSerialPortInfo.

Я их везде использую (как раз для ардуины)
0
5 / 5 / 0
Регистрация: 01.12.2017
Сообщений: 36
30.03.2018, 12:03  [ТС] 14
Спасибо за помощь! Но я решил использовать С#. С++ — классика, но не всегда удобно.
0
5 / 5 / 0
Регистрация: 01.12.2017
Сообщений: 36
08.04.2018, 19:48  [ТС] 15
Но вообще на Python перехожу
0
16 / 17 / 4
Регистрация: 27.06.2016
Сообщений: 236
27.03.2019, 18:38 16
Скажите пожалста я изучаю с++ тут мимо проходил и заметил в коде такое место "::CreateFile"
можно пояснить что в данном случае означает двойное двоеточие? Это похоже на пространство имён или что то вроде того но я не могу вспомнить.
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 1
27.03.2019, 18:39 17
Святогор, необязательно
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
27.03.2019, 18:46 18
Святогор, это значит "искать функцию только снаружи, вне данного класса". То есть для

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void CreateFile() {}
 
 
class MyClass
{
   void CreateFile() {}
 
   void DoSomething()
   {
      CreateFile();      // вызовется MyClass::CreateFile()
      ::CreateFile();   // вызовется не MyClass::CreateFile(), а CreateFile() которая снаружи
   }
 
};
2
1375 / 519 / 72
Регистрация: 21.07.2015
Сообщений: 1,304
27.03.2019, 18:47 19
Цитата Сообщение от Святогор Посмотреть сообщение
можно пояснить что в данном случае означает двойное двоеточие?
Глобальное пространство имен.
3
16 / 17 / 4
Регистрация: 27.06.2016
Сообщений: 236
27.03.2019, 19:13 20
Спасибо! Вот оно что оказывается....
0
27.03.2019, 19:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.03.2019, 19:13
Помогаю со студенческими работами здесь

Работа с Com портом
Привет всем! У меня собственно такая ситуация, есть bluetooth и телефон Nokia устанавливаю...

И снова работа с COM портом
Приветствую всех. Уже измучился и измаялся весь пытаясь написать функцию. Помогите, пожалуйста... ...

Работа с COM портом на С++ Builder 6
Работаю я с GSM модемами, пишу под них программу на C++ Builder 6. Посылаю в модем, через COM порт...

Асинхронная работа с COM портом.
Здравствуйте, Как известно, в Windows с COM портом можно работать в синхронном и асинхронном...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru