Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.72/79: Рейтинг темы: голосов - 79, средняя оценка - 4.72
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 41
1

SerialPort в C++

06.10.2013, 08:47. Показов 16243. Ответов 14
Метки нет (Все метки)

Привет всем! Я начинаю изучать C++, помогите разобраться. Нужно по сериал порту передать строку. как это сделать? Пишу на c++ win32 console приложение.

Добавлено через 10 часов 22 минуты
Знаю как сделать это на C#.
1) Создать порт
C#
1
sp = new SerialPort;
2) Открыть
C#
1
sp.open();
3) Отправить строку
C#
1
sp.write("Blablabla");
4) Закрыть порт
C#
1
sp.close();
Подскажите, как создать порт на C++, нигде не могу найти.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.10.2013, 08:47
Ответы с готовыми решениями:

Serialport.write и serialport.basestream.write - в чем разница
в чем разница между следующими способами отправки данных на ком-порт?:...

Serialport
Есть программа но на этапе компиляции выдает ошибку. для компиляции использую ActiveState Perl Dev...

SerialPort в C#
Ребята помогите с несколькими примерами обработки входящих данных на COM port. просмотрел кучу...

SerialPort
Добрый день форумчане! Подскажите пожалуйста, используя библиотеку qserialport и команду...

14
249 / 219 / 63
Регистрация: 30.07.2013
Сообщений: 465
06.10.2013, 09:14 2
В бусте есть.
1
127 / 131 / 11
Регистрация: 25.12.2011
Сообщений: 443
06.10.2013, 09:19 3
Цитата Сообщение от Blastry Посмотреть сообщение
как создать порт на C++, нигде не могу найти
В стандарте C++ ничего про порты нет, поэтому нужно использовать библиотеки. Например, Qt, в которой есть QSerialPort.
1
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 41
06.10.2013, 17:40  [ТС] 4
скачал SDk Qt, установил, как ее в VS2010 подключить? Добавляю файлы исходного кода, заголовочные, пишет не может найти Qt библиотеку.
0
79 / 79 / 14
Регистрация: 27.06.2012
Сообщений: 555
Записей в блоге: 1
06.10.2013, 19:47 5
Blastry, по-моему, Qt для ваших целей избыточен, ИМХО. Если мне память не изменяет, в Win работа с портом представляется как работа с файлом, и WinAPI такую возможность предоставляет. Где-то я видел пример.
0
3409 / 2768 / 751
Регистрация: 25.03.2012
Сообщений: 10,042
Записей в блоге: 1
06.10.2013, 19:52 6
Используй WinAPI
лезть в QT из-за одной только работы с COM портом не стоит, я считаю.
Обмен данными через СОМ-порт
1
79 / 79 / 14
Регистрация: 27.06.2012
Сообщений: 555
Записей в блоге: 1
06.10.2013, 20:01 7
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
#include "stdafx.h"
#include <windows.h>
#include <iostream>
void ReadCOM();
HANDLE hSerial;
//Data receive method
 
int _tmain(int argc, _TCHAR* argv[])
{
    //Port name
    LPCTSTR portName=L"COM1";
    //open port
    hSerial=::CreateFile(portName,GENERIC_READ | GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
    //If some error occured
    if(hSerial==INVALID_HANDLE_VALUE)
    {
        if (GetLastError()==ERROR_FILE_NOT_FOUND) std::cout<<"This serial port doesn't exist\n";
        std::cout<<"Some other shit occured\n";
     
    }
    
    //Connection setting up
    DCB dcbSerialParams = {0};
    dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
    if (!GetCommState(hSerial, &dcbSerialParams))
    {
       std::cout << "getting state error\n";
    }
    dcbSerialParams.BaudRate=CBR_9600;
    dcbSerialParams.ByteSize=8;
    dcbSerialParams.StopBits=ONESTOPBIT;
    dcbSerialParams.Parity=NOPARITY;
    if(!SetCommState(hSerial, &dcbSerialParams))
    {
        std::cout << "error setting serial port state\n";
    }
    //Query string
    char data[] = "Hello from C++"; 
    DWORD dwSize = sizeof(data);   // string length
    DWORD dwBytesWritten;    // transmitted bytes amount
    //Sending
    BOOL iRet = WriteFile (hSerial,data,dwSize,&dwBytesWritten,NULL);
    if (!iRet) std::cout<<"Some shit occured\n";
    std::cout << dwSize << " Bytes in string. " << dwBytesWritten << " Bytes sended. " << std::endl;
    //Read data
    while(1)
    {
        ReadCOM();
    }
    return 0;
}
 
 
void ReadCOM()
{
      DWORD iSize;
      char sReceivedChar;
      while (true)
      {
            ReadFile(hSerial, &sReceivedChar, 1, &iSize, 0);  // get 1 byte
            if (iSize > 0)   // if some data received
                std::cout << sReceivedChar;
      }
}
1
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 41
06.10.2013, 20:36  [ТС] 8
Спасибо за код, но при компиляции вылетает ошибка:
1>main.cpp(9): error C2061: syntax error : identifier '_TCHAR'

После того как _TCHAR меняю на char:
1>MSVCRT.lib(crtexe.obj) : error LNK2001: unresolved external symbol _main

Ничего так и не получается.

Добавлено через 6 минут
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Используй WinAPI
лезть в QT из-за одной только работы с COM портом не стоит, я считаю.
Обмен данными через СОМ-порт
Ошибка при компиляции. Может, подскажите как исправить?
main.cpp(39): error C2664: 'CreateFileW' : cannot convert parameter 1 from 'char *' to 'LPCWSTR'
0
3409 / 2768 / 751
Регистрация: 25.03.2012
Сообщений: 10,042
Записей в блоге: 1
06.10.2013, 21:05 9
Цитата Сообщение от Blastry Посмотреть сообщение
main.cpp(39): error C2664: 'CreateFileW' : cannot convert parameter 1 from 'char *' to 'LPCWSTR'
настройки проекта Use Multibyte Character Set

Добавлено через 6 минут
вот так https://www.cyberforum.ru/atta... 1381079067
1
5 / 5 / 1
Регистрация: 25.10.2013
Сообщений: 230
01.03.2014, 20:16 10
1>c:\users\w\documents\visual studio 2013\projects\uopilot\com_console\main.cpp(8): error C2061: синтаксическая ошибка: идентификатор "_TCHAR"
1>c:\users\w\documents\visual studio 2013\projects\uopilot\com_console\main.cpp(11): error C2440: инициализация: невозможно преобразовать "const wchar_t [5]" в "LPCTSTR"
1> Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
мультибайт выставил...
при юникоде ошибка в 11 строке отсутствует.

Добавлено через 1 час 26 минут
Нашел исходник проекта из темы - компилится. Подскажите в чем проблема с _TCHAR? Она вроде как решена, но знаний то не прибавилось. Хочется разобраться и понять в чем проблема.
http://how2.org.ua/files/com_port_test.zip может кому пригодится.

Появилась еще одна проблемка, которая меня несколько ставит в тупик. С помощью com0com создал два ком порта для отладки. Путти/гипертерминал цепляются без проблем. Этот же код не хочет - пишет, что файл не существует(читай девайс не нашел). Пробовал внаглую поставить OPEN_ALWAYS, результата не дало. В чем может быть проблема? Указываю порт:
LPCTSTR portName=L"COM21";
Я же правильно понимаю, здесь просто номер порта указывается? С реальной железкой работает, но ее пока лучше не трогать во избежание денежных последствий для моего кошелька...
Спасибо.
0
3409 / 2768 / 751
Регистрация: 25.03.2012
Сообщений: 10,042
Записей в блоге: 1
01.03.2014, 20:46 11
Не стоило писать L"COM", надо просто "COM"
0
5 / 5 / 1
Регистрация: 25.10.2013
Сообщений: 230
01.03.2014, 23:27 12
Тогда компилятор не доволен...
1>i:\downloads\com_port_test\com_port_test\com_port_test.cpp (25): error C2440: инициализация: невозможно преобразовать "const char [6]" в "LPCTSTR"

Добавлено через 9 минут
Включил мультибайт, ошибка ушла, но проблема с подключением к порту осталась... С чего начинали к тому и пришли.

Добавлено через 2 часа 4 минуты
Расковырял исходники Putty:
/*
* Munge the string supplied by the user into a Windows filename.
*
* Windows supports opening a few "legacy" devices (including
* COM1-9) by specifying their names verbatim as a filename to
* open. (Thus, no files can ever have these names. See
* <http://msdn2.microsoft.com/en-us/library/aa365247.aspx>
* ("Naming a File") for the complete list of reserved names.)
*
* However, this doesn't let you get at devices COM10 and above.
* For that, you need to specify a filename like "\\.\COM10".
* This is also necessary for special serial and serial-like
* devices such as \\.\WCEUSBSH001. It also works for the "legacy"
* names, so you can do \\.\COM1 (verified as far back as Win95).
* See <http://msdn2.microsoft.com/en-us/library/aa363858.aspx>
* (CreateFile() docs).
*
* So, we believe that prepending "\\.\" should always be the
* Right Thing. However, just in case someone finds something to
* talk to that doesn't exist under there, if the serial line
* contains a backslash, we use it verbatim. (This also lets
* existing configurations using \\.\ continue working.)
*/
LPCTSTR sPortName = "\\.\COM21" // все так же не пашет
LPCTSTR sPortName = "COM5" // пашет
LPCTSTR sPortName = "\\.\COM5" // не пашет

Я чет уже вообще ниче не понимаю.
0
3409 / 2768 / 751
Регистрация: 25.03.2012
Сообщений: 10,042
Записей в блоге: 1
01.03.2014, 23:53 13
Так определись, блин! Какие строки используются в твоём проекте? Юникод или мультибайт? Соответствующие и используй!

Добавлено через 2 минуты
Зачем вообще использовать LPCTSTR, если есть LPCSTR ?
0
5 / 5 / 1
Регистрация: 25.10.2013
Сообщений: 230
02.03.2014, 12:55 14
Пока что там вообще ничего не используется. Для начала я пытаюсь просто открыть порт отдельным консольным приложением, чтобы получить состояние "оно как-то работает", довесить необходимыми проверками и потихоньку мигрировать. В итоге это будет простенькая дллка для общения через com. Шапка дллки со всей коммуникацией с программой использует юникод. Перетряхивать бы не хотелось, лучше на нем и сидеть.

Добавлено через 6 минут
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Зачем вообще использовать LPCTSTR, если есть LPCSTR ?
Честно? Без понятия. Это было из примера вроде как рабочего кода с предыдущей страницы. Что с тем, что с тем проблемы одни равно, как и с кодировками.

Добавлено через 46 минут
С COM2 виртуальным портом все работает. Истина где-то рядом.

Добавлено через 12 часов 5 минут
Вобщем нашел в чем косяк. На мсдн написано, что формат должен быть \\.\COMxx, вот только тот момент, что "\" будет воспринят, как символ экранирования тонко умолчали. Ну вроде как и мой косяк по неопытности(при том, что экран активно до этого использовал), но уж строку то рабочую можно было привести... проблем бы не возникло.Т.е. по факту при обращении к порту необходимо использовать: \\\\.\\COMxx
C++
1
2
3
LPCTSTR sPortName = L"\\\\.\\COM21";
hSerial = ::CreateFile(sPortName, GENERIC_READ | GENERIC_WRITE, 0, 0,
                 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
Теперь шуршит.
Слава исходникам putty.
Кстати атрибут там выставлен иначе, мсдн с ними согласен:
C++
1
2
    serport = CreateFile(serfilename, GENERIC_READ | GENERIC_WRITE, 0, NULL,
                 OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
Может кому пригодится.
1
21 / 19 / 3
Регистрация: 29.03.2019
Сообщений: 266
23.08.2019, 14:52 15
DarkMasterW, Спасибо. В таком виде работает.
Цитата Сообщение от DarkMasterW Посмотреть сообщение
\\\\.\\COMxx
Плюс изменил LPCTSTR на LPCSTR в итоге работает
C++
1
2
3
int _tmain(int argc, CHAR* argv[])
{
    LPCSTR sPortName = "\\\\.\\COM11";
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.08.2019, 14:52

Помощь в написании контрольных, курсовых и дипломных работ здесь.

SerialPort
Здравствуйте. Использую компонент SerialPort для чтения символов с ком-порта. Примерный код: ...

Serialport
Всем привет) подскажите пожалуйста, может кто встречался с такой проблемой. Иногда при получении...

SerialPort
Добрый день! Никак не выходит реализовать протокол 1Wire. Вроде бы на шину удается кинуть данные,...

Android + serialport
Доброго времени суток. Появилась необходимость связать контроллер с Android устройством(root есть)....


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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