Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
10 years, 9 months ago.
CanBus CANExtended read what am I doing wrong?
I am trying to get data from a J1939 Can Bus. The code is some what working.
The output I get with the MBED code is:
Message received: 8
Message2 received: 10000110
however using a Beaglebone Black configured to read the CAN bus at the same time I get:
DATA,0x18F00300,0x8,0xFF 0xFE 0x0A 0xFF 0xFF 0xFF 0xFF 0xFF,0x6FF9,ACK
I don't understand why my MBED code only reports back the first Byte of data and not the entire sentence.
My code is below.
Anyone able to provide some pointers?
/* Program Example 13.5: CAN data read – reads CAN messages from the CAN bus */ #include "mbed.h" Serial pc(USBTX, USBRX); // tx, rx for Tera Term output DigitalOut led2(LED2); // status LED DigitalOut led4(LED4); // status LED CAN can1(p9, p10); // CAN interface int main() { pc.baud(115200); can1.frequency(250000); static CANMessage msg; msg.type = CANData; msg.format = CANExtended; //CANMessage msg; // create empty CAN message printf("read...\n"); while(1) { if(can1.read(msg)) { if(msg.id ==0x18FEEF00){ printf("Message received: %X\n", msg.len); // display message length led4 = !led4; } // toggle status LED else if(msg.id ==0x18F00300){ printf("Message2 received: %X\n", msg.data); //display message data led2=!led2; }
2 Answers
10 years, 9 months ago.
msg.data is a pointer to where the data resides. So what you are now printing is the location where it is stored. So what you need to do is:
else if(msg.id ==0x18F00300){ printf("Message2 received: "); for (int i = 0; i<msg.len; i++) printf("0x%02X -", msg.data[i]); printf("\n"); led2=!led2; }
Didn't test it myself (obviously), but that probably works. Not it first prints message2 received, then runs a loop to output all received data from the data array, and finally prints new line char. (In the loop your %X would have worked too, but this is nicer formatted).
Please use
posted by Erik - 06 Mar 2014<<code>> and <</code>>
around your code, now it is very hard to read.