Форум программистов, компьютерный форум, киберфорум
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. Показов 52630. Ответов 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 байт, 456 просмотров)
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 Кб, 771 просмотров)
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 Кб, 114 просмотров)
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
Ответ Создать тему
Новые блоги и статьи
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru