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

com port - C++

Восстановить пароль Регистрация
 
djeyz
2 / 2 / 1
Регистрация: 01.04.2013
Сообщений: 70
11.06.2013, 19:16     com port #1
Помогите новичку, уже 3 недели мучаюсь, и все статьи перечитал!!Не понимаю в чем ошибка!
Написал программку в синхронном режиме передача данных(не важно каких), должен прислать ответ и записать в массив!Метод передачи little indean!

Должен прислать ответ в программку, что контрольная сумма не верна.
НА приборе экрана показывает ошибка контрольной суммы, значит данные уходят, но не приходит ответ в программку!
Необходимо что бы ответ записался через ReadFile()!!!
Еще вопрос "Число последующих байт" нужно указывать Сколько всего байтов посылаешь(т.е. 5 слов - значит 10 байт), или указывать количество данных (buff[4] - buff[7] - значит 4 байта)???

Настройки такие:

Посылается 5 СЛОВ:
0202h – 02h - номер режима, 02h-байт синхронизации
0004 - число последующих байт без контрольной суммы
xxxx - номер предела по току (0…8 соответственно для 50A…0.05A)
xxxx - номер предела по напряжению (0…2 соответственно для 220В…60В)
xxxx - Контрольная сумма CRC16 за все байты

Время ожидания ответа с учетом срабатывания реле переключающих пределы измерения до 1 сек.

Принимется:
Если норма:
0002h - 00-НОРМА, 02-синхронизация
0008h - число последующих байт
байты:
xxxx - установленный номер предела по току
(0…8 соответственно для 50A…0.05A)
xxxx - установленный номер предела по напряжению
(0…2 соответственно для 220В…60В)
xxxx - уровень доступа к прибору (0…2)
xxxx - схема подключения (001b, 010b, 100b соответственно
для 3ф.4пр., 3ф.3пр., 1ф.2пр.)
xxxx - Контрольная сумма CRC16 за все байты
Если не норма:
ff02h - ff-НЕ НОРМА, 02-синхронизация
0000 - число последующих байт = 0
xxxx - Контрольная сумма CRC16 за 2 байта



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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <windows.h>
#include <iostream>
 
using namespace std;
HANDLE hCom;
COMMTIMEOUTS CommTimeOuts;
    DWORD bc;
    
int main(){
 
    unsigned char buf_in[10]; //массив куда записывается
 
    unsigned char buf[10];
//настройки которые посылаем 
    buf[0] = 0x02; //байт синхронизации
    buf[1] = 0x02; //номер режима
    
    buf[2] = 0x0A; //отсылаем 10 байт  00 0А
    buf[3] = 0x00;
    
    buf[4] = 0x0A; //какие то данные
    buf[5] = 0x00;
    buf[6] = 0x0C;
    buf[7] = 0x00;
    
    buf[8] = 0x00; // Контрольная суммма равна пока что 0
    buf[9] = 0x00;
      
// открываем порт и настраиваем
    char* pcComPort= "COM1";
    DCB dcb;
    int fSuccess;
    
    hCom=CreateFile(pcComPort, GENERIC_READ | GENERIC_WRITE, 
        0, NULL, OPEN_EXISTING, 0, NULL);
    if (hCom== INVALID_HANDLE_VALUE ){
        printf("error open COM1!\n");
        system("pause");
        return 1;
    }
    
    GetCommState(hCom, &dcb);
    dcb.BaudRate=CBR_115200; // CBR_
    dcb.ByteSize=8; 
    dcb.Parity=0;//NOPARITY;
    dcb.StopBits=0; //ONESTOPBIT;
    
    fSuccess=SetCommState(hCom, &dcb);
    if (!fSuccess){
        printf("popytka vyzova SetCommState error!\n");
        system("pause");
        return 1;
    }
    printf("COM port %s uspeshno sconfigurirovan\n", pcComPort);
 
    PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR); 
    
//    CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF ;
//      CommTimeOuts.ReadTotalTimeoutMultiplier = 0 ;
//      CommTimeOuts.ReadTotalTimeoutConstant = 1000 ;
//      CommTimeOuts.WriteTotalTimeoutMultiplier = 0 ;
//      CommTimeOuts.WriteTotalTimeoutConstant = 1000 ;
      
      SetCommTimeouts( hCom, &CommTimeOuts ); 
    
//отправка данных    
    WriteFile(hCom,buf,10,&bc,NULL);
 cout << "WriteFile\n";
 
//чтение ответа из порта
   ReadFile(hCom,buf_in,sizeof &buf,&bc,NULL);
   cout << "ReadFile\n";
// показать что прочитал
   for(int i=0;i<10;i++){
    cout << buf_in[i];
}
    CloseHandle(hCom);
    
    system("pause");
    return 0;
}
Добавлено через 2 часа 20 минут
ААА!кто - нибудь помогите пожалуйста!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.06.2013, 19:16     com port
Посмотрите здесь:

Передача файла через COM port C++
C++ Com port (writefile кривая работа)
9-ти битная передача через COM port C++
C++ Как сделать чтоб отделяло IP и Port
C++ Работа с com port
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
djeyz
2 / 2 / 1
Регистрация: 01.04.2013
Сообщений: 70
12.06.2013, 19:26  [ТС]     com port #2
Форумчата помогите чем можете
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
13.06.2013, 11:58     com port #3
У Вас в случае нормы будут переданы 14 байт, в противном случае - 6, а в программе Вы пытаетесь считать 10.
djeyz
2 / 2 / 1
Регистрация: 01.04.2013
Сообщений: 70
14.06.2013, 18:41  [ТС]     com port #4
Цитата Сообщение от kazak Посмотреть сообщение
У Вас в случае нормы будут переданы 14 байт, в противном случае - 6, а в программе Вы пытаетесь считать 10.
т.е. мне нужно создать принимающий массив размерностью не 10, а 14 ????

C++
1
2
3
4
5
6
 unsigned char buf_in[14]; //массив куда записывается
 
 
//чтение ответа из порта
   ReadFile(hCom,buf_in,sizeof &buf_in,&bc,NULL); //т.е. вот так?????
   cout << "ReadFile\n";
Добавлено через 3 минуты
Цитата Сообщение от kazak Посмотреть сообщение
У Вас в случае нормы будут переданы 14 байт, в противном случае - 6, а в программе Вы пытаетесь считать 10.

А как создать ЕСЛИ НЕ НОРМА !!!еще одни массив!! если не ошибаюсь оставшиеся байты (14 - 6) придет мусор (от не го тоже нужно избавляться)???? извиняюсь если вопрос глупый
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
14.06.2013, 18:45     com port #5
ИМХО тут лучше побайтно принимать. Приняли первые 4 байта, посмотрели в последних двух - сколько должно еще прийти, считали оставшиеся + два байта контрольной суммы.
Yandex
Объявления
14.06.2013, 18:45     com port
Ответ Создать тему
Опции темы

Текущее время: 17:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru