Я хотел бы попросить совета. Я пытаюсь прочитать данные из системы canbus. Для этого я кросс-скомпилировал код на Ubuntu 12.04.
Что я пытаюсь сделать:
Таким образом, на CANBUS я подключил датчик CANopen. Пока этот датчик непрерывно отправляет данные в мою встроенную систему, мне нужно считывать настройки с датчика. Для чтения и записи этих настроек я использую socketCAN.
Поэтому я попробовал следующее:
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <sstream>
#include <iostream>
#include <stdlib.h>
#include <stdexcept>
#include <stdio.h>
#include <string>
using namespace std;
string IntToString(int number)
{
stringstream temp;
temp<<number;
return temp.str();
}
string IntToHex(int data)
{
stringstream ss;
int sli;
ss<< std::hex << data;
string sdat = ss.str();
sli= sdat.length();
switch(sli){
case 1: sdat = "0" + sdat; break;
default: sdat = sdat;
}
return sdat;
}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;
}void init_Can(int bus, int baudrate)
{
string busnumber = IntToString(bus);
string busbaudrate = IntToString(baudrate);
const char *Reset;
const char *Setup;
const char *Conf;
string reset = "ifconfig can" + busnumber + " down";
string setup = "ip link set can" + busnumber + " up type can bitrate " + busbaudrate + "000";
string conf = "ifconfig can" + busnumber + " up";
cout<<reset + "\n";
cout<<setup + "\n";
cout<<conf + "\n";
Reset=reset.c_str();
Setup=setup.c_str();
Conf=conf.c_str();
system(Reset);
system(Setup);
system(Conf);
}
void canWrite(int busN, int baud, string id, int dlc, int dat0, int dat1, int dat2, int dat3, int dat4, int dat5, int dat6, int dat7)
{
string busnumber = IntToString(busN);
string busbaudrate = IntToString(baud);
cout<<"send data?\n";
string message[8];
message[0] = IntToHex(dat0);
message[1] = IntToHex(dat1);
message[2] = IntToHex(dat2);
message[3] = IntToHex(dat3);
message[4] = IntToHex(dat4);
message[5] = IntToHex(dat5);
message[6] = IntToHex(dat6);
message[7] = IntToHex(dat7);
string cansend;
switch(dlc)
{
case(0): cansend = "cansend can" + busnumber + " " + id + "#"; break;
case(1): cansend = "cansend can" + busnumber + " " + id + "#" + message[0]; break;
case(2): cansend = "cansend can" + busnumber + " " + id + "#" + message[0] + "." + message[1]; break;
case(3): cansend = "cansend can" + busnumber + " " + id + "#" + message[0] + "." + message[1] + "." + message[2]; break;
case(4): cansend = "cansend can" + busnumber + " " + id + "#" + message[0] + "." + message[1] + "." + message[2] + "." + message[3]; break;
case(5): cansend = "cansend can" + busnumber + " " + id + "#" + message[0] + "." + message[1] + "." + message[2] + "." + message[3] + "." + message[4]; break;
case(6): cansend = "cansend can" + busnumber + " " + id + "#" + message[0] + "." + message[1] + "." + message[2] + "." + message[3] + "." + message[4] + "." + message[5]; break;
case(7): cansend = "cansend can" + busnumber + " " + id + "#" + message[0] + "." + message[1] + "." + message[2] + "." + message[3] + "." + message[4] + "." + message[5] + "." + message[6]; break;
case(8): cansend = "cansend can" + busnumber + " " + id + "#" + message[0] + "." + message[1] + "." + message[2] + "." + message[3] + "." + message[4] + "." + message[5] + "." + message[6] + "." + message[7]; break;
}
const char *canSender;
canSender = cansend.c_str();
system(canSender);
cout<<cansend + "\n";
}int main()
{
int baudrate, dlc,i;
int data[8];
string id;
init_Can(0,250);
string value;
cout<<"Do we wish to start;";
cin>>value;
if(value!="Y")
{
usleep(1000000);
return 0;
}data[0] = 64;
data[1] = 00;
data[2] = 02;
data[3] = 00;
data[4] = 00;
data[5] = 00;
data[6] = 00;
data[7] = 00;
i = 0;
id = "612";
dlc = 8;string dump = "candump can0,592:1FFFFFFF";
const char *senddump;
senddump = dump.c_str();
string outp;
while(i<1)
{
cout<<"start new loop\n";
canWrite(0,250000, id, dlc, data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7]);
outp = GetCmdOutput(senddump);
cout<<outp + "\n";
}
}
Итак, как вы можете видеть на последних шагах, я посылаю команду на canbus (canwrite) сразу после того, как я инициирую кандидатуру.
Результат дампа должен быть «can0 592 [8] 80 00 02 00 00 00 02 06». Большую часть времени я не получаю ответа, иногда я получаю правильный. Я думаю, это потому, что захват сигнала может замедлиться. (Всегда начинаю новый дамп)
Теперь было бы намного лучше, если бы можно было запустить Candump в одном терминале и непрерывно регистрировать этот терминал, а затем в отдельном терминале отправлять команды на CANbus. (Когда я пытаюсь это сделать вручную, это прекрасно работает.) У меня нет идей о том, как Запрограммируйте это вообще.
Я также попытался сначала запустить свой дамп, а затем отправить сигнал CANbus. Это невозможно, потому что я никогда не смогу послать сигнал canbus. (остаться в петле Candump)
// * РЕДАКТИРОВАТЬ 1 ***
Хорошо, как вы можете видеть, я начинающий с ++. Я узнал, что там есть что-то вроде pthreads. Это лучший способ решить мою проблему?
Может ли кто-нибудь указать мне правильное направление? Или объясните мне, как я могу это улучшить?
Заранее спасибо,
С уважением,
TMJJ
Задача ещё не решена.
Других решений пока нет …