1

(0 відповідей, залишених у C++)

Вітаю, мені необхідно зробити якійсь зручний та зрозумілий вивід інформації з ком порта у вигляді графіків, зупинився на builder 6 c++ та компоненті chart, все зробив але не можу нормально налаштувати компонент. Мені потрібно , щоб при додаванні нових даних графік не сжимався (як він робить за замовчуванням), а та частина яка не влазить в область зміщалася вліво і зявлялась полоса прокрутки знизу. також потрібно зробити масштабування лише по горизонталі.
Хто стикався підкажіть. Дякую за увагу.

P.S. в гуглі тільки стандартні приклади, поки що нічого цікавого не знайшов

2

(16 відповідей, залишених у C++)

Про всяк випадок , я прочитав два підручника.... із с++ не бийте боляче

3

(16 відповідей, залишених у C++)

Тут вже інше питання, можливо для іншої гілки , чому ардуїнка обнуляється?

4

(16 відповідей, залишених у C++)

koala написав:

Вибачте, я правильно зрозумів, що ви
1) запускаєте ардуїно, під'єднаний до com-порта
2) за певний час запускаєте цю програму, що читає з com-порта
3) програма відображає сигнали з ардуїно, відіслані до запуску програми?
Усе правильно? Чи, наприклад, програма запускається раніше, а ви натискаєте кнопку пізніше?

Все вірно але... я тупанув трохи

5

(16 відповідей, залишених у C++)

lucas-kane написав:

Можливо тому, що ви звертаєтесь до m_bOpened напряму, а не через метод. Не знаю, що за бібліотека, але перевірте чи там є якийсь код який перевіряє режими роботи КОМ-порту. Можливо є якісь біти, котрі задаються при ініціалізації об'єкту.

Ні , перевірки там нема, але відкриває начебто.
Вибачте, дещо виявилось методом втика, справа в тому, що я в коді для ардуінки прописав на вихід дані з датчиків, через кому, але першим аргументом був таймінг, тобто кожні дві секунди ардуїнка видає в ком таку

2,1.36,4.51,-0.06,0.02,5.83

строку
де перший аргумент це час .
В коді це виглядає так

delay(2000);
time=time+2;// arduino ide це спрощений с++

і кожного разу , коли я зупиняв звязок(закривав ком і відкривав) відлік починався з нуля, хоча до цього я використовував інші бібліотеки і такого не було, через це я зробив неправильний висновок

6

(16 відповідей, залишених у C++)

Я про буфер ком порта

7

(16 відповідей, залишених у C++)

Доброго вечора, проблема із читанням з com порта, справа у тому, що коли і як би я не починав читати , читається з моменту запуску пристрою(наразі з ардуїнки), дуже багато перечитав, про роботу ком порта , та все одно не можу збагнути-якщо якісь дані зчитані, вони повинні знищуватись із буферу? то чому кожного разу я отримую все з початку?
Не допомагає і примусове очищення буферу

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{   char *buff=new char[50];
if (ComPort.m_bOpened)
{


 if(ComPort.ReadData(buff,50))
 {PurgeComm (ComPort.m_hIDComDev,PURGE_TXCLEAR);
 PurgeComm (ComPort.m_hIDComDev,PURGE_RXCLEAR);
 Memo1->Lines->Insert(0,AnsiString(buff));
 Memo1->GoToTextEnd();
 }

}
delete buff;
}

, та і де такий буфер на 100 мб, якщо ардуінка вже працює 5 годин?

8

(3 відповідей, залишених у C++)

koala написав:

Перевірку на що саме?

певно річ про if (n1){} та if (n2){}
але підручник і не відкривався

9

(6 відповідей, залишених у C++)

Дуже дякую, так

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if (ComPort.m_bOpened)
{
 char buff[50];
 if(ComPort.ReadData(buff,50))
 {PurgeComm (ComPort.m_hIDComDev,PURGE_RXABORT); }
 Memo1->Lines->Add(buff);

}
}

набагато краще, щодо

koala написав:

при перетворенні з char* на String стрічка буде обрізана по нульовому символу ('\0'), якщо такий зустрінеться.

, то мені не обов"язково прийняти все що іде з ком , тим більше що ардуінку я прописав теж на 2 сек і може не потрапити лише один запис
єдине, що трапляється мусорhttps://replace.org.ua/uploads/images/6602/ba46df2d15d35b4d77941f723ab643f1.png

10

(6 відповідей, залишених у C++)

Якщо дозволите, ще одне питання, щодо читання з ком порта.
Функція

int CSerial::ReadData( void *buffer, int limit )
{

    if( !m_bOpened || m_hIDComDev == NULL ) return( 0 );

    bool bReadStatus;
    DWORD dwBytesRead, dwErrorFlags;
    COMSTAT ComStat;

    ClearCommError( m_hIDComDev, &dwErrorFlags, &ComStat );
    if( !ComStat.cbInQue ) return( 0 );

    dwBytesRead = (DWORD) ComStat.cbInQue;
    if( limit < (int) dwBytesRead ) dwBytesRead = (DWORD) limit;

    bReadStatus = ReadFile( m_hIDComDev, buffer, dwBytesRead, &dwBytesRead, &m_OverlappedRead );
    if( !bReadStatus ){
        if( GetLastError() == ERROR_IO_PENDING ){
            WaitForSingleObject( m_OverlappedRead.hEvent, 2000 );
            return( (int) dwBytesRead );
            }
        return( 0 );
        }

    return( (int) dwBytesRead );

}

визов функції

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if (ComPort.m_bOpened)
{
 char *buff=new char;
 ComPort.ReadData(buff,500) ;
 Memo1->Lines->Add(buff);
}
}

таймер кожні 2 секунди зчитує, післе двох зчитувань eaccess violation

11

(6 відповідей, залишених у C++)

Але все одно , чомусь вилітає в момент звернення до функції, зробив простіше , переніс m_bOpened до public і звертаюсь до нього напряму, так начебто працює

12

(6 відповідей, залишених у C++)

Доброго всім здоров"я
Пишу на builder 10.4 community, треба реалізувати доступ до ком порта. Скопіпастив функції змережі, трохи відредагував
срр

CSerial::CSerial()
{

    memset( &m_OverlappedRead, 0, sizeof( OVERLAPPED ) );
     memset( &m_OverlappedWrite, 0, sizeof( OVERLAPPED ) );
    m_hIDComDev = NULL;
    m_bOpened = false;

}

CSerial::~CSerial()
{

    Close();

}

bool CSerial::Open(     wchar_t *szPort, int nBaud,int nDataBids,float nStopBits )
{

    if( m_bOpened ) return( TRUE );


    char szComParams[50];
    DCB dcb;


    m_hIDComDev = CreateFile( szPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL );
    if( m_hIDComDev == NULL ) return( FALSE );

    memset( &m_OverlappedRead, 0, sizeof( OVERLAPPED ) );
     memset( &m_OverlappedWrite, 0, sizeof( OVERLAPPED ) );

    COMMTIMEOUTS CommTimeOuts;
    CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF;
    CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
    CommTimeOuts.ReadTotalTimeoutConstant = 0;
    CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
    CommTimeOuts.WriteTotalTimeoutConstant = 5000;
    SetCommTimeouts( m_hIDComDev, &CommTimeOuts );



    m_OverlappedRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
    m_OverlappedWrite.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );

    dcb.DCBlength = sizeof( DCB );
    GetCommState( m_hIDComDev, &dcb );
    dcb.BaudRate = nBaud;
    dcb.ByteSize = nDataBids;
    dcb.StopBits = nStopBits;
    unsigned char ucSet;
    ucSet = (unsigned char) ( ( FC_RTSCTS & FC_DTRDSR ) != 0 );
    ucSet = (unsigned char) ( ( FC_RTSCTS & FC_RTSCTS ) != 0 );
    ucSet = (unsigned char) ( ( FC_RTSCTS & FC_XONXOFF ) != 0 );
    if( !SetCommState( m_hIDComDev, &dcb ) ||
        !SetupComm( m_hIDComDev, 10000, 10000 ) ||
        m_OverlappedRead.hEvent == NULL ||
        m_OverlappedWrite.hEvent == NULL ){
        DWORD dwError = GetLastError();
        if( m_OverlappedRead.hEvent != NULL ) CloseHandle( m_OverlappedRead.hEvent );
        if( m_OverlappedWrite.hEvent != NULL ) CloseHandle( m_OverlappedWrite.hEvent );
        CloseHandle( m_hIDComDev );
        return( FALSE );
        }

    m_bOpened = TRUE;

    return( m_bOpened );

}

.h

 #include <windows.h>

#ifndef __SERIAL_H__
#define __SERIAL_H__

#define FC_DTRDSR       0x01
#define FC_RTSCTS       0x02
#define FC_XONXOFF      0x04
#define ASCII_BEL       0x07
#define ASCII_BS        0x08
#define ASCII_LF        0x0A
#define ASCII_CR        0x0D
#define ASCII_XON       0x11
#define ASCII_XOFF      0x13

class CSerial
{

public:
    CSerial();
    ~CSerial();

    bool Open( wchar_t  *szPort, int nBaud = 9600,int nDataBids=8,float nStopBits=2 );
    bool Close( void );

    int ReadData( void *, int );
    int SendData( const char *, int );
    int ReadDataWaiting( void );

    bool IsOpened( void ){ return( m_bOpened ); }
    void GetComList(TStringList list);
    
    struct ComPort
{
    ComPort(LPSTR name, LPSTR key);
    ~ComPort();
    LPSTR name;
    LPSTR key;
};

protected:
    bool WriteCommByte( unsigned char );

    HANDLE m_hIDComDev;
    OVERLAPPED m_OverlappedRead, m_OverlappedWrite;
    bool m_bOpened;

};

#endif

та робота з ком портом , це подія. ComPort- обєкт CSerial , StopBitsCBox -комбобокс, LStatus- лейбл

void __fastcall TForm1::Button1Click(TObject *Sender)
{   ShowMessage(BoolToStr(ComPort.IsOpened));
 if(!ComPort.IsOpened)
{
   if(ComPort.Open(ComCBox->Selected->Text.c_str(),BaudCBox->Selected->Text.ToInt(),BitsCBox->Selected->Text.ToInt(),StopBitsCBox->Selected->Text.ToDouble()) )
   {  ShowMessage(BoolToStr(ComPort.IsOpened));
     LStatus->Text="CONNECTED";
     LStatus->TextSettings->FontColor=TAlphaColor(claBlue);
   } else{ShowMessage("Error Com don`t open");}
} else
{
  ComPort.Close();
     LStatus->Text="DISCONNECTED";
     LStatus->TextSettings->FontColor=TAlphaColor(claChocolate);
}

}

Справа в тому, що в конструкторі класу IsOpened одразу ж ініціалізується FALSE але код не виконується, якщо прибрати ! , то все навпаки код виконується, але все одно у функції ComPort.Open не міняється значення чому?

13

(11 відповідей, залишених у C++)

lucas-kane написав:
lucas-kane написав:

Для збірки тобі, ще знадобиться Python3 та https://catkin-tools.readthedocs.io/en/ … lling.html

Мушу вибачитись. Дав не той напрямок )). Catkin

P.S. Компенсую зібраними бібліотеками ))

Ваша lib не працює на комуніті, можливо це через те що потрібно збирати borland-овським компілятором

14

(11 відповідей, залишених у C++)

https://replace.org.ua/uploads/images/6602/ecb5adfaa1c9580d2a9112e29eb0e994.png
https://replace.org.ua/uploads/images/6602/f76380530c0ce053c1b00dabb0edc3d0.png

15

(10 відповідей, залишених у Електроніка)

Придбав енкодер, продавець обіцяв , що функціонально повинен підійти, але .....
https://www.youtube.com/watch?v=NFsDQeXZVE8


перепробував всі 9 варіантів підєднання, він або добавляє час або віднімає, ніяк в обидві сторони.Спеціально зняв відео з його поведінкою.
Чи може бути справа в особливостях енкодера, чи це все ж таки біда з керуючою платою?

16

(11 відповідей, залишених у C++)

lucas-kane написав:

Дав не той напрямок )). Catkin

А для вінди немає інструкції?

17

(11 відповідей, залишених у C++)

Прихований текст

Як виявилось треба ще встановити модуль GitPython https://www-codespeedy-com.translate.go … _tr_pto=scа для того щоб його встановити треба додати шлях до змінної середовищаhttps://ru.stackoverflow.com/questions/ … 0%BB%D0%B5

завантажив GitPython але не можу зрозуміти куди прописувати команди

18

(11 відповідей, залишених у C++)

lucas-kane написав:

Для збірки тобі, ще знадобиться Python3 та https://catkin-tools.readthedocs.io/en/ … lling.html

Ось шо мені видав Python

>>> $ git clone https://github.com/catkin/catkin_tools.git
  File "<stdin>", line 1
    $ git clone https://github.com/catkin/catkin_tools.git
    ^
SyntaxError: invalid syntax
>>>

19

(11 відповідей, залишених у C++)

Це якійсь грьобаний квест.... В мережі знайшов перелік причин через які виникає помилка , основна, немає ліб файлу. поліз у документацію, так треба перед використанням зібрати за допомогою cmake. Cmake не хоче компілювати через відсутність, або неможливість знайти catkin package що воно таке я й гадки не маю може допоможе хтось?

20

(11 відповідей, залишених у C++)

Знайшов бібліотеку Serial для роботи з ком портом, але лінкер її не хоче .....
мій код

//---------------------------------------------------------------------------
 #include<SysUtils.hpp>
#include <fmx.h>
#pragma hdrstop
#include <windows.h>
#include "Unit1.h"
#include "serial.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.fmx"
using std::string;
using std::vector;

TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{



    vector<serial::PortInfo> devices_found = serial::list_ports();

    vector<serial::PortInfo>::iterator iter = devices_found.begin();

    while( iter != devices_found.end() )
    {
        serial::PortInfo device = *iter++;
        AnsiString temp=AnsiString(device.port.c_str());

        ComCBox->Items->Add(temp);
    }


}
//---------------------------------------------------------------------------

P.S. бібліотека в архіві

Про всяк випадок там був конфлікт визначення typedef signed char int8_t із якимось хедером, я пройшовся по бібліотеці пошуком notepead++ і ніде не знайшов застосування цьому типу, тому просто закоментував