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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Окно "Блокировка компьютера" http://www.cyberforum.ru/cpp/thread234884.html
Доброго времени суток всем! UISDARNALL10 - это домен andersow - логин А что такое William R. Anderson? Как получить его программно?
C++ Как вытащить string из управляемого кода? Здравствуйте! столкнулся с проблемой вытаскивания строки из c# в с++... есть код на c# namespace MyInterop { public interface IMyDotNetInterface2 { int Add(int Number1, int... http://www.cyberforum.ru/cpp/thread234804.html
C++ Использование СТЕГАНОГРАФИИ посредством ретрансмиссии в протоколах стека TCP/IP.
Очень мало информации по использованию стеганографии в стеке TCP/ip, а софта тем более не встречал!!! В основном натыкаюсь на использование стего в картинках. А мне диплом по етой теме делать, а во...
C++ Экранный буфер консоли, где я ошибаюсь?
Вот код: #include <windows.h> #include <iostream> using namespace std; HANDLE hStdin, hStdout,hNewScreenBuffer;//буфер экрана становится активным в конце InitSettings COORD max_size_buffer;...
C++ Как сделать так, чтобы две разные программы могли работать с одной и той же областью оперативной памяти? http://www.cyberforum.ru/cpp/thread232485.html
Собственно даже незнаю куда копать. Пробовал в одной программе вывести указатель на массив, а в другой указателю присвоить это значение чего-то компилятор ругается( Интересует как сделать так...
C++ Задержка между записью/чтением Serial-порта Доброе время суток. Работаю с одним устройством через RS232 порт, точнее через его эмуляцию с помощью PL2303 (USB-to-RS232). Подключаюсь к порту на скорости 38400, 8 бит, без учета четности. Так... подробнее

Показать сообщение отдельно
Gr1N

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

27.01.2011, 21:42. Просмотров 3152. Ответов 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
}
В чем может быть проблема?
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru