2 / 2 / 0
Регистрация: 07.12.2010
Сообщений: 21

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

07.12.2010, 13:11. Показов 52705. Ответов 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 must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru