Форум программистов, компьютерный форум, киберфорум
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. Показов 52183. Ответов 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
07.12.2010, 13:58
Студворк — интернет-сервис помощи студентам
Ок я класс набрасаю
0
2 / 2 / 0
Регистрация: 07.12.2010
Сообщений: 21
07.12.2010, 13:59  [ТС]
Sudoki спасибо что не отказываешь в помощи. До завтра! Хорошего вечера!
0
PB
Просто прогер
1292 / 1079 / 13
Регистрация: 13.03.2009
Сообщений: 2,502
07.12.2010, 14:50
Какова скорость (в бодах) передачи информации в COM порт?

Не по теме:

Цитата Сообщение от Aspiring Посмотреть сообщение
нет опыта в программировании на C++
А почему тогда был выбран именно C++? Это что обязательное условие, скажем, для курсовой?
Ведь существуют языки по проще, которые с успехом справятся с этой задачей.

0
2 / 2 / 0
Регистрация: 07.12.2010
Сообщений: 21
08.12.2010, 05:02  [ТС]
сейчас это не особо важный параметр. Если не ошибаюсь, то его можно просто поменять на двух устройствах, на компе и на контроллере, и теоретически все должно заработать.
Сейчас выбрана скорость 9600 бод. при ознакомлении с литературой нашел информацию что эта скорость дает наименьший процент ошибок, если не ошибаюсь 2%. поэтому мне как новичку для начало сойдет и это. чтобы обойтись по первой без проверок ЦРЦ и прочей целостности данных. Сейчас задача добиться приема и передачи данных. Информации для обмена не много, так что эта скорость будет наиболее приемлемой.
0
125 / 65 / 9
Регистрация: 19.04.2010
Сообщений: 196
08.12.2010, 09:06
Привет.
Ну так что будем действовать по нашему плану?
Схема следующая:
1. Открываем порт
2. Настраиваем его
3. Заводим поток для приема информации
4. Далее отправляем и принимаем информацию
5. Убиваем поток
6. Закрываем порт
0
125 / 65 / 9
Регистрация: 19.04.2010
Сообщений: 196
08.12.2010, 09:12
Собственно говоря вот класс который пока реализует следующий функционал:
1. Открывает порт
2. Закрывает порт
Вложения
Тип файла: zip CPort.zip (950 байт, 453 просмотров)
0
2 / 2 / 0
Регистрация: 07.12.2010
Сообщений: 21
08.12.2010, 10:09  [ТС]
Доверяю тебе в реализации правильности алгоритма. Так как сам этого не могу сделать. Тебе решать. Сейчас воткну твой класс. вопросы задам.
0
125 / 65 / 9
Регистрация: 19.04.2010
Сообщений: 196
08.12.2010, 11:00
Вот ресурс в нем все прекрасно описано
http://britter.ru/index.php?do... fset=14900
0
2 / 2 / 0
Регистрация: 07.02.2011
Сообщений: 25
07.02.2011, 23:21
Доброго времени суток Aspiring и Sudoku!
Очень заинтересовал ваш диалог. Сам столкнулся с подобной проблемой. Надо обеспечить прием данных через СОМ-порт.
Попытался воссоздать программу, однако при компиляции получаю ошибку:
------ Построение начато: проект: ComPort, Конфигурация: Debug Win32 ------
Компиляция...
Code.cpp
c:\downloads\comport\comport\code.cpp(5) : fatal error C1083: Не удается открыть файл include: stdafx.h: No such file or directory
Журнал построения был сохранен в "file://c:\Downloads\ComPort\ComPort\Debug\Build Log.htm"
ComPort - ошибок 1, предупреждений 0
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
Где я ошибся?
И еще.
Ссылка http://britter.ru/index.php?do... fset=14900, к сожалению, уже битая.
Где еще можно почерпнуть о работе с СОМ-портом?
0
125 / 65 / 9
Регистрация: 19.04.2010
Сообщений: 196
08.02.2011, 21:39
Я выложу что у нас получилось.
0
125 / 65 / 9
Регистрация: 19.04.2010
Сообщений: 196
09.02.2011, 09:52
Как и обещал выкладываю что у нас получилось.
Вложения
Тип файла: zip ComPort.zip (22.7 Кб, 768 просмотров)
0
2 / 2 / 0
Регистрация: 07.02.2011
Сообщений: 25
09.02.2011, 09:57
Спасибо большое, Sudoki!
Попробую вечером прогнать твою программу (работаю в основном по вечерам).
Если возникнут вопросы, то можно их будет задать?
0
125 / 65 / 9
Регистрация: 19.04.2010
Сообщений: 196
09.02.2011, 10:22
Для этого и есть форум чтобы задавать вопросы
0
2 / 2 / 0
Регистрация: 07.02.2011
Сообщений: 25
09.02.2011, 22:46
Большое спасибо, Sudoki!
Программа без проблем откомпилировалась и запустилась.
Буду теперь разбираться, как увязать ее с внешним устройством (к сожалению, от предыдущего разработчика не осталось никаких описаний о формате передаваемых данных).
0
125 / 65 / 9
Регистрация: 19.04.2010
Сообщений: 196
10.02.2011, 09:57
Не забывай про настройки порта:
1. Имя порта
2. Скорость обмена
3. Кол-во стоп бит
4. Бит данных
5. Проверка четности
7. Тайм ауты приема/передачи данных

Добавлено через 31 минуту
Не туда нажал и отписался от темы
0
2 / 2 / 0
Регистрация: 07.02.2011
Сообщений: 25
16.02.2011, 22:01
Добрый день, Sudoku!
Это снова я! Разреши еще потревожить.
Подскажи, пожалуйста, вот какую вещь.
У меня данные передаются в ПК от СОМ-порта пакетами постоянной длинны. Формат пакета передаваемых в ПК данных и адреса данных в аппаратуре приведены ниже.
№ Данные, Адрес в аппаратуре Порт MCPU Примечания,
байта код операции с данными
1 0xE6 Синхроплследовательность
2 0xE6
3 0x1C 28 десятичных. Длинна пакета данных
4 N0, мл. байт 0 Порт C
5 N0, ст. байт 0 Порт А Обнулить разряды 7-1.
6 T0, мл. байт 1 Порт C
7 T0, ст. байт 1 Порт А Обнулить разряды 7,6
8 N1, мл. байт 2 Порт C
9 N1, ст. байт 2 Порт А Обнулить разряды 7-1.
10 T1, мл. байт 3 Порт C
11 T1, ст. байт 3 Порт А Обнулить разряды 7,6
12 N2 мл. байт 4 Порт C
13 N2 ст. байт 4 Порт А Обнулить разряды 7-1.
14 T2 мл. байт 5 Порт C
15 T2 ст. байт 5 Порт А Обнулить разряды 7,6
16 N3 мл. байт 6 Порт C
17 N3 ст. байт 6 Порт А Обнулить разряды 7-1.
18 T3 мл. байт 7 Порт C
19 T3 ст. байт 7 Порт А Обнулить разряды 7,6
20 N4 мл. байт 8 Порт C
21 N4 ст. байт 8 Порт А Обнулить разряды 7-1.
22 T4 мл. байт 9 Порт C
23 T4 ст. байт 9 Порт А Обнулить разряды 7,6
24 N5 мл. байт A Порт C
25 N5 ст. байт A Порт А Обнулить разряды 7-1.
26 T5 мл. байт B Порт C
27 T5 ст. байт B Порт А Обнулить разряды 7,6
28 W0 C Порт C
29 W1 D Порт C
30 W2 E Порт C
31 W3 F Порт C

Сейчас у меня идет все до кучи. Т.е. данные я принимаю и сохраняю.
Однако при открытии получается каша.
В старой программе выборка необходимых байт была реализована следующим образом:

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
void CWorkCtrl::convBBufToDFrame(BYTE *buf, DEV_FRAME &df)
{
//  USHORT temp;
    USHORT t;
    t = buf[0];
    t=buf[1];
    t=buf[2];
    df.RegN[0] = ((USHORT)buf[3]) | (((USHORT)buf[4]) << 8) ;
    df.Tail[0] = ((USHORT)buf[5]) | (((USHORT)buf[6]) << 8) ;
    df.RegN[1] = ((USHORT)buf[7]) | (((USHORT)buf[8]) << 8) ;
    df.Tail[1] = ((USHORT)buf[9]) | (((USHORT)buf[10]) << 8) ;
    df.RegN[2] = ((USHORT)buf[11]) | (((USHORT)buf[12]) << 8) ;
    df.Tail[2] = ((USHORT)buf[13]) | (((USHORT)buf[14]) << 8) ;
    df.RegN[3] = ((USHORT)buf[15]) | (((USHORT)buf[16]) << 8) ;
    df.Tail[3] = ((USHORT)buf[17]) | (((USHORT)buf[18]) << 8) ;
    df.RegN[4] = ((USHORT)buf[19]) | (((USHORT)buf[20]) << 8) ;
    df.Tail[4] = ((USHORT)buf[21]) | (((USHORT)buf[22]) << 8) ;
    df.RegN[5] = ((USHORT)buf[23]) | (((USHORT)buf[24]) << 8) ;
    df.Tail[5] = ((USHORT)buf[25]) | (((USHORT)buf[26]) << 8) ;
    df.RegWind[0] = buf[27];
    df.RegWind[1] = buf[28];
    df.RegWind[2] = buf[29];
    df.RegWind[3] = buf[30];
}
И вот здесь я прошу подсказать.
Я правильно понимаю, что в какой-то момент времени в буфере находится целый кадр.
Я из него могу выбрать интересующие меня байты buf[], присвоить их новой переменной df.RegWind[] и далее работать уже с ней?
Как лучше сделать, чтобы нужный мне кадр (с которым я работаю в настоящий момент времени) "не затерся" последующим?
Заранее спасибо
0
2 / 2 / 0
Регистрация: 07.02.2011
Сообщений: 25
16.02.2011, 22:09
Исказилась таблица с форматом данных,поэтому решил приложить ее в виде doc-файла.
Вложения
Тип файла: doc Адресa данных.doc (54.5 Кб, 111 просмотров)
0
125 / 65 / 9
Регистрация: 19.04.2010
Сообщений: 196
16.02.2011, 22:43
Добрый вечер!

Добавить пару переменных да и функцию обработки.
Заранее говорю что не компилировал писал в блокноте.

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
DEV_FRAME frame;
unsigned char buf_frame[31]; //буфер для фрейма
int index_frame = 0; //сколько в буфере лежит
 
void convBBufToDFrame(const unsigned char *buf, DEV_FRAME &df)
{
//  USHORT temp;
USHORT t;
t = buf[0];
t=buf[1];
t=buf[2];
df.RegN[0] = ((USHORT)buf[3]) | (((USHORT)buf[4]) << 8) ;
df.Tail[0] = ((USHORT)buf[5]) | (((USHORT)buf[6]) << 8) ;
df.RegN[1] = ((USHORT)buf[7]) | (((USHORT)buf[8]) << 8) ;
df.Tail[1] = ((USHORT)buf[9]) | (((USHORT)buf[10]) << 8) ;
df.RegN[2] = ((USHORT)buf[11]) | (((USHORT)buf[12]) << 8) ;
df.Tail[2] = ((USHORT)buf[13]) | (((USHORT)buf[14]) << 8) ;
df.RegN[3] = ((USHORT)buf[15]) | (((USHORT)buf[16]) << 8) ;
df.Tail[3] = ((USHORT)buf[17]) | (((USHORT)buf[18]) << 8) ;
df.RegN[4] = ((USHORT)buf[19]) | (((USHORT)buf[20]) << 8) ;
df.Tail[4] = ((USHORT)buf[21]) | (((USHORT)buf[22]) << 8) ;
df.RegN[5] = ((USHORT)buf[23]) | (((USHORT)buf[24]) << 8) ;
df.Tail[5] = ((USHORT)buf[25]) | (((USHORT)buf[26]) << 8) ;
df.RegWind[0] = buf[27];
df.RegWind[1] = buf[28];
df.RegWind[2] = buf[29];
df.RegWind[3] = buf[30];
}
 
 
LRESULT CALLBACK OnComPort(ComPort* p, unsigned int Event, unsigned short arg)
{
    switch(Event)
    {
    case CP_RXCHAR: //это событие что есть байты во входном буфере читаем
        //кол-во байт занесено в arg
        BufferCount = p->ReadByts(Buffer, arg);
        for( int i = 0; i< BufferCount; i++){
            if( Buffer[i] == 0xE6 && (index_frame == 0 || index_frame == 1) )
                buf_frame[index_frame++] = Buffer[i];
            }else {
                if( index_frame == 0 || index_frame == 1 ){
                    index_frame = 0; continue;
                }
                buf_frame[index_frame++] = Buffer[i];
                if( index_frame >= 31 ){
                    convBBufToDFrame(buf_frame, frame);
                    index_frame = 0;
                    //можно сохранить или еще чего сделать
                    //.....
                    ///
                }
            }
        }
        break;
    }
    return 0;
}
Добавлено через 7 минут
Это алгоритм на вскидку его еще надо обдумывать. Вдруг пакет будет не длиной 31 байт а потеряется где то пару байт. И тогда мы можем потерять следующий за ним. Я пару лет назад делал подобное. Алгоритм на другом винте лежит.
0
2 / 2 / 0
Регистрация: 07.02.2011
Сообщений: 25
17.02.2011, 10:56
Спасибо, Sudoki, за подсказку!
Вечером поколдую!
0
2 / 2 / 0
Регистрация: 07.02.2011
Сообщений: 25
26.02.2011, 23:54
Добрый вечер, Sudoki!
Появилась свободная минутка, решил поглубже зарыться в код представленной тобой программы.
Можешь провести небольшой ликбез.
Вот несколько вопросов:
1) Почему ты сделал два раздельных файла CPort и ComPort (честно говоря,я сначала предполагал, что один из них будет классом, а второй файлом с кодом)?
2) Форма программы (кнопки, меню и проч.) реализована в тексте CPort.cpp, хотя отдельно в Solution Explorer я файл формы с расширением *.cs (условно говоря Form1.cs) я не вижу. Я не там ищу или через код удобнее реализовывать? (просто возникает вопрос, как это отредактировать)
3) Функцию обработки сигналов с СОМ-порта и сохранение их на жесткий диск лучше реализовать отдельным файлом *.срр и потом присоединить к проекту или добавить в существующий текст программ?
Заранее спасибо,
Bedouin
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.02.2011, 23:54

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. Всем ответившим большое спасибо)))


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Многофункциональное здание: как одно здание порождает конфликты требований, которые никто не планировал (мат мет мод 29)
anaschu 23.06.2026
Многофункциональное здание: как одно здание порождает конфликты требований, которые никто не планировал Материалы для обсуждения с МГСУ · 2026 Рисунки внутри приложенного ворд файла. Что за. . .
28. Конкретное развертывание плана номер 1 из поста номер 27
anaschu 22.06.2026
Можно ли из модели получить конкретные строительные требования? Честно — напрямую из текущей модели такие ответы не получить. Но цепочка логики есть, и она не такая длинная. Где разрыв . . .
27. Планы на разработку функциональных требований к строительству внутри модели пищеблока (или не только его?)
anaschu 22.06.2026
Что уже реализовано и даёт конфликты «бесплатно» Самый простой конфликт уже работает — конфликт за ресурс-работника. Заданий больше, чем доступных поваров → очередь в queue1. Это прямое отражение. . .
26. мед мат модель.Какие типы конфликтов функциональных требований можно рассчитать через ДЕС-моделирование (СМО) в AnyLogic?
anaschu 22.06.2026
Что ДЕС/ СМО умеет считать напрямую: Конфликты за ресурсы (очереди, узкие места). Несколько типов агентов (повара, учителя, рабочие, пациенты) претендуют на один ресурс (лифт, вход, коридор,. . .
25 модель здравосохранения и функциональных требований к пищеблоку: конфликты функциональных требований.
anaschu 22.06.2026
Есть ли данные о том, какие функциональные/ эксплуатационные требования или их сочетания труднее всего учитывать при проектировании зданий? Да, такие данные есть, и они хорошо описаны и в российской,. . .
Remote Connection Manager
DevAlt 21.06.2026
Написал для себя небольшую прилагу: https:/ / github. com/ altbodhi/ ReConMan По итогу пришел к мысли, что DU не дружат с существующими технологиями. От сериализации до отображения в реляционную. . .
Администрация Хабра удаляет новые энергоэфективные алгоритмы, которые не западной школы кода, и вовсе никак не сгенерированы
Hrethgir 20.06.2026
Делается это, как замечено, при правках - при объявлении концептуальных отличий в алгоримах. Делается это, по линейке событий - после дополнения публикации основными отличиями от основных западных. . .
Процесс ориентированная диалектика (не новость - просто системное обновление, философия).
Hrethgir 20.06.2026
Однажды один участник в своём блоге, на этом форуме, сделал запись "О языках замолвите слово". Понимая, что язык - важная вещь, я решил хорошо подумать, прежде чем сказать, и сказал то, что вы видите. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru