2012-02-04 67 views
1

將字符串數組轉換爲無符號長字符時遇到了一些問題。 這是我對executeCommand()的輸入。將字符串轉換爲無符號長問題

0001000118218; 326

這就是我回來的。

接收到的命令:0001000118218; 326

發送代碼:1821

發射時段:32

我不明白爲什麼最後一位被丟棄......

#define id_length 4 
#define command_length 4 
const String my_id = "0001"; 
//Command execution methods 
void executeCommand(String inputData) { 
    if(!my_id.equals(inputData.substring(0, id_length))) { 
    return; 
    } 

    Serial.print("Received command: "); 
    Serial.println(inputData); 
    String command = inputData.substring(id_length, id_length + command_length); 
    String parameters = inputData.substring(id_length + command_length); 


    for (int i = 0; i < 3; i++) { 
    if(command == "0001") { //RF power command 
    unsigned long rfid_long; 
    unsigned long periodid_long; 
    char rfid[parameters.indexOf(';')]; 
    char periodid[3]; 
    parameters.substring(0, parameters.indexOf(';')).toCharArray(rfid, parameters.indexOf(';')); 
    parameters.substring(parameters.indexOf(';') + 1).toCharArray(periodid, 3); 
    rfid_long = strtoul(rfid, NULL, 10); 
    periodid_long = strtoul(periodid, NULL, 10); 
    sendRF(rfid_long, periodid_long); 
    } 
    else { 
    Serial.println("Unknown command received"); 
    } 
    delay(10); 
    } 
} 

void sendRF(unsigned long transmitCode, unsigned int transmitPeriod) { 
//digitalWrite(transmitLedPin, HIGH); 
Serial.print("transmit code: "); 
Serial.println(transmitCode); 
Serial.print("transmit period: "); 
Serial.println(transmitPeriod); 
RemoteSwitch::sendTelegram(generateTelegram(transmitCode, transmitPeriod), rfSubmitPin); 
//digitalWrite(transmitLedPin, LOW); 
} 
+0

這也不是C. – Eregrith 2012-02-04 21:58:20

+0

*這是什麼語言? C,C#和Java之間的混合使用奇怪的縮進標準。 – 2012-02-04 22:44:17

回答

2
char periodid[3]; 

應該是char periodid[4]如果你想擁有一串長度3;內容爲3個元素,零終止符爲1。

你也必須改變toCharArray(periodid, 3);toCharArray(periodid, 4);或更好,toCharArray(periodid, sizeof(periodid));

+0

謝謝你!這工作就像一個魅力! – NightWalker 2012-02-04 22:47:45

1

如果轉換命令字符數組和使用,和strchr什麼?

char* separator = strchr(command, ';'); 
if (separator == NULL) return; 

char* rfid = command + id_length; 
char* periodid = separator + 1; 

unsigned long rfid_long = strtoul(rfid, &separator, 10); 
unsigned long periodid_long = strtoul(periodid, NULL, 10);