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

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.74
Gr1N
Сообщений: n/a
#1

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

27.01.2011, 21:42. Просмотров 3069. Ответов 0
Метки нет (Все метки)

Здравствуйте, подскажите пожалуйста. Пишу програмку потипу 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++):

Считывание и запись в COM порт - C++
Есть код на стороне Ардуины, он работает, с ним всё порядке: boolean dataReady = 0; char incomingChar; char typeMessage; String...

Работа с БД SQLite 3: чтение, запись - C++
есть бд SQLite 3, раньше с SQLite не работал, подскажите как от туда считать данные и записать их туда

Чтение и запись в один и тот же файл с CreateFile - C++
Добрый день. необходимо, чтобы можно было открыть файл, произвести из него чтение, и в процессе считывания при необходимости вносить...

Для поля объекта запретить запись, но оставить чтение - C++
Традиционное оформление объектов заключается в том, что поля-значения помещаются в private класса, а получение значений или модификация...

RS-232 (COM - порт) и С++ - C++
Подскажите, пожалуйста, как через прерывания написать программу для управления через COM-порт. Например, по линии Tx с компьютера передаем...

Двубитный порт в однобитный - C++
Ребята меня тут попросили помочь с заданием с контроллерами и требует двубитный порт при прмрщи цикла If преобразовать в однобитный я...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.01.2011, 21:42
Привет! Вот еще темы с ответами:

Чтение и запись в com порт - C++ Builder
Порт открывается для асинхронного режима, затем мне надо чтобы по нажатию Enter содержимое Edit отправилось как команда в порт. Команда...

Чтение данных из файла и их передача через порт компьютера - C++ Builder
Добрый день. Есть задача: в текстовый файл в реальном времени пишется поток данных (углы наклона прибора в градусах). Необходимо...

Запись в СОМ-порт - C++ Builder
Здравствуйте! Столкнулся с проблемой: Для общения с com-портом, разумеется, необходимо слать ему команды. Для того чтобы устройство...

Чтение и запись в com порт в linux - Java
Нужно читать и писать в виртуальные com-порты на java. Как именно это делается?? Открываешь файл псевдотерминала и просто из него читаешь...


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

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

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