Панель управления ЖК-дисплеем

  #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 части информации на экране, однако это не меняется, когда кнопка нажата, мне нужна помощь, чтобы попытаться сделать эту работу

-1

Решение

Это не дает прямого ответа на вопрос 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.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]