Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
GIRATOR
Сообщений: n/a
#1

робота с com-портом в шеснадцатиричном коде. - C++

12.11.2011, 03:23. Просмотров 425. Ответов 2
Метки нет (Все метки)

Добрый вечер. Я как каждый начинающий в прграмировании столкнулса с проблемой, вызваной скорее отсутствием опыта, чем сложностью задачи. Собственно к делу.
C/C++ я только осваиваю - тем не менее задача поставлена не "примитивная"
В ком-порт нужно отправить команду (контролеру). Команды задаютса в шеснадцатиричном коде, например: "F0AA 16FB 12FD 24CC 57BB 0000 CRC16 55FF". Самостоятельно по примерам разобралса с отпрвкой(прийомом) текста через COM, без преобразования. Собственно вопрос: как команду заданую к примеру в текстовом файле или находящююся в строчке, передать как шеснадцатиричный код? То есть чтоб в коде програмы команда выглядела как в примере (текст ), но чтоб каждый символ считывалса в hex а не в сhar? Иными словами чтоб char "0F" --> dec "15"... а не char "0F" --> dec"4970"...

Прошу прощения за невнятное обяснение, но обясняю как могу...
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.11.2011, 03:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос робота с com-портом в шеснадцатиричном коде. (C++):

Станет ли видео с портом PCI-Express x16 2.х на мать с портом PCIe 2.0 - Видеокарты
Всем привет. Хочу поставить новое видео, но вот смущают порта.Будет ли оно нормально работать и будет ли вообще работать. Мать asus...

Робота с .htaccess робота с адресом перенаправление - Apache, htaccess
Здравствуйте как мне в .htaccess сделать перенаправление вот этих адресов /index.php?do=reg на /registr.html ...

ПРАКТИЧНА РОБОТА № 1 „РОБОТА З МНОЖИНАМИ” - Turbo Pascal
Ребята помогите пожалуйста сделать практычну роботу очень нужно буду благодарна. Умова задачі така: Використовуючи множину символів...

Работа с COM портом - C++
Добрый день! Решил поработать с COM портом. в строке Port=CreateFile("COM2",GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);...

Работа с COM-портом - C++
ФУХ.... Подскажите, почему у меня не идет запись в порт. Примерчик совсем простой. На том конце порта висит ардуинка.100% работает как...

Работа с Com портом - Assembler
Помогите, пожалуйста, составить программу. Задание такое: "Написать 16–ти разрядную ассемблерную программу, которая выводит на экран...

2
schdub
2955 / 1300 / 239
Регистрация: 19.01.2009
Сообщений: 3,413
Завершенные тесты: 1
12.11.2011, 04:59 #2
Вот несколько "велосипедное" решение. В примере, конвертируется один байт. Ассерт происходит если во входной строке встречается неизвестный символ. И да, понимает только обозначенный алфавит, если мы скормим число "ff", например на конвертирование, то ассертнет. Надеюсь, разберетесь:

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
#include <stdlib.h>
#include <string.h>
#include <assert.h>
 
unsigned char byte_str2bin (const char * p) {
 
    char * t;
    int h, l;
    char hexAlph[] = "0123456789ABCDEF";
 
    t = strchr(hexAlph, *p);
    assert(t);
    h = t - hexAlph;
 
    ++p;
 
    t = strchr(hexAlph, *p);
    assert(t);
    l = t - hexAlph;
 
    return ((h << 4) | l);
 
}
 
int main( int argc, char * argv[] ) {
 
    char byteInStr[] = "FF";
    unsigned char byteInBin;
    byteInBin = byte_str2bin(byteInStr);
    return 0;
 
}
0
GIRATOR
Сообщений: n/a
13.11.2011, 16:50 #3
Роботает норм. А как быть с необозанчеными символами. Тоесть вот накорявил по примерам две програми, одна считывает с com и выводит на екран как текст:
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
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <fstream>
using namespace std;
 
int main()
{
    char name[4]="com";
    char symbol='Q';
    char *number=new char;
    HANDLE hport;
    DWORD real_read;
    DCB dcb;
    BOOL succ;
    ofstream out;
 
    cout <<"TEST READING FROM COM-PORT AND WRITING IN FILE" <<endl <<endl;
    cout <<"ENTER COM-PORT NUMBER: ";
    cin >>number;
    cout <<endl;
    strcat(name,number);
    hport=CreateFile(name,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
 
    if(hport==INVALID_HANDLE_VALUE)
    {   cout <<"COM" <<number <<"  CAN'T BE OPENED" <<endl;
        getche();
        return 1;   }
 
    out.open("TEST.a32",ios::trunc);
 
    if(!out)
    {   cout <<"FILE 'TEST.a32' CAN'T BE OPENED" <<endl;
        getche();
        return 1; }
 
    dcb.DCBlength=sizeof(dcb);
    succ=GetCommState(hport,&dcb);
    dcb.BaudRate=CBR_115200;
    dcb.ByteSize=8;
    dcb.Parity=EVENPARITY;
    dcb.StopBits=2;
    succ=SetCommState(hport,&dcb);
 
    while(true)
    {   ReadFile(hport,&symbol,1,&real_read,NULL);
        if(real_read==1) { out <<symbol; cout << symbol; } }
 
    out.close();
    CloseHandle(hport);
    return 0;
}

А вторая собственно отправляет, считывает с клавы срвазу в 16-м коде, тоесть набираем 41 получаем А, 42 - В... и т.д .:

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
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
using namespace std;
 
int main()
{
    char name[4]="com";
    char *number=new char;
    HANDLE hport;
    DWORD real_write;
    DCB dcb;
    BOOL succ;
    char symbol[512];
 
 
    cout <<"TEST SENDING TO COM-PORT" <<endl <<endl;
    cout <<"ENTER COM-PORT NUMBER: ";
    cin >>number;
    cout <<endl;
    strcat(name,number);
 
    hport=CreateFile(name,GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
    if(hport==INVALID_HANDLE_VALUE)
    { cout <<"COM" <<number <<"CAN'T BE OPENED" <<endl;
        getche();
        return 1; }
 
    dcb.DCBlength=sizeof(DCB);
    succ=GetCommState(hport,&dcb);
    dcb.BaudRate=CBR_115200;
    dcb.ByteSize=8;
    dcb.Parity=EVENPARITY;
    dcb.StopBits=2;
    succ=SetCommState(hport,&dcb);
 
  int s =0;
  for (s = 0; s < 255; s++)
    {
    cout << endl <<">";
    if (feof(stdin)) break;
    fflush(stdout);
    scanf("%x", symbol);
    int i=0;
      while (symbol[i] != 0)
      { WriteFile(hport,&symbol[i],1,&real_write,NULL);
      i = i+1; }
    }        
   
    CloseHandle(hport);
    return 0;
}
И ну и тоже самое, с "FF", а если ввести 0 или чегото до 21 то вообще абракадабра...
Или ето просто програма читатель норм не может отобразить, а контролерру будет понятно?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2011, 16:50
Привет! Вот еще темы с ответами:

работа с com портом - C#
добрый день ув. форумчане , у меня есть девайс который работает через com port , в девайсе хранится данные hex формата , мне их надо...

Работа с COM портом - MS Access
Помогите плз. в работе с COM портом. Необходимо организовать взаимодейтвие с электронными весами. Весы оснащены последовательным...

Работа с COM портом - C#
Есть некое устройство подключённое к COM порту. Создаю консольное приложение с таким кодом: using System; using System.IO.Ports; ...

Работа с COM портом - Delphi WinAPI
Добрый день, уважаемые знатоки! Помогите пожалуйста выработать логику работы программы. Имеется электродвигатель, с одним магнитом на...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru