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

COM-порт чтение\запись - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.74
Gr1N
Сообщений: n/a
27.01.2011, 21:42     COM-порт чтение\запись #1
Здравствуйте, подскажите пожалуйста. Пишу програмку потипу hyperterminal. Задача, общение с модемом wavecom посредством АТ команд. Вопрос в чем, когда я отправлю команду и потом считываю ответ, то мне приходит моя же команда, хотя в гипертерминале все впорядке(на теже команды я получаю ответы).

Исходник:

класс с основными функциями:
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
#ifndef __SERIAL_H__
#define __SERIAL_H__
 
#include <string>
#include <windows.h>
 
typedef std::basic_string<TCHAR> tstring;
 
class Serial
{
private:
    HANDLE commHandle;
 
public:
    Serial(tstring &commPortName, int bitRate = 115200);
 
    virtual ~Serial();
 
    int write(const char buffer[]);
 
    int read(char *buffer, int buffLen, bool nullTerminate = true);
 
    ///очищаем все из буфера порта
    void flush();
};
 
#endif
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
84
85
86
87
88
89
90
91
#include <iostream>
//using namespace std;
 
#include "Serial.h"
 
Serial::Serial(tstring &commPortName, int bitRate)
{
    commHandle = CreateFile(commPortName.c_str(), GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
 
    if(commHandle == INVALID_HANDLE_VALUE) 
    {
        throw("ERROR: Could not open com port");
    }
    else 
    {
        // set timeouts
        COMMTIMEOUTS cto = {MAXDWORD, 0, 0, 0, 0};
        DCB dcb;
        if(!SetCommTimeouts(commHandle, &cto))
        {
            Serial::~Serial();
            throw("ERROR: Could not set com port time-outs");
        }
 
        // set DCB
        memset(&dcb, 0, sizeof(dcb));
        dcb.DCBlength = sizeof(dcb);
        dcb.BaudRate = bitRate;
        dcb.fBinary = 1;
        dcb.fDtrControl = DTR_CONTROL_ENABLE;
        dcb.fRtsControl = RTS_CONTROL_ENABLE;
 
        dcb.Parity = NOPARITY;
        dcb.StopBits = ONESTOPBIT;
        dcb.ByteSize = 8;
 
        if(!SetCommState(commHandle, &dcb))
        {
            Serial::~Serial();
            throw("ERROR: Could not set com port parameters");
        }
    }
}
 
Serial::~Serial()
{
    CloseHandle(commHandle);
}
 
int Serial::write(const char *buffer)
{
    DWORD numWritten;
    WriteFile(commHandle, buffer, strlen(buffer), &numWritten, NULL); 
 
    return numWritten;
}
 
int Serial::read(char *buffer, int buffLen, bool nullTerminate)
{
    DWORD numRead;
    if(nullTerminate)
    {
        --buffLen;
    }
 
    BOOL ret = ReadFile(commHandle, buffer, buffLen, &numRead, NULL);
 
    if(!ret)
    {
        return 0;
    }
 
    if(nullTerminate)
    {
        buffer[numRead] = '\0';
    }
 
    return numRead;
}
 
#define FLUSH_BUFFSIZE 10
 
void Serial::flush()
{
    char buffer[FLUSH_BUFFSIZE];
    int numBytes = read(buffer, FLUSH_BUFFSIZE, false);
    while(numBytes != 0)
    {
        numBytes = read(buffer, FLUSH_BUFFSIZE, false);
    }
}
пример мейна:
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
// SerialTest.cpp : Defines the entry point for the console application.
//
 
#include <iostream>
#include <windows.h>
 
#include "Serial.h"
#include "stdafx.h"
 
 
#define RX_BUFFSIZE 20
 
void printUsage(_TCHAR progName[]);
 
int _tmain(int argc, _TCHAR* argv[])
{
    if(argc != 2)
    {
        printUsage(argv[0]);
        return 10;
    }
 
    try
    {
        std::cout<<"Opening com port"<<std::endl;
        Serial serial((tstring)argv[1], 115200);
        std::cout<<"Port opened"<<std::endl;
 
        std::cout<<"writing something to the serial port"<<std::endl;
        serial.flush();
 
        int bytesWritten = serial.write("AT");
        
        std::cout<<bytesWritten<<" bytes were written to the serial port"<<std::endl;
 
        char buffer[RX_BUFFSIZE];
        std::cout<<"Reading from the serial port: ";
        for(int i(0); i < 10; i++)
        {
            int charsRead = serial.read(buffer, RX_BUFFSIZE);
            std::cout<<buffer;
            Sleep(100);
        }
        std::cout<<std::endl;
 
    }
    catch(const char *msg)
    {
        std::cout<<msg<<std::endl;
    }
 
    return 0;
}
 
void printUsage(_TCHAR progName[])
{
    #if defined(UNICODE)
        std::wcout<<progName<<" <comm port>"<<std::endl<< "e.g., "<<progName<<" COM1"<<std::endl;
    #else
        std::cout<<progName<<" <comm port>"<<std::endl<<"e.g., "<<progName<<" COM1"<<std::endl;
    #endif
}
В чем может быть проблема?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.01.2011, 21:42     COM-порт чтение\запись
Посмотрите здесь:

C++ Чтение/запись
Запись символов CR и LF в COM порт C++
Запись в СОМ-порт C++ Builder
Чтение и запись C++
Запись и чтение из файла C++
Чтение и запись в com порт C++ Builder
[Файлы] Запись-чтение-запись. Почему не прокатывает? C++
Непрерывное чтение и обработка с com порта (последовательный порт) в Visual C++ C++
C++ Чтение и запись в файл
Чтение из файла и запись C++
C++ Считывание и запись в COM порт
C++ Обратная польская запись (порт с Java)

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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