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

SerialPort в C++ - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.83
Blastry
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 38
06.10.2013, 08:47     SerialPort в C++ #1
Привет всем! Я начинаю изучать 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++, нигде не могу найти.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.10.2013, 08:47     SerialPort в C++
Посмотрите здесь:

SerialPort в C# C#
Perl Serialport
C# Serialport.write и serialport.basestream.write - в чем разница
C# Serialport - Readline
C++ Qt SerialPort
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Fyret
184 / 170 / 13
Регистрация: 30.07.2013
Сообщений: 359
06.10.2013, 09:14     SerialPort в C++ #2
В бусте есть.
kamre
126 / 130 / 4
Регистрация: 25.12.2011
Сообщений: 438
06.10.2013, 09:19     SerialPort в C++ #3
Цитата Сообщение от Blastry Посмотреть сообщение
как создать порт на C++, нигде не могу найти
В стандарте C++ ничего про порты нет, поэтому нужно использовать библиотеки. Например, Qt, в которой есть QSerialPort.
Blastry
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 38
06.10.2013, 17:40  [ТС]     SerialPort в C++ #4
скачал SDk Qt, установил, как ее в VS2010 подключить? Добавляю файлы исходного кода, заголовочные, пишет не может найти Qt библиотеку.
VladislavTepes
 Аватар для VladislavTepes
78 / 78 / 5
Регистрация: 27.06.2012
Сообщений: 555
Записей в блоге: 1
06.10.2013, 19:47     SerialPort в C++ #5
Blastry, по-моему, Qt для ваших целей избыточен, ИМХО. Если мне память не изменяет, в Win работа с портом представляется как работа с файлом, и WinAPI такую возможность предоставляет. Где-то я видел пример.
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
06.10.2013, 19:52     SerialPort в C++ #6
Используй WinAPI
лезть в QT из-за одной только работы с COM портом не стоит, я считаю.
Обмен данными через СОМ-порт
VladislavTepes
 Аватар для VladislavTepes
78 / 78 / 5
Регистрация: 27.06.2012
Сообщений: 555
Записей в блоге: 1
06.10.2013, 20:01     SerialPort в C++ #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;
      }
}
Blastry
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 38
06.10.2013, 20:36  [ТС]     SerialPort в C++ #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'
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
06.10.2013, 21:05     SerialPort в C++ #9
Цитата Сообщение от Blastry Посмотреть сообщение
main.cpp(39): error C2664: 'CreateFileW' : cannot convert parameter 1 from 'char *' to 'LPCWSTR'
настройки проекта Use Multibyte Character Set

Добавлено через 6 минут
вот так http://www.cyberforum.ru/attachment....1&d=1381079067
DarkMasterW
4 / 4 / 0
Регистрация: 25.10.2013
Сообщений: 227
01.03.2014, 20:16     SerialPort в C++ #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";
Я же правильно понимаю, здесь просто номер порта указывается? С реальной железкой работает, но ее пока лучше не трогать во избежание денежных последствий для моего кошелька...
Спасибо.
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
01.03.2014, 20:46     SerialPort в C++ #11
Не стоило писать L"COM", надо просто "COM"
DarkMasterW
4 / 4 / 0
Регистрация: 25.10.2013
Сообщений: 227
01.03.2014, 23:27     SerialPort в C++ #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" // не пашет

Я чет уже вообще ниче не понимаю.
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
01.03.2014, 23:53     SerialPort в C++ #13
Так определись, блин! Какие строки используются в твоём проекте? Юникод или мультибайт? Соответствующие и используй!

Добавлено через 2 минуты
Зачем вообще использовать LPCTSTR, если есть LPCSTR ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.03.2014, 12:55     SerialPort в C++
Еще ссылки по теме:

Потоки SerialPort C++/CLI WinForms
C++ Qt SerialPort
C# C# + CDC (SerialPort )

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

Или воспользуйтесь поиском по форуму:
DarkMasterW
4 / 4 / 0
Регистрация: 25.10.2013
Сообщений: 227
02.03.2014, 12:55     SerialPort в C++ #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);
Может кому пригодится.
Yandex
Объявления
02.03.2014, 12:55     SerialPort в C++
Ответ Создать тему
Опции темы

Текущее время: 01:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru