С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Gr1N
1

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте, подскажите пожалуйста. Пишу програмку потипу 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
}
В чем может быть проблема?
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.01.2011, 21:42
Ответы с готовыми решениями:

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

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

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

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

0
27.01.2011, 21:42
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.01.2011, 21:42
Помогаю со студенческими работами здесь

Com порт, асинхронное чтение не возвращает весь ответ
День добрый, пишу софтинку для личного ползования, а конкретно опрос ИБП через com порт по...

Открыть текстовый файл в необходимом режиме (на чтение, на чтение и запись, на добавление)
Открыть текстовый файл в необходимом режиме (на чтение, на чтение и запись, на добавление). (В...

Непрерывное чтение и обработка с com порта (последовательный порт) в Visual C++
Здравствуйте, я задумал одну идею с GPS приемником, но для того чтобы реализовать это мне...

[Файлы] Запись-чтение-запись. Почему не прокатывает?
Сначала записываю в файл &quot;а&quot; запись &quot;makulatura&quot;, потом читаю ее в строку h. Все ок. Но потом когда...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Это работает. Скорость асинхронной логики велика. Вопрос видимо останется в стабильности. Плата - огонь!
Hrethgir 13.01.2025
По прошлому проекту в Logisim Evolution прилагаю файл архива проекта Gowin Eda и снимок. Восьмибитный счётчик из сумматора+ генератор сигнала согласования+ стартер fast регистров. Файлы прилагаю. . . .
UserScript для подсветки кнопок языков программировани­­­­я в зависимости от текущего раздела
volvo 13.01.2025
В результате работы этого скрипта подсвечиваются нужные кнопки не только в форме быстрого ответа, но и при редактировании сообщения: / / ==UserScript== / / @name CF_DefaultLangSelect / / . . .
Введение в модели и алгоритмы машинного обучения
InfoMaster 12.01.2025
Машинное обучение представляет собой одну из наиболее динамично развивающихся областей искусственного интеллекта, которая фокусируется на разработке алгоритмов и методов, позволяющих компьютерам. . .
Как на Python создать нейросеть для решения задач
InfoMaster 12.01.2025
В контексте стремительного развития современных технологий особое внимание уделяется таким инструментам, как нейросети. Эти структуры, вдохновленные биологическими нейронными сетями, используются для. . .
Как создать нейросеть для генерации картинок на Python
InfoMaster 12.01.2025
Генерация изображений с помощью искусственных нейронных сетей стала одним из наиболее захватывающих направлений в области компьютерного зрения и машинного обучения. В этой статье мы рассмотрим. . .
Создание нейросети для генерации текста на Python
InfoMaster 12.01.2025
Нейросети, или искусственные нейронные сети, представляют собой модели машинного обучения, вдохновленные работой человеческого мозга. Они состоят из множества взаимосвязанных узлов, или "нейронов",. . .
Как создать нейросеть распознавания изображений на Python
InfoMaster 12.01.2025
Введение в распознавание изображений с помощью нейросетей Распознавание изображений с помощью нейронных сетей стало одним из самых впечатляющих достижений в области искусственного интеллекта. Эта. . .
Основы искуственного интеллекта
InfoMaster 12.01.2025
Искусственный интеллект (ИИ) представляет собой одну из наиболее динамично развивающихся областей современной науки и технологий. В широком смысле под искусственным интеллектом понимается способность. . .
Python и нейросети
InfoMaster 12.01.2025
Искусственные нейронные сети стали неотъемлемой частью современных технологий, революционизировав множество областей - от медицинской диагностики до автономных транспортных средств. Python, благодаря. . .
Python в машинном обучении
InfoMaster 12.01.2025
Python стал неотъемлемой частью современного машинного обучения, завоевав позицию ведущего языка программирования в этой области. Его популярность обусловлена несколькими ключевыми факторами, которые. . .
Создание UI на Python с TKinter
InfoMaster 12.01.2025
TKinter — это одна из наиболее популярных библиотек для создания графических интерфейсов пользователей (GUI) в языке программирования Python. TKinter входит в стандартную библиотеку Python, что. . .
HTML5 в разработке мобильных приложений
InfoMaster 12.01.2025
Введение: Обзор роли HTML5 в мобильной разработке В современном мире мобильных технологий HTML5 стал ключевым инструментом для разработки кроссплатформенных приложений. Эта технология произвела. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru