Hi,
ich arbeite momentan an einem kleinen Projekt und stehe momentan vor
folgendem Problem:
Zuerst:
Ich verwende den Controller AT32UC3C1512C. Software am PC wäre
hierfür AtmelStudio 6.1, sowie Visual Studio 2013.
Mein Ziel:
Ich will per USB daten zwischen uC und der PC-Software schicken.
Dem uC will ich einen String zuschicken(aus Visual Studio). In diesem
String befindet sich ein "status" und die anschließend zu verarbeiteten
"daten".
Hier kurz ein Einblick in die main-Funktion des uC:
wobei LPT_D/LTD_C/LPT_S per #define festgelegt wurden.
1 | //status = recvDATA[0]
|
2 | //data = recvDATA[1]
|
3 | switch(recvDATA[0]){
|
4 |
|
5 | case LPT_D:
|
6 |
|
7 | if(recvDATA[1] & 0x80){
|
8 | gpio_set_pin_high(D7);
|
9 | }
|
10 | else{
|
11 | gpio_set_pin_low(D7);
|
12 | }
|
13 | if(recvDATA[1] & 0x40){
|
14 | gpio_set_pin_high(D6);
|
15 | }
|
16 | else{
|
17 | gpio_set_pin_low(D6);
|
18 | }
|
19 |
|
20 | //usw.
|
21 | break;
|
22 | case LPT_C:
|
23 |
|
24 | if(recvDATA[1] & 0x08){
|
25 | gpio_set_pin_high(C3);
|
26 | }
|
27 | else{ gpio_set_pin_low(C3); }
|
28 | //usw
|
29 | break;
|
30 |
|
31 | case LPT_S:
|
32 | sendDATA = gpio_get_pin_value(S3)*128;
|
33 | sendDATA += gpio_get_pin_value(S3)*64;
|
34 | //usw
|
35 | sendUSBdata(sendDATA);
|
36 | break;
|
37 | }
|
wie man sieht, ist es für mich wichtig, das man die erhaltenen Daten im
uC einzeln zuweisen kann (recvDATA[0], recvDATA[1]).
Problem:
Ich habe leider keine Ahnung, wie ich gesendete Strings auslesen kann
und scheinbar auch keine, um welche zu senden. Der uC wird als COM4-Port
erkannt und ansich werden daten gesendet, nur sind diese komplett
daneben. Wenn ich zum Test eine "10" vom uC zum PC schicken will, kommt
am PC random Zahlen raus, die weit von der eigentlichen Zahl abweichen.
Funktion zum senden: uC -> PC
1 | void sendUSBdata(Byte *dat){
|
2 | //Wenn sendebereit
|
3 | if(udi_cdc_is_tx_ready()){
|
4 | //sende dat
|
5 | udi_cdc_putc(*dat);
|
Da sendDATA eigentlich nur eine int Zahl ist, habe ich das ganze auch
mit int anstatt Byte versucht, was denoch nicht richtig war.
Habe auch zum Test mal folgendes probiert gehabt:
1 | void sendUSBdata(Byte *dat){
|
2 | //Wenn sendebereit
|
3 | if(udi_cdc_is_tx_ready()){
|
4 | sprintf(str, "|%d|", dat);
|
5 | //sende dat
|
6 | udi_cdc_putc(str);
|
und in VisualStudio dann nach den Strichen gesucht und ausgegeben -
funktionierte auch nicht wie gedacht.
Funktion zum empfangen: PC -> uC
1 | int recvUSBdata(){
|
2 | char *token;
|
3 | char str[100];
|
4 | int i;
|
5 |
|
6 | //checks if a character has been received on the CDC line.
|
7 | if(udi_cdc_is_rx_ready()){
|
8 | str = udi_cdc_getc();
|
9 | token = strtok (str, "|"); //unterteile string in einzelne tokens zwischen | |
|
10 |
|
11 | while (token != NULL, i++){
|
12 | recv_DATA[i] = token; // i=0 ->status; i=1 ->data;
|
13 | token = strtok (NULL, "|");
|
14 | }
|
15 | return recv_DATA;
|
16 | }
|
Das war so meien Grundidee, das ich den ankommenden String in Tokens
aufteile und so die einzelnen Werte bekomme. In VisualStudio habe ich
dementsprechend auch sprintf(str,"|%d|%d|", status,data) gesendet.
Problem dabei war es, dass udi_cdc_getc(); scheinbar nur int ausgibt.
Gibt es hierfür eine Funktion, die die gesendeten Daten als String
ausgibt?
Ich hoffe ich könnt mein Problem einigermaßen verstehen und mir evtl.
Tipps geben. Ich steck auch gerade gedanklich in diesem Schema fest und
bekomme es gerade nicht hin umzudenken. Vielleicht geht es ja auch viel
einfacher.