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

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

Восстановить пароль Регистрация
 
djeyz
2 / 2 / 1
Регистрация: 01.04.2013
Сообщений: 70
09.09.2013, 13:23     Работа с com port #1
подскажите пожалуйста!!
написал программку, отправляет запрос на устройство пакет данных (без контрольной суммы), должен придти ответ и записаться в массив!порт открывается, отправляю данные, НЕ КОРРЕКТНО работает 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;
    }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2013, 13:23     Работа с com port
Посмотрите здесь:

Передача файла через COM port C++
C++ Работа с битами И Работа с символьными данными
C++ Com port (writefile кривая работа)
9-ти битная передача через COM port C++
C++ com port
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
 Аватар для vxg
2667 / 1678 / 158
Регистрация: 13.01.2012
Сообщений: 6,278
09.09.2013, 13:28     Работа с com port #2
она не перестает работать - она ожидает пока придут 10 байт. и будет ждать их указанный таймаут. странно однако что вы ожидаете 10 байт, а пишите в DWORD - может что-то там ломается из-за этого
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,337
Завершенные тесты: 1
09.09.2013, 13:41     Работа с com port #3
Лучше наверное все таки использовать вот такую запись:
C++
1
ReadFile(hCom,buf_in,sizeof(buf_in),&bc,NULL);
И действительно, попробуйте поиграться с таймаутами. Я боюсь спросить, сам порт настроен верно (скорость там и все дела)?
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,309
09.09.2013, 14:00     Работа с com port #4
А вызов SetCommTimeouts то где???
eXtream
24 / 24 / 0
Регистрация: 10.03.2010
Сообщений: 161
09.09.2013, 14:18     Работа с com port #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);
}
djeyz
2 / 2 / 1
Регистрация: 01.04.2013
Сообщений: 70
09.09.2013, 14:25  [ТС]     Работа с com port #6
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Я боюсь спросить, сам порт настроен верно (скорость там и все дела)?
Сам порт настроен верно на 100%!! а запись ща попробую!Спасибо
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,337
Завершенные тесты: 1
09.09.2013, 14:35     Работа с com port #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");
      }
djeyz
2 / 2 / 1
Регистрация: 01.04.2013
Сообщений: 70
09.09.2013, 14:39  [ТС]     Работа с com port #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";
Вопросик! А почему такую "плюшку используют"??? или это глюк какой то исправляет, чтобы заработало??)))
vxg
Модератор
 Аватар для vxg
2667 / 1678 / 158
Регистрация: 13.01.2012
Сообщений: 6,278
09.09.2013, 14:40     Работа с com port #9
Цитата Сообщение от djeyz Посмотреть сообщение
если не в DWORD???
все у вас там правильно. я не туда посмотрел. просто вам указали что указание размера буфера в виде константы может привести к ошибке.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,337
Завершенные тесты: 1
09.09.2013, 14:56     Работа с com port #10
Цитата Сообщение от djeyz Посмотреть сообщение
Вопросик! А почему такую "плюшку используют"??? или это глюк какой то исправляет, чтобы заработало??)))
Да что-то такое. Я точно не помню. Эта запись позволяет указывать любой номер порта от 0 до 255. Если достаточно от 0 до 9, то можно и без нее вроде.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.09.2013, 15:15     Работа с com port
Еще ссылки по теме:

C++ Как сделать чтоб отделяло IP и Port
Com port C++

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

Или воспользуйтесь поиском по форуму:
djeyz
2 / 2 / 1
Регистрация: 01.04.2013
Сообщений: 70
09.09.2013, 15:15  [ТС]     Работа с com port #11
Всем спасибо!завтра посмотрю и отпишусь работает или нет!!)))))
Yandex
Объявления
09.09.2013, 15:15     Работа с com port
Ответ Создать тему
Опции темы

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