lcd2usb - testapp - nie chce się kompilować?

lcd2usb - testapp - nie chce się kompilować?
TO
  • Rejestracja:prawie 18 lat
  • Ostatnio:około 10 lat
0

Witam

Otóż chcę skompilować sobie aplikację testową do LCD2USB napisaną w języku C.
Żródło ze strony: http://ptm2.cc.utu.fi/ptmusta/lcd2usb/lcd2usb2.c

Kopiuj
/*
 * lcd2usb.c - test application for the lcd2usb interface
 *             http://www.harbaum.org/till/lcd2usb
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <usb.h>

/* vendor and product id */
#define LCD2USB_VID  0x0403
#define LCD2USB_PID  0xc630

/* target is a bit map for CMD/DATA */
#define LCD_CTRL_0         (1<<3)
#define LCD_CTRL_1         (1<<4)
#define LCD_BOTH           (LCD_CTRL_0 | LCD_CTRL_1)

#define LCD_ECHO           (0<<5)
#define LCD_CMD            (1<<5)
#define LCD_DATA           (2<<5)
#define LCD_SET            (3<<5)
#define LCD_GET            (4<<5)

/* target is value to set */
#define LCD_SET_CONTRAST   (LCD_SET | (0<<3))
#define LCD_SET_BRIGHTNESS (LCD_SET | (1<<3))
#define LCD_SET_RESERVED0  (LCD_SET | (2<<3))
#define LCD_SET_RESERVED1  (LCD_SET | (3<<3))

/* target is value to get */
#define LCD_GET_FWVER      (LCD_GET | (0<<3))
#define LCD_GET_KEYS       (LCD_GET | (1<<3))
#define LCD_GET_CTRL       (LCD_GET | (2<<3))
#define LCD_GET_RESERVED1  (LCD_GET | (3<<3))

#ifdef WIN
#include <windows.h>
#include <winbase.h>
#define MSLEEP(a) Sleep(a)
#else
#define MSLEEP(a) usleep(a*1000)
#endif

const char msg[] = 
  "                "
  "The quick brown fox jumps over the lazy dogs back ..."
  "                ";

usb_dev_handle      *handle = NULL;

int lcd_send(int request, int value, int index) {
  if(usb_control_msg(handle, USB_TYPE_VENDOR, request, 
		      value, index, NULL, 0, 1000) < 0) {
    fprintf(stderr, "USB request failed!");
    return -1;
  }
  return 0;
}

/* to increase performance, a little buffer is being used to */
/* collect command bytes of the same type before transmitting them */
#define BUFFER_MAX_CMD 4        /* current protocol supports up to 4 bytes */
int buffer_current_type = -1;   /* nothing in buffer yet */
int buffer_current_fill = 0;    /* -"- */
unsigned char buffer[BUFFER_MAX_CMD];

/* command format:
 * 7 6 5 4 3 2 1 0
 * C C C T T R L L
 *
 * TT = target bit map
 * R = reserved for future use, set to 0
 * LL = number of bytes in transfer - 1
 */

/* flush command queue due to buffer overflow / content */
/* change or due to explicit request */
void lcd_flush(void) {
  int request, value, index;
  
  /* anything to flush? ignore request if not */
  if (buffer_current_type == -1)
    return;
  
  /* build request byte */
  request = buffer_current_type | (buffer_current_fill - 1);
  
  /* fill value and index with buffer contents. endianess should IMHO not */
  /* be a problem, since usb_control_msg() will handle this. */
  value = buffer[0] | (buffer[1] << 8);
  index = buffer[2] | (buffer[3] << 8);
  
  /* send current buffer contents */
  lcd_send(request, value, index);
  
  /* buffer is now free again */
  buffer_current_type = -1;
  buffer_current_fill = 0;
}

/* enqueue a command into the buffer */
void lcd_enqueue(int command_type, int value) {
  if ((buffer_current_type >= 0) && (buffer_current_type != command_type))
    lcd_flush();
  
  /* add new item to buffer */
  buffer_current_type = command_type;
  buffer[buffer_current_fill++] = value;
  
  /* flush buffer if it's full */
  if (buffer_current_fill == BUFFER_MAX_CMD)
    lcd_flush();
}

/* see HD44780 datasheet for a command description */
void lcd_command(const unsigned char ctrl, const unsigned char cmd) {
  lcd_enqueue(LCD_CMD | ctrl, cmd);
}

/* clear display */
void lcd_clear(void) {
  lcd_command(LCD_BOTH, 0x01);    /* clear display */
  lcd_command(LCD_BOTH, 0x03);    /* return home */
}

/* home display */
void lcd_home(void) {
  lcd_command(LCD_BOTH, 0x03);    /* return home */
}

/* write a data string to the first display */
void lcd_write(const char *data) {
  int ctrl = LCD_CTRL_0;
  
  while(*data) 
    lcd_enqueue(LCD_DATA | ctrl, *data++);
  
  lcd_flush();
}

/* send a number of 16 bit words to the lcd2usb interface */
/* and verify that they are correctly returned by the echo */
/* command. This may be used to check the reliability of */
/* the usb interfacing */
#define ECHO_NUM 100
void lcd_echo(void) {

  int i, nBytes, errors=0;
  unsigned short val, ret;

  for(i=0;i<ECHO_NUM;i++) {
    val = rand() & 0xffff;
    
    nBytes = usb_control_msg(handle, 
	   USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN, 
	   LCD_ECHO, val, 0, (char*)&ret, sizeof(ret), 1000);

    if(nBytes < 0) {
      fprintf(stderr, "USB request failed!");
      return;
    }

    if(val != ret)
      errors++;
  }

  if(errors) 
    fprintf(stderr, "ERROR: %d out of %d echo transfers failed!\n", 
	    errors, ECHO_NUM);
  else 
    printf("Echo test successful!\n");
}

/* get a value from the lcd2usb interface */
int lcd_get(unsigned char cmd) {
  unsigned char       buffer[2];
  int                 nBytes;

  /* send control request and accept return value */
  nBytes = usb_control_msg(handle, 
	   USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN, 
	   cmd, 0, 0, (char *)buffer, sizeof(buffer), 1000);

  if(nBytes < 0) {
    fprintf(stderr, "USB request failed!");
    return -1;
  }

  return buffer[0] + 256*buffer[1];
}

/* get lcd2usb interface firmware version */
void lcd_get_version(void) {
  int ver = lcd_get(LCD_GET_FWVER);

  if(ver != -1) 
    printf("Firmware version %d.%d\n", ver&0xff, ver>>8);
}

/* get the bit mask of installed LCD controllers (0 = no */
/* lcd found, 1 = single controller display, 3 = dual */
/* controller display */
void lcd_get_controller(void) {
  int ctrl = lcd_get(LCD_GET_CTRL);

  if(ctrl != -1) {
    if(ctrl)
      printf("Installed controllers: %s%s\n", 
	     (ctrl&1)?"CTRL0":"",
	     (ctrl&2)?" CTRL1":"");
    else
      printf("No controllers installed!\n");
  }
}

/* get state of the two optional buttons */
void lcd_get_keys(void) {
  int keymask = lcd_get(LCD_GET_KEYS);

  if(keymask != -1) 
    printf("Keys: 0:%s 1:%s\n",
	   (keymask&1)?"on":"off",
	   (keymask&2)?"on":"off");
}

/* set a value in the LCD interface */
void lcd_set(unsigned char cmd, int value) {
  if(usb_control_msg(handle, 
	     USB_TYPE_VENDOR, cmd, value, 0, 
	     NULL, 0, 1000) < 0) {
    fprintf(stderr, "USB request failed!");
  }
}

/* set contrast to a value between 0 and 255. Result depends */
/* display type */
void lcd_set_contrast(int value) {
  lcd_set(LCD_SET_CONTRAST, value);
}

/* set backlight brightness to a value between 0 (off) anf 255 */
void lcd_set_brightness(int value) {
  lcd_set(LCD_SET_BRIGHTNESS, value);
}

int main(int argc, char *argv[]) {
  struct usb_bus      *bus;
  struct usb_device   *dev;
  int i;
  
  printf("--      LCD2USB test application       --\n");
  printf("--      (c) 2006 by Till Harbaum       --\n");
  printf("-- http://www.harbaum.org/till/lcd2usb --\n");

  usb_init();
  
  usb_find_busses();
  usb_find_devices();
  
  for(bus = usb_get_busses(); bus; bus = bus->next) {
    for(dev = bus->devices; dev; dev = dev->next) {
      if((dev->descriptor.idVendor == LCD2USB_VID) && 
	 (dev->descriptor.idProduct == LCD2USB_PID)) {
	
	printf("Found LCD2USB device on bus %s device %s.\n", 
	       bus->dirname, dev->filename);
	
	/* open device */
	if(!(handle = usb_open(dev))) 
	  fprintf(stderr, "Error: Cannot open USB device: %s\n", 
		  usb_strerror());

	break;
      }
    }
  }
  
  if(!handle) {
    fprintf(stderr, "Error: Could not find LCD2USB device\n");

#ifdef WIN
    printf("Press return to quit\n");
    getchar();
#endif

    exit(-1);
  }

  /* make lcd interface return some bytes to */
  /* test transfer reliability */
  lcd_echo();

  /* read some values from adaptor */
  lcd_get_version();
  lcd_get_controller();
  lcd_get_keys();

  /* adjust contrast and brightess */
  lcd_set_contrast(200);
  lcd_set_brightness(255);

  /* clear display */
  lcd_clear();

  /* write something on the screen */
  for(i=0;i<strlen(msg)-15;i++) {
    char tmp_str[17];
    strncpy(tmp_str, msg+i, 16);  /* copy 16 chars */
    tmp_str[16] = 0;              /* terminate string */

    /* write string to display */
    lcd_home();
    lcd_write(tmp_str);

    MSLEEP(100);
  }

  /* have some fun with the brightness */
  for(i=255;i>=0;i--) {
    lcd_set_brightness(i);
    MSLEEP(10);
  }

  lcd_clear();
  lcd_write("Bye bye!!!");
  
  for(i=0;i<=255;i++) {
    lcd_set_brightness(i);
    MSLEEP(10);
  }

  usb_close(handle);

#ifdef WIN
  printf("Press return to quit\n");
  getchar();
#endif

  return 0;
}

Problem pojawia się w linii 52 - usb_dev_handle *handle = NULL;

Z innych problemów, to brak deklaracji USB_TYPE_VENDOR w kilku liniach, ale to zapewne z braku jakiegoś dodatkowego pliku.

Nie mam pomysłu, jak sobie z tym poradzić.
Czegoś brakuje? Może ktoś źle wkleił kod źródłowy? (nie sądzę...)
Może środowisko i kompilator nie taki co trzeba?


...bo chcieć to móc.
Westen
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 5 lat
0

Nie wiem czego ty tu nie rozmiesz.

Przecież sam sobie wypisałeś przyczynę problemu

Nie czytając nawet całego pliku można stwierdzić , że *handle masz ustawiony na NULL i tu jest problem.

TO
  • Rejestracja:prawie 18 lat
  • Ostatnio:około 10 lat
0

Ok, wypisałem, ale to nie świadczy że wiem czemu wywala błąd:

main.c:52 unknown type name 'usb_dev_handle'

podobnie jest z

main.c:301 'USB_ENDPOINT_IN' undeclared (first use in this function)
main.c:327 'USB_TYPE_VENDOR' undeclared (first use in this function)

i kilka innych... :/

Googlowałem i nie wiele mądrych rozwiązań znalazłem albo nie wiedziałem, że To co znalazłem to jest właśnie to. Jeśli chodzi o język C nie jestem tak obryty w nim jak Wy (w sumie to dopiero zaczynam). Dlatego proszę o pomoc Was, ludzi mądrzejszych i bardziej doświadczonych w tej dziedzinie.


...bo chcieć to móc.
Westen
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 5 lat
0
toshiaczek napisał(a):

Ok, wypisałem, ale to nie świadczy że wiem czemu wywala błąd:

main.c:52 unknown type name 'usb_dev_handle'

main.c:301 'USB_ENDPOINT_IN' undeclared (first use in this function)
main.c:327 'USB_TYPE_VENDOR' undeclared (first use in this function)

  1. unknow type name ( podstawy angielskiego ) znaczy , że kompilator nie zna takiego typu jak "usb_dev_handle"
  2. USB_ENDPOINT_IN i USB_TYPE_VENDOR nie są zadeklarowane

Jeśli nie jesteś "obyty" to dział dla "nieobytych" jest wyżej. Poczytaj sobie jakikolwiek kurs języka c dopiero potem pytaj.

Przepierdlasz na żywca kod z internetu bez jakiejkolwiek znajomości języka i dziwisz się , że ci nie działa.

edytowany 1x, ostatnio: Westen
TO
  • Rejestracja:prawie 18 lat
  • Ostatnio:około 10 lat
0

Owszem, [CIACH!] na żywca, bo powinien działać od strzału. Ale są problemy z pkt, których nie rozumiem.

Ad 1. Dla mnie to wygląda jakby brakło czegoś przed tą linią i dlatego nie wie co to jest to całe "usb_dev_handle". Na pewno nikt nie zjadł kilku linijek, bo wszędzie ten kod wygląda identycznie.

Ad 2. Wiem, że brak definicji kilku rzeczy, ale właściwie to dlaczego ich nie ma, jak powinny być. Wszystkie 4 pliki są includowane, więc powinno być w porządku. A nie jest.

Nie chcę prosić Cię o gotowca, bo raczej go nie dostanę (i nawet się nie łudzę, że tak będzie), ale proszę konkretne sugestie na co zwrócić uwagę i czym się zainteresować, tak, żeby ten (dla Ciebie banalny) problem rozwiązać. Chętnie odwdzięczę się dobrym piwkiem za pomoc w rozwiązaniu problemu :)


...bo chcieć to móc.
edytowany 1x, ostatnio: Ktos
TO
  • Rejestracja:prawie 18 lat
  • Ostatnio:około 10 lat
0

Dzięki za pomoc, ale udało mi się już rozwiązać problem :D

okazało się, że miałem po prostu zły plik usb.h :D


...bo chcieć to móc.
edytowany 1x, ostatnio: toshiaczek
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)