Pobranie danych z pamięci kontrolera.

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

CP5200_Net_Read(BYTE* pBuf, int nSize);

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

, nie wiem jak sobie z tym dalej poradzić. Proszę o ewentualne porady. Pozdrawiam Jacek.
1

Ale jakie jest pytanie?

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

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); ```
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).

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

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

 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?

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.

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:

 [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
 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

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:

 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 0~100: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
 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:

            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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1