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.
11 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
11 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.