CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - 1wire/RS232 - Odczyt z czujnika DS18B20
Strona 1 z 2

1wire/RS232 - Odczyt z czujnika DS18B20

Nowy postNapisane: środa, 5 sierpnia 2015, 21:57
przez Yari27
Po długich poszukiwaniach znalazłem bibliotekę obsługującą odczyt temperatury z czujnika na stronie http://ds18b20.friko.pl/program.html lecz nie działa pod c++ builder xe2. Zacząłem poprawiać go pod c++ builder, ale nie wiem czy dobrze bo nigdy tego nie robiłem. Jest ktoś kto się orientuje w obsłudze tego czujnika i sprawdził by czy dobrze zacząłem poprawiać, oraz pomógł mi jeszcze z paroma błędami (6) o ile reszta jest dobrze?
► 


A może ktoś wie gdzie znaleźć gotową bibliotekę pod C++ builder?

Re: 1wire/RS232 - Odczyt z czujnika DS18B20

Nowy postNapisane: czwartek, 6 sierpnia 2015, 13:06
przez polymorphism
W sumie ten kod (piszę o oryginalnej wersji) powinien się skompilować w builderze. Nie zauważyłem tam nic nietypowego, co mogłoby powodować problemy.

Dodałbym w 1WireBus.h:
KOD cpp:     UKRYJ  
#pragma once
#include <windows.h>  // <--- to

...

Re: 1wire/RS232 - Odczyt z czujnika DS18B20

Nowy postNapisane: czwartek, 6 sierpnia 2015, 18:28
przez Yari27
Trochę lepiej, ale musiałem dołączyć
#include <stdio.h>
#include <vcl.h>
i konwertować char na wchar_t.

Zostały jeszcze 3 błędy :
[BCC32 Error] 1WireBus.cpp(795): E2034 Cannot convert 'int' to 'const TVarRec *'
Full parser context
1WireBus.cpp(787): parsing: UnicodeString C1WireBus::GetRomCode(int)
[BCC32 Error] 1WireBus.cpp(795): E2342 Type mismatch in parameter 'args' (wanted 'const TVarRec *', got 'unsigned char')
Full parser context
1WireBus.cpp(787): parsing: UnicodeString C1WireBus::GetRomCode(int)
[BCC32 Error] 1WireBus.cpp(795): E2226 Extra parameter in call
Full parser context
1WireBus.cpp(787): parsing: UnicodeString C1WireBus::GetRomCode(int)

odnoszące się do linii 795:
Kod: Zaznacz cały
code.Format("%02X%02X%02X%02X%02X%02X%02X%02X",rom[0],rom[1],rom[2],rom[3],rom[4],rom[5],rom[6],rom[7]);


jest jeszcze parę ostrzeżeń:
[BCC32 Warning] 1wirebus.h(38): W8058 Cannot create pre-compiled header: initialized data in header
[BCC32 Warning] 1WireBus.cpp(238): W8004 'found_sensors' is assigned a value that is never used
Full parser context
1WireBus.cpp(50): parsing: int C1WireBus::InitBus()
[BCC32 Warning] 1WireBus.cpp(423): W8066 Unreachable code
Full parser context
1WireBus.cpp(337): parsing: int C1WireBus::owNext(int,int)
[BCC32 Warning] 1WireBus.cpp(522): W8004 'ret' is assigned a value that is never used
Full parser context
1WireBus.cpp(484): parsing: int C1WireBus::TouchReset()
[BCC32 Warning] 1WireBus.cpp(797): W8004 'rom' is assigned a value that is never used
Full parser context
1WireBus.cpp(787): parsing: UnicodeString C1WireBus::GetRomCode(int)
[BCC32 Warning] 1WireBus.cpp(993): W8004 'x' is assigned a value that is never used
Full parser context
1WireBus.cpp(801): parsing: double C1WireBus::GetTemperature(int)

Re: 1wire/RS232 - Odczyt z czujnika DS18B20

Nowy postNapisane: czwartek, 6 sierpnia 2015, 18:35
przez polymorphism
A po co zmieniasz coś w tej klasie? Daj mi błędy z kompilacji oryginalnych źródeł (tylko dodaj tę drobną zmianę, o której pisałem wcześniej).

Re: 1wire/RS232 - Odczyt z czujnika DS18B20

Nowy postNapisane: czwartek, 6 sierpnia 2015, 18:59
przez Yari27
[BCC32 Error] 1wirebus.h(103): E2303 Type name expected
Full parser context
Unit1.cpp(5): #include 1wirebus.h
1wirebus.h(61): class C1WireBus
[BCC32 Error] 1wirebus.h(103): E2139 Declaration missing ;
Full parser context
Unit1.cpp(5): #include 1wirebus.h
1wirebus.h(61): class C1WireBus
[BCC32 Error] 1wirebus.h(105): E2293 ) expected
Full parser context
Unit1.cpp(5): #include 1wirebus.h
1wirebus.h(61): class C1WireBus
[BCC32 Warning] 1wirebus.h(35): W8058 Cannot create pre-compiled header: initialized data in header

Re: 1wire/RS232 - Odczyt z czujnika DS18B20

Nowy postNapisane: czwartek, 6 sierpnia 2015, 19:37
przez polymorphism
Przeoczyłem CStringa ;) Tu masz wersję z std::stringiem:
KOD cpp:     UKRYJ  
std::string C1WireBus::GetRomCode(int sensor)
{
        if(sensor < 1 || sensor > sensor_list.max) return "";
        else
        {
                unsigned char *rom = &sensor_list.roms[sensor * 8];
                char str[15];
               
                sprintf(str, "%02X%02X%02X%02X%02X%02X%02X%02X", rom[0],rom[1],rom[2],rom[3],rom[4],rom[5],rom[6],rom[7]);
                return str;
        }
}

double C1WireBus::GetTemperature(const std::string &rom_code)
{
        for(int i = 0; i < sensor_list.max; i++)
                if(GetRomCode(i) == rom_code) return GetTemperature(i);
               
        return TEMPERATURE_READ_FAILED;
}

Nagłówek odpowiednio popraw i załącz plik <string>.

Re: 1wire/RS232 - Odczyt z czujnika DS18B20

Nowy postNapisane: czwartek, 6 sierpnia 2015, 20:09
przez Yari27
Doszły nowe błędy:
► 


Bez tego jest trochę mniej, i tyczy się konwersji char na wchar_t
Kod: Zaznacz cały
#include "StdAfx.h"

► 

Re: 1wire/RS232 - Odczyt z czujnika DS18B20

Nowy postNapisane: czwartek, 6 sierpnia 2015, 20:20
przez polymorphism
StdAfx.h możesz wywalić, bo w builderze ten plik nie jest potrzebny.

Co do błędów. Musisz pokazać pliki po zmianie, bo nie wiem jak one teraz wyglądają.

Re: 1wire/RS232 - Odczyt z czujnika DS18B20

Nowy postNapisane: czwartek, 6 sierpnia 2015, 21:33
przez Yari27
Oto pliki:

Re: 1wire/RS232 - Odczyt z czujnika DS18B20

Nowy postNapisane: czwartek, 6 sierpnia 2015, 22:07
przez polymorphism
OK, sprawa prosta. Do wszystkich funkcji systemowych, przy których jest błąd, takich jak np. CreateFile czy MessageBox, dodaj na koniec ich nazw literę A (CreateFileA). Kompilujesz w trybie unikodowym, więc funkcje WinAPI oczekują łańcuchów unikodowych. Ktoś, kto pisał tę klasę, pisał pod archaiczne kodowanie ANSI, i stąd te problemy.

Re: 1wire/RS232 - Odczyt z czujnika DS18B20

Nowy postNapisane: czwartek, 6 sierpnia 2015, 22:55
przez Yari27
Ostatni błąd:
[BCC32 Error] 1WireBus.cpp(1082): E2316 'C1WireBus::GetTemperature(const std::string &)' is not a member of 'C1WireBus'


Dziwne, widzę tą funkcję w klasie C1WireBus

Re: 1wire/RS232 - Odczyt z czujnika DS18B20

Nowy postNapisane: piątek, 7 sierpnia 2015, 10:00
przez polymorphism
Zmieniles w pliku H deklaracje dwóch metod, które przerobiłem?

Re: 1wire/RS232 - Odczyt z czujnika DS18B20

Nowy postNapisane: piątek, 7 sierpnia 2015, 10:54
przez Yari27
Tak, CString zamieniłem na std::string.
Możesz zobaczyć w pliku który ostatnio wysłałem.

Re: 1wire/RS232 - Odczyt z czujnika DS18B20

Nowy postNapisane: piątek, 7 sierpnia 2015, 12:32
przez polymorphism
Zmieniać zmieniałeś, ale coś niedokładnie:
KOD cpp:     UKRYJ  
/* w H */
double GetTemperature(std::string rom_code);

/* w CPP */
double C1WireBus::GetTemperature(const std::string &rom_code) { ... }

Widzisz błąd?

Re: 1wire/RS232 - Odczyt z czujnika DS18B20

Nowy postNapisane: piątek, 7 sierpnia 2015, 17:24
przez Yari27
Wielkie dzięki za pomoc i chęci :D