Встроенный Linux - TI AM335x - Отправка данных на CANBUS и логирование одновременно - C++

Я хотел бы попросить совета. Я пытаюсь прочитать данные из системы 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

0 ответов

Другие вопросы по тегам