С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
djeyz
2 / 2 / 1
Регистрация: 01.04.2013
Сообщений: 70
#1

Работа с com port - C++

09.09.2013, 13:23. Просмотров 1232. Ответов 10
Метки нет (Все метки)

подскажите пожалуйста!!
написал программку, отправляет запрос на устройство пакет данных (без контрольной суммы), должен придти ответ и записаться в массив!порт открывается, отправляю данные, НЕ КОРРЕКТНО работает readfile()
Не пойму в чем ошибка ()
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
82
83
#include <windows.h>
#include <iostream>
 
using namespace std;
HANDLE hCom;
 
 
int main(){
    DWORD bc;
    unsigned int buf_in[10] = {0};
    unsigned int buf[10];
    buf[0] = 0x02;
    buf[1] = 0x02;
    buf[2] = 0x06;
    buf[3] = 0x04;
    buf[4] = 0x00;
    buf[5] = 0x00;
    buf[6] = 0x00;
    buf[7] = 0x00;
    
    buf[8] = 0x00;
    buf[9] = 0x00;
    
    
 
    char* pcComPort= "COM4";
    DCB dcb;
    int fSuccess;
    
    hCom=CreateFile(pcComPort, GENERIC_READ | GENERIC_WRITE, 
        0, NULL, OPEN_EXISTING, 0, NULL);
    if (hCom== INVALID_HANDLE_VALUE ){  //INVALID_HANDLE_VALUE
        printf("error open COM4!\n");
        system("pause");
        return 1;
    }
    
    GetCommState(hCom, &dcb);
     dcb.BaudRate=CBR_115200;   // Ñêîðîñòü.
     dcb.ByteSize=8;            // ГђГ*çìåð ГЎГ*éòГ*.
     dcb.fBinary=TRUE;          // Г’Г*ГЄ áûòü äîëæГ*Г®, ГЁГ*Г*Г·ГҐ Г*ГҐ Г°Г*áîòГ*ГҐГІ.
     dcb.fParity=FALSE;         // ГЌГҐГІ ñõåìû ГЇГ*ðèòåòГ*.
     dcb.fOutxCtsFlow=TRUE;     // Áóäåì èñïîëüçîâГ*ГІГј CTS ïðè îáìåГ*ГҐ.
     dcb.fOutxDsrFlow=FALSE;    // ГЌГҐ áóäåì èñïîëüçîâГ*ГІГј DSR ïðè îáìåГ*ГҐ.
     dcb.fDsrSensitivity=FALSE; // ГЌГҐ áóäåì èñïîëüçîâГ*ГІГј DSR ïðè îáìåГ*ГҐ.
     dcb.fRtsControl=RTS_CONTROL_ENABLE;  // RTS Г*Г*Г¬ Г*óæåГ*.
     dcb.StopBits=ONESTOPBIT;   // ÎäèГ* ñòîïîâûé ГЎГЁГІ.
     dcb.Parity=NOPARITY;       // ГЌГҐГІ ГЇГ*ðèòåòГ*.
     dcb.fInX=FALSE;
     dcb.fOutX=FALSE;
     dcb.fNull=FALSE;
    
     COMMTIMEOUTS cmt;
     cmt.ReadIntervalTimeout=0;
     cmt.ReadTotalTimeoutConstant=200;
     cmt.ReadTotalTimeoutMultiplier=0;
     cmt.WriteTotalTimeoutConstant=200;
     cmt.WriteTotalTimeoutMultiplier=0;    
    
    
    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); 
    
    WriteFile(hCom,buf,10,&bc,NULL);    //отправляю данные, на дисплее показывает что пришли
    ReadFile(hCom,buf_in,10,&bc,NULL);  // вот здесь перестает работать программа!!!!
    for(int i=0;i<10;i++){
            cout << buf_in[i] << " ";
            }   
    
    
    
    CloseHandle(hCom);
    
    system("pause");
    return 0;
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2013, 13:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Работа с com port (C++):

Работа с Serial port - C++
Всем доброго времени суток! Я начинающий программист-самоучка (С/С++, Pascal). Уже подташнивает от консольных приложений, и...

Com port (writefile кривая работа) - C++
Подскажите в чём дело? Пишу терминалку для управления мк. Необходимо отправить массив из трёх байт. В место трёх байт на мк приходит 1...

com port - C++
Помогите новичку, уже 3 недели мучаюсь, и все статьи перечитал!!Не понимаю в чем ошибка! Написал программку в синхронном режиме передача...

Com port - C++
Помогите пожалуйста найти библиотеки для работы с COM

Com port и С++ - C++
Хочу отослать данные по ком порту на контроллер.Вот только беда,не отсылается всё сообщение,а только один символ.Как это исправить? ...

9-ти битная передача через COM port - C++
братцы вопрос такой, как мне собственно реализовать девятибитную передачу через ком порт?) bool SerialPort::CreateCOM(string name) {...

10
vxg
Модератор
3189 / 1992 / 228
Регистрация: 13.01.2012
Сообщений: 7,712
09.09.2013, 13:28 #2
она не перестает работать - она ожидает пока придут 10 байт. и будет ждать их указанный таймаут. странно однако что вы ожидаете 10 байт, а пишите в DWORD - может что-то там ломается из-за этого
0
SatanaXIII
Супер-модератор
Эксперт С++
5643 / 2678 / 252
Регистрация: 01.11.2011
Сообщений: 6,574
Завершенные тесты: 1
09.09.2013, 13:41 #3
Лучше наверное все таки использовать вот такую запись:
C++
1
ReadFile(hCom,buf_in,sizeof(buf_in),&bc,NULL);
И действительно, попробуйте поиграться с таймаутами. Я боюсь спросить, сам порт настроен верно (скорость там и все дела)?
0
CheshireCat
Эксперт С++
2896 / 1245 / 78
Регистрация: 27.05.2008
Сообщений: 3,405
09.09.2013, 14:00 #4
А вызов SetCommTimeouts то где???
0
eXtream
24 / 24 / 0
Регистрация: 10.03.2010
Сообщений: 164
09.09.2013, 14:18 #5
Вот пример из MSDN мож поможет:
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
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
 
int main(int argc, char *argv[])
{
   DCB dcb;
   HANDLE hCom;
   BOOL fSuccess;
   TCHAR *pcCommPort = TEXT("COM2");
 
   hCom = CreateFile( pcCommPort,
                    GENERIC_READ | GENERIC_WRITE,
                    0,    // must be opened with exclusive-access
                    NULL, // default security attributes
                    OPEN_EXISTING, // must use OPEN_EXISTING
                    0,    // not overlapped I/O
                    NULL  // hTemplate must be NULL for comm devices
                    );
 
   if (hCom == INVALID_HANDLE_VALUE) 
   {
       // Handle the error.
       printf ("CreateFile failed with error %d.\n", GetLastError());
       return (1);
   }
 
   // Build on the current configuration, and skip setting the size
   // of the input and output buffers with SetupComm.
 
   SecureZeroMemory(&dcb, sizeof(DCB));
   dcb.DCBlength = sizeof(DCB);
   fSuccess = GetCommState(hCom, &dcb);
 
   if (!fSuccess) 
   {
      // Handle the error.
      printf ("GetCommState failed with error %d.\n", GetLastError());
      return (2);
   }
 
   // Fill in DCB: 57,600 bps, 8 data bits, no parity, and 1 stop bit.
 
   dcb.BaudRate = CBR_57600;     // set the baud rate
   dcb.ByteSize = 8;             // data size, xmit, and rcv
   dcb.Parity = NOPARITY;        // no parity bit
   dcb.StopBits = ONESTOPBIT;    // one stop bit
 
   fSuccess = SetCommState(hCom, &dcb);
 
   if (!fSuccess) 
   {
      // Handle the error.
      printf ("SetCommState failed with error %d.\n", GetLastError());
      return (3);
   }
 
   _tprintf (TEXT("Serial port %s successfully reconfigured.\n"), pcCommPort);
   return (0);
}
1
djeyz
2 / 2 / 1
Регистрация: 01.04.2013
Сообщений: 70
09.09.2013, 14:25  [ТС] #6
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Я боюсь спросить, сам порт настроен верно (скорость там и все дела)?
Сам порт настроен верно на 100%!! а запись ща попробую!Спасибо
0
SatanaXIII
Супер-модератор
Эксперт С++
5643 / 2678 / 252
Регистрация: 01.11.2011
Сообщений: 6,574
Завершенные тесты: 1
09.09.2013, 14:35 #7
Есть еще кстати плюшка с префиксом имени компорта. Все похожие на компорт объекты показывает. Тоже можно попробовать:
C++
1
char* pcComPort= "\\\\.\\COM4";
Добавлено через 50000 минут
djeyz, и вон вам CheshireCat правильно подсказывает - у вас в коде по крайней мере не приведено SetCommTimeouts - установка таймаутов. Вы их настроили - хорошо, а применить настройки?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
     COMMTIMEOUTS cmt;
     cmt.ReadIntervalTimeout=0;
     cmt.ReadTotalTimeoutConstant=200;
     cmt.ReadTotalTimeoutMultiplier=0;
     cmt.WriteTotalTimeoutConstant=200;
     cmt.WriteTotalTimeoutMultiplier=0; 
 
if(!SetCommTimeouts(hCom, &cmt)) 
      {                                           
      printf("COM port timeouts not set\n");
      system("pause");
      return 1;
else      
      {                      
      printf("COM port timeouts set Ok\n");
      }
0
djeyz
2 / 2 / 1
Регистрация: 01.04.2013
Сообщений: 70
09.09.2013, 14:39  [ТС] #8
Цитата Сообщение от vxg Посмотреть сообщение
она не перестает работать - она ожидает пока придут 10 байт. и будет ждать их указанный таймаут. странно однако что вы ожидаете 10 байт, а пишите в DWORD - может что-то там ломается из-за этого
Но я же отправляю эти 10 байт!!на дисплее появляется ошибка НЕ СОВПАДАЕТ КОНТРОЛЬНАЯ СУММА " CRC IN RS "!должен придти ответ!
или скорость отправки равняется размеру таймауту???
вопрос а в каком формате можно отправить, если не в DWORD???

C
1
2
3
DWORD bc;
 
WriteFile(hCom,buf,10,&bc,NULL);
Добавлено через 1 минуту
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Есть еще кстати плюшка с префиксом имени компорта. Все похожие на компорт объекты показывает. Тоже можно попробовать:
C++
1
char* pcComPort= "\\\\.\\COM4";
Добавлено через 50000 минут
djeyz, и вон вам CheshireCat правильно подсказывает - у вас в коде по крайней мере не приведено SetCommTimeouts - установка таймаутов. Вы их настроили - хорошо, а применить настройки?
Упс ))) сглупил спасибо!!!

Добавлено через 2 минуты
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Есть еще кстати плюшка с префиксом имени компорта. Все похожие на компорт объекты показывает. Тоже можно попробовать:
C++
1
char* pcComPort= "\\\\.\\COM4";
Вопросик! А почему такую "плюшку используют"??? или это глюк какой то исправляет, чтобы заработало??)))
0
vxg
Модератор
3189 / 1992 / 228
Регистрация: 13.01.2012
Сообщений: 7,712
09.09.2013, 14:40 #9
Цитата Сообщение от djeyz Посмотреть сообщение
если не в DWORD???
все у вас там правильно. я не туда посмотрел. просто вам указали что указание размера буфера в виде константы может привести к ошибке.
1
SatanaXIII
Супер-модератор
Эксперт С++
5643 / 2678 / 252
Регистрация: 01.11.2011
Сообщений: 6,574
Завершенные тесты: 1
09.09.2013, 14:56 #10
Цитата Сообщение от djeyz Посмотреть сообщение
Вопросик! А почему такую "плюшку используют"??? или это глюк какой то исправляет, чтобы заработало??)))
Да что-то такое. Я точно не помню. Эта запись позволяет указывать любой номер порта от 0 до 255. Если достаточно от 0 до 9, то можно и без нее вроде.
1
djeyz
2 / 2 / 1
Регистрация: 01.04.2013
Сообщений: 70
09.09.2013, 15:15  [ТС] #11
Всем спасибо!завтра посмотрю и отпишусь работает или нет!!)))))
0
09.09.2013, 15:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.09.2013, 15:15
Привет! Вот еще темы с ответами:

Передача файла через COM port - C++
Вопрос Чайника. Начал программировать на С++ совсем недавно и вот столкнулся с такой проблемойЖ Нужно отправить в порт файл по частям....

Как сделать чтоб отделяло IP и Port - C++
Нужен код для c++ чтоб программа поняла где ип,порт (IP:PORT) Я нуб помогите пожалуйста , молю вас,помогите добрые земляни в решении...

В каком виде приходят данные на COM PORT? - C++
Написал простейшую программку для передачи данных на БП через COM PORT. На сколько я знаю, данные нужно кодировать в ASCII перед отправкой,...

Работа с UDP протоколом за роутером (Port Restricted Cone NAT и в добавок Random port ) - C#
Посылая сообщение на внешний ip Nat роутера меняет порт.... и при попытки отправить ответ и указывая либо старый либо новый порт с ip...


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

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

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