Pobranie danych z pamięci kontrolera.

Pobranie danych z pamięci kontrolera.
SamuraiJack
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 10 lat
  • Postów:21
0

Witam. Programuje kontroler LED, dzięki któremu steruje tablicą podłączoną do kontrolera przez port RJ45.
Korzystając z instrukcji i dll'a dołączonego do sprzętu, chcę odczytać dane.
Model kontrolera to "C-Power5200", a dll to "CP5200.dll".
Próbuję odczytać dane kontrolera, ale nie mogę sobie poradzić z "buforem danych".

Chciałbym: -odebrać dane, -wyświetlić, -edytować i - zapisać w kontrolerze.
Do odczytania danych używam funkcji

Kopiuj
CP5200_Net_Read(BYTE* pBuf, int nSize);

, a do zapisania CP5200_Net_Write(const BYTE* pBuf, int nLength);

Kopiuj
, nie wiem jak sobie z tym dalej poradzić. Proszę o ewentualne porady. Pozdrawiam Jacek.
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:2 dni
1

Ale jakie jest pytanie?

Przy braku pytania, wymyślam je sobie; będzie nim: jak zadeklarować te funkcje w C#?

Kopiuj
void CP5200_Net_Read([Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)] byte[] pBuf, int nSize);
...
byte[] buf = new byte[100];
CP5200_Net_Read(buf, buf.Length);

```csharp void CP5200_Net_Write([In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)] byte[] pBuf, int nLength); ```
SamuraiJack
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 10 lat
  • Postów:21
0

Może pytania jako takiego nie było, ale stwierdziłem czego chciałbym dokonać ;)
Deklaracje funkcji ogarniam... na przykład:
Funkcja inicjująca połączenie ze sterownikiem (ip/port/id, timeout).

Kopiuj
CP5200.CP5200_Net_Init(3232235879, 5200, 4294967295, 600); 

Czy też funkcja wysyłająca tekst do tablicy.

Kopiuj
 CP5200.CP5200_Net_SendTagText(0, 1, Marshal.StringToHGlobalAnsi(textbox.Text), 0x01, 8, 5, 0, 5, 1);

W załączniku wycinek do manualna z funkcją read i write.
Jak zdeklarować pBuf, nLength oraz nSize?

Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:2 dni
0

Jak zdeklarować pBuf, nLength oraz nSize?
Przecież podałem przykład.
Dla read i write deklarujesz bufor tak samo.
Oczywiście dla write musisz sam go najpierw wypełnić danymi...

CP5200.CP5200_Net_SendTagText(0, 1, Marshal.StringToHGlobalAnsi(textbox.Text), 0x01, 8, 5, 0, 5, 1);

Pierwsza zasada marshallingu w C#: jak widzisz StringToHGlobalAnsi to prawie na pewno jest źle.
I tu jest źle, bo masz wyciek pamięci.
Ale nie podałeś jak ta funkcja wygląda w C.

edytowany 1x, ostatnio: Azarien
SamuraiJack
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 10 lat
  • Postów:21
0

1# Jeżeli chodzi o wszystkie funkcje, to mam je w osobnym pliku .cs, do których się odwołuje.
Dla funkcji Net_SendText coś takiego:

Kopiuj
 [DllImport(m_strPath, CharSet = CharSet.Auto)]
 public static extern int CP5200_Net_SendText(int nCardID, int nWndNo, IntPtr pText, int crColor, int nFontSize, int nSpeed, int nEffect, int nStayTime, int nAlignment); 

W takim razie, jak zdefiniować IntPtr pText aby nie było wycieków pamięci?

2# Używając funkcji Net_read w buforze (buf) otrzymuję wartość** System.Byte[]**.

  • sterownik z tablicą jest podłączony
  • chwilę przed próbą pobrania danych łącze się używając funkcji
Kopiuj
 CP5200_Net_Init(DWORD dwIP, int nIPPort, DWORD dwIDCode, int nTimeOut);

połączenie na 100% poprawne, bo już testowałem przy wysyłaniu tekstu do matrycy led.

3# Na chińskim forum znalazłem coś takiego, może to będzie pomocne?
http://www.cnblogs.com/chenzuoyou/p/3143580.html
http://www.cnblogs.com/chenzuoyou/archive/2013/06/13/3133444.html

edytowany 1x, ostatnio: SamuraiJack
Azarien
pokaż to SendText w C, nie w C#.
SamuraiJack
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 10 lat
  • Postów:21
0

Tworzę program w C#, wiec nie bardzo wiem jak to będzie wyglądało w C... Mogę jedynie podesłać wpis z manuala:

Kopiuj
 int CP5200_Net_SendText(int nCardID, int nWndNo, const char *pText, COLORREF crColor, int nFontSize, int nSpeed, int nEffect, int nStayTime, int nAlignment);
Description	Send text to special window
Parameter	nCardID: Controller ID
	        nWndNo: Window sequence number, valid values 0 to 7
	        pText: The text will to be sent
	        crColor: Text color。
	        nFontSize: font size and style,see 1.7. Font size code and font style
	        nSpeed: Effect speed 0100:The fastest value of 0。 
	        nEffect: Show effect。See the "1.5" section.
         	nStayTime: Stay time in second

A przechodząc do rzeczy...

SamuraiJack napisał(a):

2# Używając funkcji Net_read w buforze (buf) otrzymuję wartość** System.Byte[]**.

  • sterownik z tablicą jest podłączony
  • chwilę przed próbą pobrania danych łącze się używając funkcji
Kopiuj
 CP5200_Net_Init(DWORD dwIP, int nIPPort, DWORD dwIDCode, int nTimeOut);

połączenie na 100% poprawne, bo już testowałem przy wysyłaniu tekstu do matrycy led.

3# Na chińskim forum znalazłem coś takiego, może to będzie pomocne?
http://www.cnblogs.com/chenzuoyou/p/3143580.html
http://www.cnblogs.com/chenzuoyou/archive/2013/06/13/3133444.html

EDIT
Korzystając z moich powyższych linków, zdziałałem coś takiego:

Kopiuj
            object obj;
            int nData;
            int RozmiarBufora = 500;
            obj = CP5200.CP5200_CommData_Create(1, 0, 4294967295); // tworze obiekt połączenia
            byte[] bufor = new byte[500]; //buffor 
            nData = CP5200.CP5200_MakeWriteBrightnessData(obj, bufor, RozmiarBufora, 10); //Póki co zmiana jasności, zeby widziec czy cos sie dzieje
            CP5200.CP5200_Net_Init(0xc0a801de, 5200, dwIDCode, 600); // inicjalizacja połaczenia
            // CP5200.CP5200_Net_Connect();
            CP5200.CP5200_Net_Write(bufor, nData); //Zapis?

           CP5200.CP5200_Net_Read(bufor, bufor.Length); //Odczyt
            test.Text = Convert.ToString(bufor);// Sprawdzam czy cos jest w buforze 

Po skompilowaniu, wyświetla mi się błądNastąpiła próba odczytu lub zapisu pamięci chronionej. Często wskazuje to, że inna pamięć jest uszkodzona.

edytowany 1x, ostatnio: SamuraiJack
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)