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

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

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

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

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

Как в с++ передать код на com порт? К примеру на (* basic по моему) out(%.....), 4
на порт (%.....) выводим (out) число (4) в десятичном, а он воспринимает (100) в двоичном.
Подскажите как в с++ можно это делать, какие функции и билиотеки?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.04.2012, 12:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос СОМ порт - как передать код (C++):

управление через СОМ порт - C++
Как сдельть сигнал на RTS,DTR по нажатию BUTTON1и2 соответственно. Причём при их отпускании сигналы должны обнульться! Кто шарит в этом?!

Как передать 16-ричное число в com-порт? - C++
привет всем! торможу... как передать 16-ричное число в com-порт? нужно передать 0x11 и 0x22 в com-порт, а порт принимает char*. вот...

С++ код с использованием СОМ объектов. - C++
Пообещал другу написать прогу, кликер мыши в броузере(IE) на с++ с COM объектами. Вот код: #include <iostream> #include...

Как передать функции в качестве параметра исполняемый код - C++
Собственно сабж. int main() { z1 = x*x*x+2*x+2; func(z1); } int func()

г-но код или можно ли передать метку (от гоуту) в функцию как параметр? - C++
Собственно вопрос в заголовке, даже не знаю как это мне в голову пришло, но все же интересно xD

Как на с++ прочитать данные из СОМ порта? - C++
Мне нужно под MS-DOS 6.22 прочитать несколько слов через СОМ порт (в пределах 2х десятков и потом эти слова проанализировать). Какое...

8
Kuzia domovenok
2119 / 1949 / 192
Регистрация: 25.03.2012
Сообщений: 6,755
Записей в блоге: 1
01.04.2012, 12:13 #2
WinAPI
CreateFile("COM1",.....)
WriteFile(....)
CloseHandle(.....)

http://ru.wikibooks.org/wiki/COM-%D0...BD%D0%B8%D0%B5)
1
Jefree
3 / 3 / 0
Регистрация: 25.03.2012
Сообщений: 16
01.04.2012, 12:22  [ТС] #3
во спасибо буду разбираться
0
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
0
panicwassano
592 / 560 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
08.04.2012, 15:00 #5
tchar это wchar_t, у тебя же юникод
0
Jefree
3 / 3 / 0
Регистрация: 25.03.2012
Сообщений: 16
08.04.2012, 23:36  [ТС] #6
Цитата Сообщение от panicwassano Посмотреть сообщение
tchar это wchar_t, у тебя же юникод
пожешь пояснить?

Добавлено через 8 часов 19 минут
компилятор ругается на типы перменных, каким типом заменить чтобы все работало?
0
ForEveR
В астрале
Эксперт С++
7988 / 4747 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
09.04.2012, 01:09 #7
boost::asio. В частности boost::asio::serial_port
0
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, я на верном пути?
0
ForEveR
В астрале
Эксперт С++
7988 / 4747 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
15.04.2012, 14:16 #9
Jefree, Вообщем-то да. Буст позволяет общаться с COM-портами. Это не другой метод, это просто большая абстракция. По сути высокоуровневая обертка над системным API (кроссплатформенная).
1
15.04.2012, 14:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.04.2012, 14:16
Привет! Вот еще темы с ответами:

Как создать чат между 2-мя сом-портами? - C++
Народ, всем привет! Есть задачка, создать чат меж двух СОМ-портов. Отправить, принять и вывести на экран сообщения. Пытаюсь найти хоть...

Как программно получить адрес СОМ порта? - C++
Пишу программу для прошивки Flash памяти прибора через СОМ порт. Выяснилось, что при ошибке заливки, прибор выдаёт ошибку и начинает...

Не могу разобраться как передать корректно передать массив из функции в функцию - C++
//--------------------------------------------------------------------------- #pragma hdrstop ...

Передать код под шаблонную функцию - C++
Ребят помоги передать код под одну шаблонную функцию У меня сделано через перезагрузку функции Сам код: #pragma hdrstop #pragma...


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

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

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