Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/19: Рейтинг темы: голосов - 19, средняя оценка - 4.95
 Аватар для Knazev33
0 / 0 / 0
Регистрация: 11.05.2009
Сообщений: 24

Конвертирование форматов, для СОМ порта

17.05.2009, 17:07. Показов 4084. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Несудите строго, я только начинающий в С++ для компьютеров,
но умею программировать на Си для микроконтроллеров.

Моя задача связать компьютер с микроконтроллером по СОМ порту...
Вобщем возник вопрос, я взял пример работы с сом портом с этого форума,
всё работает, приём и передача, но только когда вводиш данные в поля типа Эдит/Мемо,

Мне нужно передовать/принимать значение переменных в 16ричной(Хекс) системе,
и поместить их в переменную.

Вот вырезки из кода...

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
#define BUFSIZE 255     //ёмкость буфера
unsigned char bufrd[BUFSIZE], bufwr[BUFSIZE]; //приёмный и передающий буферы
int i; //моя переменная для приёма
int i2 = 10; //моя переменная для передачи
 
.
.
.
//выводим принятые байты на экран и в файл (если включено)
void __fastcall ReadThread::Printing()
{
[B]i = *bufrd; //пробую  значение в переменную
Form1->Memo1->Lines->Add((char*)bufrd); // нормальный вывод
Form1->Memo2->Lines->Add(IntToHex(i, 4)); // ненормальный хекс, скорее аскикод
Form1->Memo3->Lines->Add(i); // ненормальный инт, при приёме "1" выводит 59...
Form1->Memo4->Lines->Add((int*)bufrd); //совет с форума//выдаёт ошибку[/B]
 
 
Form1->StatusBar1->Panels->Items[2]->Text = "Всего принято " + IntToStr(counter) + " байт"; //выводим счётчик в строке состояния
 
 if(Form1->CheckBox3->Checked == true)  //если включен режим вывода в файл
  {
   write(handle, bufrd, strlen(bufrd)); //записать в файл данные из приёмного буфера
  }
 memset(bufrd, 0, BUFSIZE);         //очистить буфер (чтобы данные не накладывались друг на друга)
}
.
.
.
//кнопка "Передать"
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 memset(bufwr,0,BUFSIZE);           //очистить программный передающий буфер, чтобы данные не накладывались друг на друга
 PurgeComm(COMport, PURGE_TXCLEAR);             //очистить передающий буфер порта
[B] strcpy(bufwr,Form1->Edit1->Text.c_str());      // в буфер строку из Edit1 
//bufwr = i2; // моя попытка передать значение из и2
//strcpy = i2; //моя попытка передать значение из и2[/B]
 writer = new WriteThread(false);               //поток записи данных в порт
 writer->FreeOnTerminate = true;                //установить это свойство, чтобы поток автоматически уничтожался после завершения
}
Вот так у меня неполучается передать и принять значения с моими переменными,
постоянно выдаёт ошибку про типы переменных.

Зарание благодарен за любую помощь или советы...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.05.2009, 17:07
Ответы с готовыми решениями:

От СОМ-порта к OpenGL
Ещё раз здравствуйте! Проблема в следующем: с СОМ-порта поступают данные, я их обрабатываю и всё вроде ничего... НО! Если принимать...

Чтение и обработка данных из СОМ порта
Добрый день! Есть программа для работы с внешним устройством через СОМ порт. Данные у меня она отправляет на ура, а вот с чтением у меня...

Как изменить номер СОМ порта
Добрый день. Есть некий проект который подсоеденяется к оборудованию через СОМ1. Как можно поменять на СОМ* В описании говорится что...

18
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
17.05.2009, 17:15
А в чём конкретно проблема? Прочитал пост два раза и не смог этого понять
0
 Аватар для Knazev33
0 / 0 / 0
Регистрация: 11.05.2009
Сообщений: 24
17.05.2009, 17:40  [ТС]
Втом что неполучается принятые данные хранить в переменных типа i; int ,
и выводить в 16ую систему, например если пришло FF то вывести 255,
и немогу передать в порт значение 10(например) из i2.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
17.05.2009, 19:16
Ты же сказал, что всё это умеешь на Си делать. Какая в пень разница, на Си или на Си++ хранить переменную в int'е?

Про 16-ричную систему вообще ничего не понял. Система счисления - это форма записи и не более того. От системы счисления вообще не зависит набор битов, пришедших в порт. Просто пока ты конкретно и членораздельно не поставишь вопрос - внятного ответа ты не получишь

> постоянно выдаёт ошибку про типы переменных.
Кто выдаёт? Где выдаёт? Что выдаёт
0
 Аватар для radiohobbyt
192 / 190 / 15
Регистрация: 27.01.2009
Сообщений: 548
17.05.2009, 19:46
итак...тут лучше смотреть на обе программы...и для компа и для контроллера...потому что, судя по программе ты обениваешься строками(я обычно с железками числами обменивался...но это так...дело вкуса=))
Form1->Memo4->Lines->Add((int*)bufrd); //совет с форума//выдаёт ошибку
надо
Form1->Memo4->Lines->Add((char*)bufrd);
то есть сделать указателем на строку. в принципе несколькими строками выше все нормально.
Form1->Memo2->Lines->Add(IntToHex(i, 4)); // ненормальный хекс, скорее аскикод
так правильно. смотри, что у тебя в i хранится.
хочешь все, что принял в 16-ричной системе, бери побайтно и собирай строку.
AnsiString tmpString="";
for(unsigned int i=0; i<BUFSIZE; i++)
tmpString+=IntToHex(bufrd[i],2)+" ";
Form1->Memo2->Lines->Add(tmpStrig);
2
 Аватар для Knazev33
0 / 0 / 0
Регистрация: 11.05.2009
Сообщений: 24
17.05.2009, 20:27  [ТС]
Evg, язык си для мк довольнотаки отличается от с++ для компа,
с переменными в си для мк всё просто, а для компа на знать функции для переменных типа IntToStr и тд...

Radiohobbyt , вы говорите что используете для обмена числа, я думаю это то что мне нужно.
Например:
МК_передаёт->FF(255)* ---комп принемаетFF(255)*-> и помещает 255 в переменнную, и наоборот от компа к мк.
Завтра попробую ваш метод, ато дома Билдер отказывается работать, выдаёт непонятную ошибку "виндовс диск ненайден".
Вообщем спасибо за ответы...
0
 Аватар для Knazev33
0 / 0 / 0
Регистрация: 11.05.2009
Сообщений: 24
18.05.2009, 20:41  [ТС]
В общем код типа
C++
1
2
3
4
 AnsiString tmpString="";
for(unsigned int i=0; i<BUFSIZE; i++)
tmpString+=IntToHex(bufrd[i],2)+" ";
Form1->Memo2->Lines->Add(tmpStriнg);
выдаёт хекс типа "аски", пример отправляю число 123, он принемает 31 32 33, тоесть хекс в виде аски, а нужно настоящий хекс "54" или инт число "123*".

C++
1
2
3
4
5
6
7
8
9
10
11
//кнопка "Передать"
void __fastcall TForm1::Button1Click(TObject *Sender)
{
[B]i= StrToInt(Editl->Text); //преобразовать из текста в переменную[/B]
 PurgeComm(COMport, PURGE_TXCLEAR);             //очистить передающий буфер порта
 strcpy(bufwr,Form1->Edit1->Text.c_str());      //занести в программный передающий буфер строку из Edit1 
 [B]strcpy(bufwr,i) //пробоввать передать число , но тут как всегда косяк с типами переменнами...[/B]
 writer = new WriteThread(false);               //создать и 
 writer->FreeOnTerminate = true;                //установить 
memset(bufwr,0,BUFSIZE);            //очистить 
}
0
 Аватар для radiohobbyt
192 / 190 / 15
Регистрация: 27.01.2009
Сообщений: 548
18.05.2009, 21:25
вот тут-то похоже собака-то и порылась=)
я ж говорил, что надо смотреть обе программы т для ПК и для контроллера. значит ты просто передаешь по ком порту строки, а не числа. поэтому все вот так вот и работает.

Добавлено через 4 минуты 29 секунд
можешь конечно сделать финт ушами вроде
Form1->Memo2->Lines->Add(IntToHex(StrToInt(bufrd),2));

1. из принятой строки делаем число типа инт
2. преобразуем его в 16-ричный вид
1
 Аватар для Knazev33
0 / 0 / 0
Регистрация: 11.05.2009
Сообщений: 24
18.05.2009, 21:53  [ТС]
Да, всё так, с мк точно нормальный хекс идёт(проверял на терминалах),
например 77(3F) а он мне выдаёт аски код "Z",а нужно число 77.
В общем уже думаю забить на 16ю форму, главное чтобы принемать число в целом виде,
но незнаю как зделать, совсем запутался в этих неизвесных с++ функциях, немогу понять их синтаксис.
Как мне хранить и передовать свои числа в порт, из своей переменной(инт скореее?),
ато компилятор ругается постоянно на счёт переменных, немогу понять в чём дело ?
например;
strcpy(bufwr,i) //почему некатит, нехочет передать число 10, и что такое strcpy?.
Спасибо...
0
 Аватар для radiohobbyt
192 / 190 / 15
Регистрация: 27.01.2009
Сообщений: 548
19.05.2009, 06:59
strcpy(a, b) копирует строку b в строку a(и то и другое-указатели на строки). если второе исло окажется инт...то...в общем он будет копировать не знаюоткуда. не напрасно в общем ругается.
0
 Аватар для Knazev33
0 / 0 / 0
Регистрация: 11.05.2009
Сообщений: 24
19.05.2009, 21:19  [ТС]
Понятно, на счёт strcpy(a, b) , но неужели нет способа нормально передать/принять челое число, или Билдер на это неспособен?
Вообщем те методы программирования которые действуют для мк для усарта, в с++ недействуют , Незнаю уж что делать...
0
 Аватар для radiohobbyt
192 / 190 / 15
Регистрация: 27.01.2009
Сообщений: 548
20.05.2009, 10:12
покажи код, как ты отправляешь число из МК. скорее всего в виде 4-х байтов.
билдером твое дело их собрать вместе.
int tmp= bufrd[3]<<24+ bufrd[2]<<16+ bufrd[1]<<8+bufrd[0];
только вот не помню...старшая или младшая его часть идет в начале.
0
 Аватар для Knazev33
0 / 0 / 0
Регистрация: 11.05.2009
Сообщений: 24
20.05.2009, 19:19  [ТС]
То что с мк идёт правельные данные это я уверен, связовал два мк вместе или спомощью уневерсального терминала.
Вот отрезок кода мк;
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
while (1)
      { 
lcd_gotoxy(0,1);    //координаты дисплея
sprintf(lcd_buffer,"T i%3u E%5u ",i, e ) ;    //вывести всё на ЖК экран
lcd_puts(lcd_buffer);    //ЖК буфер
if(!key1){delay_ms(50); i++; eeeprom_read(i, &e); t=e;  [B]putchar(t); [/B]  }  // посылка числа из внешний EEPROM памяти.
if(!key2){delay_ms(50); i--; eeeprom_read(i, &e); t=e;  [B]putchar(t); [/B] }  //посылка числа из внешний EEPROM памяти.  ок
if(!key3){ putsf("превед"); }    //посылка символов(тест)  ок
[B]if(!key4){ putchar(101); }  [/B]   // посылка числа 101 (тест)  ок
//if(!key3){ eeeprom_write(10, a);  }   //запись в еепром 
//if(!key4){ eeeprom_write(15, b);  }  //запись в еепром 
//if(!key3){  eeeprom_write(0, 0); }  //нулевой адрес
      };
развёртывать функции нестал, тк большие.
Тестовая прога читает данные из внешней памяти,и ввиде чисел и передаёт по усарту,
одновременный контроль чисел хранящихся в памяти происходит с помощью ЖК модуля.
например прочёл из памяти число 77, а прога в билдере воспринемает аски вариант, т.е "М" или "37 37".
0
 Аватар для Knazev33
0 / 0 / 0
Регистрация: 11.05.2009
Сообщений: 24
22.05.2009, 20:38  [ТС]
Доброго времени суток,
Возник вопрос, как в с++, разъеденить целое число типа unsigned int, на два байта?
например, число i 65535(0xFFFF) на два байта, х1 255(FF) и х2 255(FF), тоесть
получить две переменных типа unsigned char Х1 и Х2...
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
22.05.2009, 23:29
C
1
2
3
unsigned int val;
unsigned char lo = val & 0xff;
unsigned char hi = (val >> 8) & 0xff;
1
 Аватар для Knazev33
0 / 0 / 0
Регистрация: 11.05.2009
Сообщений: 24
23.05.2009, 11:25  [ТС]
Ещё раз привет всем ,
Какаето непонятка творится с билдером 6, при попытке скомпилировать простейшее приложение, выдаёт ошибку ,
стоит Виста, раньше он работал только от имени администратора, а щас никак.
Ктонибудь встречался с такой проблемой?
Миниатюры
Конвертирование форматов, для СОМ порта  
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
23.05.2009, 12:20
"Диск отсутсвует" - может у тя на новой системе разбивка дисков не такая, как на старой (например, раньше былм C,D,E, а теперь C,D). А в проекте или в свойствах или где-то ещё просочилась инфа о старом диске, которого сейчас уже нет (E в указанном примере)
0
 Аватар для Knazev33
0 / 0 / 0
Регистрация: 11.05.2009
Сообщений: 24
23.05.2009, 14:08  [ТС]
Так у меня только один диск С, я создаю новый проэкт, допустим пустой или с одной кнопкой т.е самое простое, и он при попытке скомпилить выдаёт это неубиваемое окно.
Пробовал несколько раз переустанавливать с разных дисков ,но он всё равно неалё .
Может как нибудь нужно удалить всё насройки о билдере? и заново установить...
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
23.05.2009, 15:56
А... билдер ты всё-таки с нуля преставлял..
ТОгда хз
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.05.2009, 15:56
Помогаю со студенческими работами здесь

Получить сигнал с СОМ-порта
Здравствуйте.Собсно поставлена такая задача - получить по COM-порту код,преобразовать в число и вывести на экран.Тоесть например идет набор...

Графика для сом-порта
Ребят помогите накидать красивую графику для сом-порта, можно самую обычную) пожалуйста

Как отладить программу для чтения данных из сом порта?
Примеров на форуме достаточно, есть от чего оттолкнуться, у меня другой вопрос, чем можно имитировать поступление данных на сом порт с...

Как бы вы сделали обмен между потоками для СОМ порта
Добрый день Всем. Собственно сам вопрос как лучше сделать синхронизацию/обмен между потоками одного приложения. Знаю что можно через...

График реального времени для данных, поступающих из СОМ-порта (MFC)
Добрый день всем! Какое-то время назад Maxi Paul поднимал подобную тему, но она, к сожалению, осталась без ответа. Нужно построить в...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Контроль корректности заполнения дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru