Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.83/272: Рейтинг темы: голосов - 272, средняя оценка - 4.83
2 / 2 / 0
Регистрация: 07.12.2010
Сообщений: 21

Программирование Com порта в Microsoft Visual Studio 9.0 C++

07.12.2010, 13:11. Показов 52664. Ответов 84
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Имеется микроконтроллер AVR ATmega128, на борту которого имеется UART. Требуется написать приложение для Win32 принимающее с МК по RS-232 информацию. Интерфейс 3-х проводной. TxD, RxD и GND. Подключение ПК к МК осуществляется через виртуальный COM8 порт, тоесть через преобразователь USB в COM. В МК зашита программа тупого посыла символа "$" в цикле. Все работает прекрасно(данные приходят). Проверял программой Terminal v1.9b

Имеется куча примеров, но не один не работает, нет опыта в программировании на C++. То отсутствует какая то библиотека, то непонятная ошибка. Я понимаю что это просто для знающего, но увы я только знакомлюсь с языком Microsoft Visual Studio 9.0 C++. если на нем этого сделать не возможно, посоветуйте тот на котором это возможно.

Подскажите с чего начать, как инициализировать порт, как подключиться, как получить байт?
Да, кол-во получаемых байтов неизвестно, точнее пока оно бесконечно. Для начала хотелось бы чтобы программа тупо принимала все что передается в порт и выводила на экран.

Добавлено через 20 минут
Кто нибудь... помогите подключить C++ к внешнему устройству!!!!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.12.2010, 13:11
Ответы с готовыми решениями:

Отличие между Microsoft Developer Studio и Microsoft Visual Studio?
Здравствуйте, объясните чем отличается Microsoft Developer Studio и Microsoft Visual Studio ?

Как с сайта Microsoft скачать Microsoft Visual Studio 2005 Express Edition?
На сайте Microsoft вроде бы можно скачать Microsoft Visual Studio 2005 Express Edition, но отдаётся оттуда только файл vcsetup.exe размером...

Вылетает Visual Studio 2008 из-за системы управления версиями Microsoft Visual SourceSafe.
Всем здравствуйте. Недавно установил VS 2008 sp1 rus. Хочу создать проект на VC++ (делаю всё подобно как в VS 6.0). Файл - Создать...

84
125 / 65 / 9
Регистрация: 19.04.2010
Сообщений: 196
10.03.2011, 10:16
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Bedouin Посмотреть сообщение
Главная для меня сложность - это понимание класса (что это такое).
В этом тебе поможет книга по программированию на С++.
"Язык программирования С++" Бьерн Страуструп
Ищи ее в сети и качай.

Добавлено через 1 минуту
Там все рассказано. Когда прочитаешь вопросов будет меньше.

Добавлено через 39 секунд
И про какой класс и файлы ты говоришь?
1
2 / 2 / 0
Регистрация: 07.02.2011
Сообщений: 25
10.03.2011, 11:07
Sudoki!
Спасибо за книжку.
Что касается класса, то я имел ввиду код в посте:
Программирование Com порта в Microsoft Visual Studio 9.0 C++
Я правильно понимаю, что это класс?

Добавлено через 2 минуты
Если это не так, то отсюда половина моих бед.
В этом случае я не понял, как этот код прицепить к имеющемуся проекту
0
125 / 65 / 9
Регистрация: 19.04.2010
Сообщений: 196
10.03.2011, 11:17
Цитата Сообщение от Sudoki Посмотреть сообщение
LRESULT CALLBACK OnComPort(ComPort* p, unsigned int Event, unsigned short arg)
Это обычная функция.
0
2 / 2 / 0
Регистрация: 07.02.2011
Сообщений: 25
10.03.2011, 11:26
И я правильно понимаю, что ее просто надо вставить в CPort.cpp?

Добавлено через 1 минуту
Меня смутили строчки:
C++
1
2
3
4
5
6
/Добавляем в наш проект
#include "WorkCtrl.h"
 
 
//Создаем экземпляр класса
CWorkCtrl workCtrl;
Я это понял так, что необходимо создавать новый класс из файлов WorkCtrl.h и WorkCtrl.срр
0
125 / 65 / 9
Регистрация: 19.04.2010
Сообщений: 196
10.03.2011, 11:35
Цитата Сообщение от Bedouin Посмотреть сообщение
Я это понял так, что необходимо создавать новый класс из файлов WorkCtrl.h и WorkCtrl.срр
Ты же их уже создал.
Выкладывал в посте
Программирование Com порта в Microsoft Visual Studio 9.0 C++

Добавлено через 21 секунду
Их нужно просто подключить к проекту и все
1
2 / 2 / 0
Регистрация: 07.02.2011
Сообщений: 25
10.03.2011, 11:47
Так, теперь все начинает становиться на свои места.
Спасибо!
А теперь, если не против, давай пройдем по пунктам:
1) вставляю функцию LRESULT CALLBACK OnComPort(ComPort* p, unsigned int Event, unsigned short arg) в CPort.cpp.
2) Присоединяю файлы WorkCtrl.h и WorkCtrl.срр.

Остался только вопрос:
строки
C++
1
2
//Создаем экземпляр класса
CWorkCtrl workCtrl;
идут в CPort.cpp?
0
125 / 65 / 9
Регистрация: 19.04.2010
Сообщений: 196
10.03.2011, 12:19
Цитата Сообщение от Bedouin Посмотреть сообщение
идут в CPort.cpp?
Да. А что смущает?

Добавлено через 53 секунды
Цитата Сообщение от Bedouin Посмотреть сообщение
1) вставляю функцию LRESULT CALLBACK OnComPort(ComPort* p, unsigned int Event, unsigned short arg) в CPort.cpp.
Она там была просто замени код внутри нее.
0
2 / 2 / 0
Регистрация: 07.02.2011
Сообщений: 25
10.03.2011, 12:27
Сбила с толку фраза:
C++
1
2
/Создаем экземпляр класса
CWorkCtrl workCtrl;
/
Не сообразил, что с ней делать
0
125 / 65 / 9
Регистрация: 19.04.2010
Сообщений: 196
10.03.2011, 12:45
Цитата Сообщение от Bedouin Посмотреть сообщение
CWorkCtrl workCtrl;
Объявляется переменная workCtrl типа CWorkCtrl
0
2 / 2 / 0
Регистрация: 07.02.2011
Сообщений: 25
10.03.2011, 12:56
И она объявляется в файле CPort.cpp?
0
125 / 65 / 9
Регистрация: 19.04.2010
Сообщений: 196
10.03.2011, 13:26
Тебе нужно сначала прочитать книгу там все написано.

Добавлено через 1 минуту
Эта переменная будет видна только в пределах этого модуля. Если надо чтобы была видна еще гдето то в CPort.h надо добавить
C++
1
extern CWorkCtrl workCtrl;
И делать
C++
1
#include "CPort.h"
в те модули которых будет использоваться эта переменная

Добавлено через 19 секунд
Ты лучше книгу прочти
2
2 / 2 / 0
Регистрация: 07.02.2011
Сообщений: 25
17.03.2011, 23:35
Добрый вечер, Sudoki!
Большое спасибо за книжку. Помогает.
А новичкам, таким как я (если таковые забредут на форум), советую искать в сети книгу Бьерна Страуструпа "Язык программирования С++. Специальное издание" (редакции 2001 или 2010 гг.).
Это к тому, что в сети есть вариант (pdf-файл) Бьерн Страуструп. "Язык программирования С++". Второе дополненное издание объемом 369 стр. Материал там изложен сжато и требует определенной подготовки и начальных знаний.

Добавлено через 17 минут
А теперь, если можно, вопрос, вернее два.
Подчистил я проект, число ошибок уменьшилось.
Но никак не могу из заголовочного файла WorkCtrl.h вычистить ошибку:

c:\downloads\comport\cport.cpp(268) : error C2039: m_dfCurFrame: не является членом "CWorkCtrl"
c:\downloads\comport\workctrl.h(10): см. объявление 'CWorkCtrl' WorkCtrl.cpp



Насколько я понимаю, эти ошибки взаимосвязаны. И ноги растут из файла WorkCtrl.h:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class CWorkCtrl  
 
{
public:
    unsigned char buf_frame[31];
    int index_frame;
    typedef struct DEV_FRAME;
    void convBBufToDFrame(unsigned char buf_frame[31], DEV_FRAME m_dfCurFrame);
    
    
    CWorkCtrl();
    virtual ~CWorkCtrl();
 
private:
    
};
Ранее в посте http://https://www.cyberforum.... page6.html ты уже давал комментарий:
Замени на
workCtrl.convBBufToDFrame(buf_frame, workCtrl.m_dfCurFrame);
А то выдаст ошибку компиляции
Я вроде так и сделал:
C++
1
 workCtrl.convBBufToDFrame(buf_frame, workCtrl.m_dfCurFrame);
Но проблема осталась.

И вторая ошибка:
c:\downloads\comport\workctrl.cpp(13) : error C2182: WorkCtrl: недопустимое использование типа "void"

ссылается на код в WorkCtrl.cpp:
C++
1
void WorkCtrl.convBBufToDFrame(buf_frame, workCtrl.m_dfCurFrame)
.

Однако в исходниках, с которыми я работаю, и в WorkCtrl.h

C++
1
void convBBufToDFrame(unsigned char buf_frame[31], DEV_FRAME m_dfCurFrame);
данная функция объявлена именно как void.
В чем затык и где копать?
0
2 / 2 / 0
Регистрация: 07.02.2011
Сообщений: 25
17.03.2011, 23:38
На всякий случай прикреплю проект.
Вложения
Тип файла: zip ComPort.zip (3.86 Мб, 153 просмотров)
0
125 / 65 / 9
Регистрация: 19.04.2010
Сообщений: 196
18.03.2011, 10:03
Вопрос такой зачем ты в классе сделал typedef struct DEV_FRAME;?

Добавлено через 29 секунд
DEV_FRAME а где ее описание? Кто его делать будет?

Добавлено через 1 минуту
C++
1
void convBBufToDFrame(unsigned char buf_frame[31], DEV_FRAME m_dfCurFrame);
Зачем писать так я не понимаю

Добавлено через 42 секунды
Где реализации методов класса?

C++
1
2
CWorkCtrl();
    virtual ~CWorkCtrl();
Добавлено через 9 минут
C++
1
2
3
4
5
typedef struct _DEV_FRAME
{
    unsigned short RegN[6], Tail[6];
    unsigned char RegWind[4];
}DEV_FRAME;
Вот так надо делать

Добавлено через 20 минут
Вот так выглядит твой класс файл WorkCtrl.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#pragma once
 
typedef struct _DEV_FRAME
{
    unsigned short RegN[6], Tail[6];
    unsigned char RegWind[4];
}DEV_FRAME;
 
class CWorkCtrl  
 
{
public:
    void convBBufToDFrame(unsigned char *buf_frame);
    
    CWorkCtrl();
    virtual ~CWorkCtrl();
protected:
    DEV_FRAME m_dfCurFrame, m_dfPrevFrame;
};
Добавлено через 2 минуты
WorkCtrl.cpp

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
#include "stdafx.h"
#include "WorkCtrl.h"
 
WorkCtrl::CWorkCtrl()
{
::ZeroMemory(m_dfCurFrame, sizeof(m_dfCurFrame));
::ZeroMemory(m_dfPrevFrame, sizeof(m_dfPrevFrame));
 
}
 
WorkCtrl::~CWorkCtrl()
{
}
 
void WorkCtrl::convBBufToDFrame(unsigned char *buf_frame)
{
    USHORT t;
    
    m_dfPrevFrame = m_dfCurFrame;
    
    ::ZeroMemory(m_dfCurFrame, sizeof(m_dfCurFrame));
    
    t = buf_frame[0];
    t=buf_frame[1];
    t=buf_frame[2];
    m_dfCurFrame.RegN[0] = ((USHORT)buf_frame[3]) | (((USHORT)buf_frame[4]) << 8) ;
    m_dfCurFrame.Tail[0] = ((USHORT)buf_frame[5]) | (((USHORT)buf_frame[6]) << 8) ;
    m_dfCurFrame.RegN[1] = ((USHORT)buf_frame[7]) | (((USHORT)buf_frame[8]) << 8) ;
    m_dfCurFrame.Tail[1] = ((USHORT)buf_frame[9]) | (((USHORT)buf_frame[10]) << 8) ;
    m_dfCurFrame.RegN[2] = ((USHORT)buf_frame[11]) | (((USHORT)buf_frame[12]) << 8) ;
    m_dfCurFrame.Tail[2] = ((USHORT)buf_frame[13]) | (((USHORT)buf_frame[14]) << 8) ;
    m_dfCurFrame.RegN[3] = ((USHORT)buf_frame[15]) | (((USHORT)buf_frame[16]) << 8) ;
    m_dfCurFrame.Tail[3] = ((USHORT)buf_frame[17]) | (((USHORT)buf_frame[18]) << 8) ;
    m_dfCurFrame.RegN[4] = ((USHORT)buf_frame[19]) | (((USHORT)buf_frame[20]) << 8) ;
    m_dfCurFrame.Tail[4] = ((USHORT)buf_frame[21]) | (((USHORT)buf_frame[22]) << 8) ;
    m_dfCurFrame.RegN[5] = ((USHORT)buf_frame[23]) | (((USHORT)buf_frame[24]) << 8) ;
    m_dfCurFrame.Tail[5] = ((USHORT)buf_frame[25]) | (((USHORT)buf_frame[26]) << 8) ;
    m_dfCurFrame.RegWind[0] = buf_frame[27];
    m_dfCurFrame.RegWind[1] = buf_frame[28];
    m_dfCurFrame.RegWind[2] = buf_frame[29];
    m_dfCurFrame.RegWind[3] = buf_frame[30];
}
Добавлено через 46 секунд
Сравни со своими файлами и найди ошибки. И почитай про классы.

Добавлено через 2 минуты
Мда и еще в этой функции
C++
1
LRESULT CALLBACK OnComPort(ComPort* p, unsigned int Event, unsigned short arg)
Будет следующий вызов convBBufToDFrame

вот это
C++
1
workCtrl.convBBufToDFrame(buf_frame, workCtrl.m_dfCurFrame);
замени на
C++
1
workCtrl.convBBufToDFrame(buf_frame);
1
2 / 2 / 0
Регистрация: 07.12.2010
Сообщений: 21
13.04.2011, 14:26  [ТС]
Sudoki.. Ну лень человеку читать книжки. Задал вопрос, получил ответ. проще же. Если после такой дискуссии задает такие вопросы. Я понимаю что сложно понять с первого раза все это. Сам на этом этапе. Но не каждый же вопрос задавать. Есть интернет, разные форумы, книжки тебе надавали. Поищи там ответы на свои вопросы, а если уж реально не можешь понять в чем дело или как оно там все.. то спрашивай поможем... Извините меня но прочитал от начала до конца еще раз и даже смешно немного. Вот что значит "использование интернета не по назначению".
0
125 / 65 / 9
Регистрация: 19.04.2010
Сообщений: 196
13.04.2011, 18:21
ОТписался от темы случайно
0
Eklektik
15.04.2013, 23:06
Доброго времени суток друзья, оживляю ветку после длительного стазиса.
Очень много почерпнул из ваших разговоров, за что уже огромное спасибо, сориентируете(если здесь окажется хоть кто нибудь живой) меня по моей задаче, она не далеко ушла, я не могу разобраться в каком направлении и чем копать: мне нужно посылать на мк команды для установки высокого и низкого уровня на определённых ногах микросхемы, в качестве которой выступает ATMega 128A.
Принцип следующий: есть интерфейс написанный на плюсах - 50 кнопочек вкл\вкл (по сути 100 кнопочек). по нажатию, допустим на 20 кнопку вкл. должно пойти питание с 20й(в свободном диапазоне) ноги. Уточняю что 20я нога - условно, т.е. на мк это скорее окажется 24 или 25, за вычетом RX, TX, VDC, GND и им подобных. в распоряжении у меня чуть больше 50 ног. мне нужно ровно 50.
Так вот.... кашица какая то получилась, но полезная.
а теперь эту кашицу надо чем то запить: попробую как в задачках в школе...
Дано: мк с 50 свободными ногами, интерйфейс на С++ с 50*2 кнопками.
Необходимо: передавать состояние на открытие той или иной ноги, посредством нажатия кнопки в окошке с этой С++ программой.
Решение: тут немного отсебятины - видел и читал на сайте AVR.ru первые уроки, после третьего начал решительно ничего не понимать, зато первые три принесли пользу, а именно: примерно понял как заставить микруху открывать одну ногу если на другую подаётся сигнал, точнее там пример был с подключением к одной ноге мк кнопки а к другой - светодиода, и по нажатию кнопки мк зажигала светодиод. вот мен эту кнопку теперь надо в виде программы реализовать и ещё одна ВАЖНАЯ особенность: мне нужно чтобы свободных на выход ног было не меньше 50, а на мк всего 56, из них под расход сразу уходят штуки три точно, так вот: на какой вход нужно передавать данные, грубо говоря, с номером ноги и состоянием, чтобы на вход была как бы одна нога, а на выход работали 50.

Прошу прощения если сильно намесил, хотел изложить всё сразу чтобы меньше вопросов возникло.
bariskin
08.05.2013, 08:56
Доброе время суток! Интересная ветка, есть похожая задача. Есть просьба скинуть книжку о которой вы здесь говорили.
Мой ящик: chiurcciu@mail.ru
Благодарю за понимание )
0 / 0 / 0
Регистрация: 19.06.2013
Сообщений: 11
04.07.2013, 15:02
Всем здравствуйте! Мой вопрос тесно пересекается с заданной темой, к сожалению, более подходящей темы я не нашел, поэтому пишу сюда и прошу модератора перенаправить мой пост в нужную тему, если таковая имеется. Суть такая: нужно научиться писать данные в Com-порт и считывать из него. Я пользуюсь средой Visual C++ 2008 Express edition. Вот с чем пытаюсь разобраться. Есть окошко NumericUpDown, в которое можно вводить/выводить данные в виде строчек string. Есть компонент serialPort1, предоставляющий ресурс и набор методов последовательного порта. Путем копания нашел, что для компонента serialPort есть перегруженный метод Write, которому, как вариант, можно подсунуть строку string. Поэкспериментировал - работает, но терзают меня смутные сомнения: есть этот же перегруженный метод, но в нем в качестве аргументов Write надо ручками прописать массив передаваемых байтов типа Byte, начальный символ массива типа int32, количество байт типа int32. Может быть, кто-нибудь из знатоков на форуме может рассказать, чем лучше пользоваться? А то боюсь попалить чужое (и недешевое к тому же) лабораторное оборудование. С Уважением.
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
04.07.2013, 15:14
Раз уж ты пишешь в порт строку - видимо, обмен с "недешевым оборудованием" идет простыми текстовыми командами. Используй два порта, нуль-модемный кабель и обычный терминал для отладки обмена. В принципе, можно использовать и два компа, соединенных нуль-модемным кабелем, - на одном твоя прога (отлаживаемая), на другом - терминал, на котором просматриваешь команды и печатаешь "ответы" оборудования. Продумай набор тестов - а лучше всего, согласуй эти тесты с руководством/заказчиком.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.07.2013, 15:14

Microsoft Visual Studio
Даны целые числа a1,...,a20. Наименьший член этой последовательности заменить целой частью среднего арифметического всех членов, остальные...

microsoft visual studio 2005
есть ли в природе документация по microsoft visual studio 2005 на русском языке?

Microsoft Visual Studio 2010
У меня проблеми со студиею... сначала она проект не компилировала а фатал ерор видавала а теперь на С# форматированее самой студии не...

Microsoft visual studio 2010
Скачал прогу после переустановки windows(прошло уже месяца два), открыл, выбрал создать проект, выбрал язык C++, дальше win 32. написал...

Чем отличается Microsoft Visual C++ 2010 Express от Visual Studio 2010 Ultimate
Подскажите пожалуйста, в чем разница Microsoft Visual C++ 2010 Express от Visual Studio 2010 Ultimate. Всем ответившим большое спасибо)))


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru