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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.63
Jefree
3 / 3 / 0
Регистрация: 25.03.2012
Сообщений: 16
#1

СОМ порт - как передать код - C++

01.04.2012, 12:09. Просмотров 1070. Ответов 8
Метки нет (Все метки)

Как в с++ передать код на com порт? К примеру на (* basic по моему) out(%.....), 4
на порт (%.....) выводим (out) число (4) в десятичном, а он воспринимает (100) в двоичном.
Подскажите как в с++ можно это делать, какие функции и билиотеки?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.04.2012, 12:09     СОМ порт - как передать код
Посмотрите здесь:
C++ управление через СОМ порт
Как передать 16-ричное число в com-порт? C++
С++ код с использованием СОМ объектов. C++
C++ Как передать функции в качестве параметра исполняемый код
г-но код или можно ли передать метку (от гоуту) в функцию как параметр? C++
Как на с++ прочитать данные из СОМ порта? C++
Как программно получить адрес СОМ порта? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
01.04.2012, 12:13     СОМ порт - как передать код #2
WinAPI
CreateFile("COM1",.....)
WriteFile(....)
CloseHandle(.....)

http://ru.wikibooks.org/wiki/COM-%D0...BD%D0%B8%D0%B5)
Jefree
3 / 3 / 0
Регистрация: 25.03.2012
Сообщений: 16
01.04.2012, 12:22  [ТС]     СОМ порт - как передать код #3
во спасибо буду разбираться
Jefree
3 / 3 / 0
Регистрация: 25.03.2012
Сообщений: 16
08.04.2012, 12:52  [ТС]     СОМ порт - как передать код #4
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
#include <iostream>
#include <string>
#include <conio.h>
#include <time.h>
#include <windows.h>
using namespace std;
 
 
 
struct package
{
      char header;
      string body;
      char summ;
};
 
 
int open_port(TCHAR * Name);                           // создание потока hCom, начальной конфигурации и установки таймаутов
void check_port(TCHAR * Name);                         // функция определения типа порта
int write_pack_data(package Pack);                    // функция записи пакета байтов
                                 
int calc_check_summ(const TCHAR * Body);  // функция подсчета контрольной суммы
void wait(float Seconds);                             // функция задержки
void close_port();                                    // закрытие используемых потоков
 
 
HANDLE hCom = INVALID_HANDLE_VALUE;   // поток для работы с портом
COMMTIMEOUTS cto;                     // структура для установки таймаутов
DCB dcb;                              // структура для конфигурации
 
DWORD dwBytesWritten_h,               // записано байт заголовка
      dwBytesWritten_b,               // записано байт основного сообщения
      dwBytesWritten_s,               // записано байт суммы
      dwBuffer;                       // количество байтов записанных в поток hCom
 
 
// ========================================= Точка входа в программу =========================================
int main()
{
      cout << "<= SERIAL PORT - WORKING WITH PACKAGES =>\n\n";
      
      TCHAR sPortName[] = "COM1";
      // сперва открываем порт
      if (!open_port(sPortName))
            return 0;
 
      // проверяем какой он
      check_port(sPortName);
 
      string input = "";
      // получаем сообщение для передачи
      cout << "Enter string to send: ";
      getline(cin, input);
      while (input != "quit")
      {
            // создаем и конфигурируем пакет для передачи
            package data;
            data.header = 'h';
            data.body = input;
            data.summ = calc_check_summ(data.body.c_str());
            cout << "\ndata.header\t=\t\'" << data.header << 
                    "\'\ndata.body\t=\t\"" << data.body << 
                    "\"\ndata.CS\t\t=\t" << (int)data.summ << endl;
 
            // передаем данные
            int i_wd, i_rd;
            i_wd = write_pack_data(data);
            
 
            // снова получаем сообщение для передачи
            cout << "Enter string to send: ";
            cin >> input;
      }     
 
      // в конце работы закрываем порт
      close_port();
 
      
      return 0;
}
 
 
// ========================================= Дополнительные функции =========================================
 
// функция записи пакета байтов
int write_pack_data(package Pack)
{
      size_t size_head = sizeof(Pack.header);
      size_t size_str = strlen(Pack.body.c_str());
      size_t size_CS = sizeof(Pack.summ);
 
      string head; head[0] = Pack.header;
      string summ; summ[0] = Pack.summ;
 
      int res = 0;
      if ( (size_str > 0) && (hCom != INVALID_HANDLE_VALUE) )
      {            
            res = WriteFile(hCom, head.c_str(), size_head, &dwBytesWritten_h, 0);
            res = WriteFile(hCom, Pack.body.c_str(), size_str, &dwBytesWritten_b, 0);
            res = WriteFile(hCom, summ.c_str(), size_CS, &dwBytesWritten_s, 0);
 
            cout << "\nWritten " << dwBytesWritten_h << " bytes of header\n\t" <<
                                    dwBytesWritten_b << " bytes of body\n\t" <<
                                    dwBytesWritten_s << " bytes of check summ\n";
      }
      return res;
}                                                             
 
 
 
// функция подсчета контрольной суммы
int calc_check_summ(const char * Body)
{
      int final = 0;
      for (int i = 1, j = 0, c = 0; j < strlen(Body); c++)
      {
            if ( (Body[j] & i) == i)
                  final++;
            i <<= 1;
            if (c == 8)
            {
                  c = -1; j++; i = 1;
            }
      }
      return final;
}
 
// функция создания потока hCom, начального конфигурирования и установки таймаутов
int open_port(TCHAR * Name)
{
      hCom = CreateFile(Name, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
 
      if (hCom == INVALID_HANDLE_VALUE)
      {
            cout << " *** Error opening port!\n";
            getch();
            return 0;
      }
      else
      {
            cout << " *** Port succesfully opened!\n";
            
            // конфигурируем порт
            GetCommState(hCom, &dcb);
 
            dcb.BaudRate = CBR_9600;
            dcb.ByteSize = 8;
            dcb.Parity = NOPARITY;
            dcb.StopBits = ONESTOPBIT;
 
            if (SetCommState(hCom, &dcb))
                  cout << " *** Configuring OK.\n";
            else
                  cout << " *** Configuring error.\n";
 
            // устанавливаем таймауты 
            cto.ReadIntervalTimeout = MAXDWORD;
            cto.ReadTotalTimeoutMultiplier = MAXDWORD;
            cto.ReadTotalTimeoutConstant = 5000;
 
            if (SetCommTimeouts(hCom, &cto))
                  cout << " *** Timeouts succesfully set!\n\n";
            else
                  cout << " *** Error with setting timeouts!\n\n";
            
            return 1;
      }
}
 
 
// функция задержки
void wait(float Seconds)
{
    clock_t delay = Seconds * CLOCKS_PER_SEC;
    clock_t start = clock();
    while (clock() - start < delay)
        ;
}
// функция закрытия используемых потоков
void close_port()
{
      if (hCom == INVALID_HANDLE_VALUE)
            return;
 
      CloseHandle(hCom);
      cout << "\n *** Port succesfully closed!\n";
      hCom = INVALID_HANDLE_VALUE;
}
Вот вроде правдоподобный код, убрал прием данных, т.к. мне надо только отсылать данные через порт на примере диодов. Но компилировать не хочет помогите разобраться, может что убрать или добавить
error C2664: 'calc_check_summ' : cannot convert parameter 1 from 'const char *' to 'const TCHAR *'
IntelliSense: a value of type "const char [5]" cannot be used to initialize an entity of type "TCHAR []" warning C4018: '<' : signed/unsigned mismatch
warning C4244: 'initializing' : conversion from 'float' to 'clock_t', possible loss of data
panicwassano
591 / 559 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
08.04.2012, 15:00     СОМ порт - как передать код #5
tchar это wchar_t, у тебя же юникод
Jefree
3 / 3 / 0
Регистрация: 25.03.2012
Сообщений: 16
08.04.2012, 23:36  [ТС]     СОМ порт - как передать код #6
Цитата Сообщение от panicwassano Посмотреть сообщение
tchar это wchar_t, у тебя же юникод
пожешь пояснить?

Добавлено через 8 часов 19 минут
компилятор ругается на типы перменных, каким типом заменить чтобы все работало?
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
09.04.2012, 01:09     СОМ порт - как передать код #7
boost::asio. В частности boost::asio::serial_port
Jefree
3 / 3 / 0
Регистрация: 25.03.2012
Сообщений: 16
15.04.2012, 13:56  [ТС]     СОМ порт - как передать код #8
Цитата Сообщение от ForEveR Посмотреть сообщение
boost::asio. В частности boost::asio::serial_port
Это, я так понимаю, уже совсем другой метод? есть ли какая актуальная лиетратура про порты? а то поиском толком не нашел вплодь до стронних библиотек, буду очень признателен
http://robot-develop.org/archives/450 вот тут нашел про boost::asio, я на верном пути?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.04.2012, 14:16     СОМ порт - как передать код
Еще ссылки по теме:
C++ Как создать чат между 2-мя сом-портами?
C++ Передать код под шаблонную функцию
Передать функции System код цвета переменной C++
Какие параметры нужно передать в функцию opengl при ее вызове, что бы код заработал? C++
Как корректно завершить COM порт? C++

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

Или воспользуйтесь поиском по форуму:
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
15.04.2012, 14:16     СОМ порт - как передать код #9
Jefree, Вообщем-то да. Буст позволяет общаться с COM-портами. Это не другой метод, это просто большая абстракция. По сути высокоуровневая обертка над системным API (кроссплатформенная).
Yandex
Объявления
15.04.2012, 14:16     СОМ порт - как передать код
Ответ Создать тему
Опции темы

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