#include "mbed.h"#include "C12832_lcd.h"#include<cstring>
#include<string>
#include<sstream>
C12832_LCD lcd;//creating LCD object
Serial s_comms(USBTX, USBRX);//creating a serial comms object
DigitalIn Button(p14);//using button to change pagesint main()
{
char str[100] = "$GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A";
char*point;
point = strtok(str, ",");
int page_state = 0;
for (int i = 0; point != NULL; i++){//time
if (i == 1 and page_state == 0){
//using substrings to extract time elements
string time = point;
string hrs = time.substr(0, 2);
string mins = time.substr(2, 2);
string sec = time.substr(4, 2);
//using string streams to reformat time string
ostringstream tim;
tim << hrs << ":" << mins << ":" << sec;
time = tim.str();
lcd.cls();
lcd.locate(0, 1);
lcd.printf("%s\n", time.c_str());
}
//date
if (i == 9 and page_state == 0){
string date = point;
string day = date.substr(0, 2);
string month = date.substr(2, 2);
string year = date.substr(4, 2);
//Converting the numerical month into abbreviation ect.
if (month == "03"){
month = "Mar";
}
if (month == "04"){
month = "Apr";
}
ostringstream dat;
dat << day << "-" << month << "-20" << year;
date = dat.str();
lcd.locate(0, 9);
lcd.printf("%s\n", date.c_str());
}
//latitude
if (i == 3 and page_state == 0){
string lati = point;
string lati_deg = lati.substr(0, 2);
string sml_latideg = lati.substr(2, 6);
ostringstream lat;
lat << "Lat: " << lati_deg << " deg " << sml_latideg << "'";
lati = lat.str();
lcd.locate(0, 18);
lcd.printf("%s", lati.c_str());
}//latitude direction (N or S)
if (i == 4 and page_state == 0){
string lat_dir = point;
lcd.printf("%s\n", lat_dir.c_str());
}
point = strtok(NULL, ",");
}//Change page
if (Button == 1){
page_state = !page_state;//toggle page state
wait(0.2);//debounce timer
lcd.cls();
}//second page
for (int j = 0; point != NULL; j++){
char str[100] ="$GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A";
char*point;
point = strtok(str, ",");
//longitude
if (j == 5 and page_state == 1){
string lngi = point;
string lngi_deg = lngi.substr(0, 2);
string sml_lngideg = lngi.substr(2, 6);
ostringstream lng;
lng << "Lng: " << lngi_deg << " deg " << sml_lngideg << "'";
lngi = lng.str();
lcd.locate(0, 1);
lcd.printf("%s", lngi.c_str());
}
//longitude direction (E or W)
if (j == 6 and page_state == 1){
string lng_dir = point;
lcd.printf("%s\n", lng_dir.c_str());
}
//speed
if (j == 7 and page_state == 1){
string speed = point;
ostringstream spd;
spd << "Speed: " << speed;
speed = spd.str();
lcd.locate(0, 9);
lcd.printf("%s\n", speed.c_str());
}
point = strtok(NULL, ",");
}return 0;
}
привет, пытаясь получить встроенную кнопку на панели приложений mbed, чтобы я мог очистить экран и поместить новую информацию, кнопка в настоящее время ничего не делает, я получаю первые 4 части информации на экране, однако это не меняется, когда кнопка нажата, мне нужна помощь, чтобы попытаться сделать эту работу
Это не дает прямого ответа на вопрос OP, но это должно быть более полезным в долгосрочной перспективе. Вместо того, чтобы пытаться отлаживать логику программы в ограниченной среде, часто полезно заменить функциональные возможности платформы на функции и классы, которые позволяют моделировать платформу на вычислительном оборудовании общего назначения без изменения кода.
Добавляя
#include <cstdarg>
#include <iostream>
и подделка C12832_lcd.h
#pragma once
#include <cstdarg>
#include <iostream>
// Sim LCD class. Just writes LCD commands to console
class C12832_LCD
{
public:
void cls()
{
std::cout << "LCD: Cleared" << std::endl;
}
void locate(int row, int col)
{
std::cout << "LCD: positioned " << row << "," << col << std::endl;
}
void printf(const char * fmt, ...)
{
char buffer[4096];
va_list args;
va_start(args, fmt);
vsnprintf(buffer, sizeof(buffer), fmt, args);
std::cout << buffer << std::endl;
va_end(args);
}
};
И фиктивный мбед.ч
#pragma once
// Sim DigitalIn class. Toggles true and false on the button. First call will be true
class DigitalIn
{
private:
bool mVal;
public:
DigitalIn(int): mVal(false)
{
}
bool operator==(int)
{
mVal = !mVal;
return mVal;
}
};
//Sim serial Does nothing yet.
class Serial
{
public:
Serial(int, int)
{
}
};
//sim wait. We don't need to wait in simulation, so does nothing.
void wait(double)
{
}
const int p14 = 14;
const int USBTX = 0;
const int USBRX = 0;
к коду OP, теперь я могу скомпилировать и запустить на рабочем столе в Visual Studio IDE и бросить огромную мощь отладчика на проблему. Шаги по коду быстро выявляют первую из двух логических ошибок. Второй немного более тонкий. Следите за своей областью.
Быстрая рекомендация:
Вместо того, чтобы использовать strtok
, рассмотреть возможность использования std::getline
перегрузка, которая принимает разделитель символов. Это позволяет
std::stringstream stream(str);
std::string token;
while (std::getline(stream, token, ','))
{
// do stuff
}
читать через запятую поток ввода как строку NMEA.
Других решений пока нет …