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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.83
Blastry
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 38
#1

SerialPort в C++ - C++

06.10.2013, 08:47. Просмотров 2946. Ответов 13
Метки нет (Все метки)

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

Serialport.write и serialport.basestream.write - в чем разница - C#
в чем разница между следующими способами отправки данных на ком-порт?: serPort.BaseStream.Write(data,0,datalen); ...

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

Serialport - Perl
Есть программа но на этапе компиляции выдает ошибку. для компиляции использую ActiveState Perl Dev Kit 9.1.1 #!/usr/bin/perl #...

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

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

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

13
Fyret
184 / 170 / 13
Регистрация: 30.07.2013
Сообщений: 359
06.10.2013, 09:14 #2
В бусте есть.
1
kamre
126 / 130 / 4
Регистрация: 25.12.2011
Сообщений: 443
06.10.2013, 09:19 #3
Цитата Сообщение от Blastry Посмотреть сообщение
как создать порт на C++, нигде не могу найти
В стандарте C++ ничего про порты нет, поэтому нужно использовать библиотеки. Например, Qt, в которой есть QSerialPort.
1
Blastry
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 38
06.10.2013, 17:40  [ТС] #4
скачал SDk Qt, установил, как ее в VS2010 подключить? Добавляю файлы исходного кода, заголовочные, пишет не может найти Qt библиотеку.
0
VladislavTepes
78 / 78 / 5
Регистрация: 27.06.2012
Сообщений: 555
Записей в блоге: 1
06.10.2013, 19:47 #5
Blastry, по-моему, Qt для ваших целей избыточен, ИМХО. Если мне память не изменяет, в Win работа с портом представляется как работа с файлом, и WinAPI такую возможность предоставляет. Где-то я видел пример.
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 1
06.10.2013, 19:52 #6
Используй WinAPI
лезть в QT из-за одной только работы с COM портом не стоит, я считаю.
Обмен данными через СОМ-порт
1
VladislavTepes
78 / 78 / 5
Регистрация: 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
Blastry
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 38
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
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 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 минут
вот так http://www.cyberforum.ru/attachment....1&d=1381079067
1
DarkMasterW
4 / 4 / 0
Регистрация: 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
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 1
01.03.2014, 20:46 #11
Не стоило писать L"COM", надо просто "COM"
0
DarkMasterW
4 / 4 / 0
Регистрация: 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
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 1
01.03.2014, 23:53 #13
Так определись, блин! Какие строки используются в твоём проекте? Юникод или мультибайт? Соответствующие и используй!

Добавлено через 2 минуты
Зачем вообще использовать LPCTSTR, если есть LPCSTR ?
0
DarkMasterW
4 / 4 / 0
Регистрация: 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);
Может кому пригодится.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.03.2014, 12:55
Привет! Вот еще темы с ответами:

Serialport в классе c# - C (СИ)
Помогите пожалуйста, проблемма с использованием serialport в нескольких формах.как можно поместить порт в класс и обращаться к нему из...

SerialPort в mfc - Visual C++
Здравствуйте. Снова вопрос по mfc. Нужно работать с COM портами. В с#/c++ работал используя SerialPort: ...

Serialport - Readline - C#
Добрый день. Возникла глупая проблема, но не могу решить, не владею c# в нужной мере. Нужно прочитать строки с COM порта. код: ...

Потоки SerialPort - C++/CLI WinForms
Накидал на форму элементов, всё работает кроме функции, срабатывающей при получении данных с порта т.е. System::Void...


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

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

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