C++ Чтение файлового потока из терминала построчно с помощью только одной команды
Коротко: я хочу прочитать данные из терминала в переменную и сравнить ее со строкой.
Долго: я использую плату разработки TI AM3358 от GOEMBED, которая работает под управлением встроенного Linux. Я использую этот комплект для чтения данных из CANBUS. Для чтения данных из шины CAN в терминал я использую socketcan.
Когда я запускаю следующую команду в терминале, я получаю поток данных сообщений can от шины.
candump can0
Я написал некоторый код, который выполняет вышеуказанную команду и возвращает результат.
string GetCmdOutput(const char * cmd)
{
char buffer[128];
string result = "";
string different;
FILE* pipe = popen(cmd,"r");
int counter=0;
if(!pipe) throw runtime_error("popen() failed!");
try {
if(fgets(buffer,128,pipe) !=NULL){
while(counter<1){
result +=buffer;
counter++;
}
}
}catch(...){
pclose(pipe);
throw;
}
pclose(pipe);
return result;
}
В int main() я запускаю следующий код, который сравнивает вывод терминала со строкой:
string dump = "candump can0";
const char *senddump;
senddump = dump.c_str();
string newOutput;
int senddata = 0;
int i = 0;
int x = 0;
int amountS = 0;
int y = 0;
string datas;
while(i<1)
{
newOutput = GetCmdOutput(senddump);
cout<<newOutput + "\n";
if(newOutput==" can0 000 [2] 01 12\n")
{
canWrite(busn,baudrate, sendID, dlcn,data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7]);
}
}
Сам код работает, но я пропускаю много данных из canbus. Я думаю, что причина этого в том, что мне всегда нужно заново инициализировать canbus (cmd -> candump can0).
Теперь мой вопрос: как изменить мой код, который мне нужен только для запуска команды "candump can0", и что код всегда сравнивает следующие сообщения со строкой. Если это возможно, я думаю, что я получу уже много производительности.
Если у вас есть другие команды или другие опции для улучшения производительности, просьбы не стесняйтесь давать конструктивную критику. (Я не профессионал! Я стараюсь учиться)
/ EDIT 1 / Следующий поток данных показывает, как он выводится в терминал
can0 712 [1] 05
can0 192 [6] 1C 0F 19 00 00 00
can0 70B [1] 00
can0 70B [1] 85
can0 703 [1] 00
can0 707 [1] 00
can0 709 [1] 00
Заранее спасибо, С уважением, TMO
1 ответ
Если есть постоянный выход из candump
Вы можете просто передать вывод в вашу программу следующим образом:
$ candump can0 | myprogram
куда myprogram.cpp
выглядит примерно так:
#include <iostream>
#include <string>
int main()
{
std::string message;
while(std::getline(std::cin, message))
{
// process message here ... eg. ...
if(message == "can0 000 [2] 01 12")
{
// do something specific ...
}
}
}