Cách xây dựng (concat) một chuỗi với số lượng lớn


7

mới đối với arduino Tôi đang vật lộn với vấn đề nghe có vẻ khá n00b ... Tôi đã kết nối một bảng GPS adafbean với Arduino của tôi và nó đang hoạt động khi nó truyền dữ liệu GPS đến cổng nối tiếp với Serial.print(GPS.latitude, DEC)

Bây giờ tôi muốn nối chuỗi mà tôi có thể xử lý (đọc: Tôi muốn gửi nó qua máy khách ethernet.) Đây là những gì tôi đã nhận được:

......
String vnnt = "$VNNT,";

if (GPS.fix) {
   vnnt += "GPS,";

   //this works:
   vnnt.concat(GPS.fix);

   //but this not:
   vnnt.concat(GPS.latitude);

}else{
   vnnt += "INFO,Acquiring Sats";
}

Serial.println(vnnt);

Thông báo lỗi là: Call of overloaded 'concat(float&)' is ambiguous Khi tôi Serial.print(GPS.latitude, DEC)kết quả là:4418.5937996050

Vì vậy, nó có thể là lớn hoặc một cái gì đó ...

Làm thế nào tôi có thể nối các vars và tạo chuỗi dài?


Không phải bạn đang thiếu một dấu chấm phẩy sao?
TheDoctor

và một người nói vnnttrong khi người khác nóivannut
TheDoctor

Xin lỗi một số typo :)
stUrb 20/03/2016

Bạn có biết kiểu dữ liệu của GPS.latitude? Ví dụ như là nó một float, intvv?
Peter Bloomfield

Tôi nghĩ đó là một cái phao? Nó nói float trong thông báo lỗi. Làm thế nào tôi có thể tìm ra? Có một var_dump hoặc một cái gì đó?
stUrb

Câu trả lời:


7

Hàm concat không triển khai phiên bản float, nhưng một số char, int, unsigns ...

unsigned char String::concat(long unsigned int)
unsigned char String::concat(unsigned int)
unsigned char String::concat(int)
...

vì vậy trình biên dịch không biết cách truyền (cắt có lẽ là float) thành số nguyên, vì có một số tùy chọn.

Trước tiên, bạn phải chuyển đổi float của bạn thành chuỗi, sử dụng dtostrf () hoặc sprintf () sau đó nối với chuỗi của bạn.

char outstr[25];
sprintf(outstr, "%f", GPS.latitude);

hoặc là

dtostrf(GPS.latitude, 6, 2, outstr);  //check docs for 6, 2 values, and set them for your needs

Và sau đó:

vnnt.concat(outstr)

Cũng lưu ý rằng sprintf rất tiện dụng để tạo chuỗi (char) nhỏ gọn:

char msg[80];
sprintf(msg, "$VNNT,GPS, %s %f", GPS.fix, GPS.latitude);

1
+1 khi nghi ngờ, sprintfnó hết :)
Madivad 20/03/2016

1
Một điểm cần thận trọng: sprintf()là một hàm phức tạp, do đó nó khá chậm và sử dụng khá nhiều bộ nhớ. Nói chung, tôi sẽ tránh nó cho mã "sản xuất" (chỉ giữ cho mục đích gỡ lỗi).
jfpoilpret

Đó là một điểm tốt @jfpoilpret, tôi đã không tính đến. Bạn có một số thứ tự về mức độ hiệu quả so với phiên bản dtostrf + concat không? Có áp dụng tương tự cho sscanf ()? (btw, bây giờ tôi nghi ngờ nếu sscanf () thực sự hoạt động tốt trong arduino)
drodri

Tôi đã không thực hiện các phép đo thực tế để so sánh cả hai cuộc gọi, nhưng tôi đoán người ta chỉ cần xem mã C và có thể kiểm tra lắp ráp được tạo. Về sscanf, IIRC nó có một số hạn chế (với số dấu phẩy động tôi nghĩ).
jfpoilpret
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.