First version of a mbed USB2CAN adapter Let\'s you send can messages via can. Type as !format_type_ID_length_d0_d1_d2_d3_d4_d5_d6_d7 (! is used to recognize valid messages, anything without a ! in front of it is dumped) All messages transmitted over cCAN are printed to your terminal as well.
Revision 0:495bc2a030c1, committed 2011-02-24
- Comitter:
- OTBsolar
- Date:
- Thu Feb 24 16:01:37 2011 +0000
- Commit message:
- beta
Changed in this revision
USB2CAN.cpp | Show annotated file Show diff for this revision Revisions of this file |
mbed.bld | Show annotated file Show diff for this revision Revisions of this file |
diff -r 000000000000 -r 495bc2a030c1 USB2CAN.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USB2CAN.cpp Thu Feb 24 16:01:37 2011 +0000 @@ -0,0 +1,117 @@ +#include "mbed.h" +#include "CAN.h" +#include "stdio.h" +#include "stdlib.h" +#include "string.h" + +Ticker ticker; +Serial pc(USBTX, USBRX); +DigitalOut write_activity(LED1); //CAN activity +DigitalOut read_activity(LED2); +DigitalOut pc_activity(LED3); //USB activity +CAN can1(p9, p10); // rd, td Transmitter +CAN can2(p30, p29); // rd, td Monitor + +int counter = 0; +char candata[8]; +char pc_msg[50]; +CANType pc_type; +CANFormat pc_format; +int pc_ID; //standard 11bit ID +//int pc_IDe; //extended 29 (not used yet) +int pc_length; +int pcd0; int pcd1; int pcd2; int pcd3; int pcd4; int pcd5; int pcd6; int pcd7; //8 bytes data +CANMessage msg; + +void setdata(int d0, int d1, int d2, int d3, int d4, int d5, int d6, int d7) { + candata[0] = (char) (d0); // LSB + candata[1] = (char) (d1); + candata[2] = (char) (d2); + candata[3] = (char) (d3); + candata[4] = (char) (d4); + candata[5] = (char) (d5); + candata[6] = (char) (d6); + candata[7] = (char) (d7); // MSB +} + +void canread() { + //printf("CANmessage: %c\n", msg); + pc.printf("Read: [ ID: %d", msg.id); + pc.printf(" Length: %d", msg.len); + pc.printf(" Data: %x", msg.data[0]); + pc.printf(" %x", msg.data[1]); + pc.printf(" %x", msg.data[2]); + pc.printf(" %x", msg.data[3]); + pc.printf(" %x", msg.data[4]); + pc.printf(" %x", msg.data[5]); + pc.printf(" %x", msg.data[6]); + pc.printf(" %x", msg.data[7]); + pc.printf(" Type: %d", msg.type); + pc.printf(" Format: %d ]\n", msg.format); + read_activity = !read_activity; //Blink! + can2.reset(); +} + +void pc_msg_read() { + // Data to be sent as !<format>_<type>_<ID>_<length>_<d0>_<d1>_<d2>_<d3>_<d4>_<d5>_<d6>_<d7> ("_" = space) + + // Read the string and copy it to the char array pc_msg + pc.scanf("%[^\n]s",pc_msg); + pc.printf("Entered:%s",pc_msg); + + // Read pc_msg and extract all data + sscanf(pc_msg,"%d %d %d %d %x %x %x %x %x %x %x %x", &pc_format, &pc_type, &pc_ID, &pc_length, + &pcd0, &pcd1, &pcd2, &pcd3, &pcd4, &pcd5, &pcd6, &pcd7); + + // Printing extracted data, mostly for testing + pc.printf("Sent: [ ID: %d ",pc_ID); + pc.printf("length: %d ",pc_length); + pc.printf("data: %x %x %x %x %x %x %x %x ",pcd0, pcd1, pcd2, pcd3, pcd4, pcd5, pcd6, pcd7); + pc.printf("type: %d ",pc_type); + pc.printf("format: %d ]\n",pc_format); + + // Setting the data to CANMessage.data format + setdata(pcd0, pcd1, pcd2, pcd3, pcd4, pcd5, pcd6, pcd7); + + // Transmitting CANMessage + if(can1.write(CANMessage(pc_ID,candata,(char)pc_length,pc_type,pc_format))) { + pc.printf("Message compiled and sent.\n"); + } + pc.printf("Please enter any additional commands in the same manner.\n"); + +} + +int main() { + //----------------Initialization----------------------- + can2.frequency(500000); //500kbit/s + can1.frequency(500000); + can2.monitor(1); //Works without this, in my case. + //ticker.attach(&cansend, 0.5); //Send every 1 seconds. + //----------------------------------------------------- + + char test; + char dump; + pc.printf("Please enter !<format>_<type>_<ID>_<length>_<d0>_<d1>_<d2>_<d3>_<d4>_<d5>_<d6>_<d7> ('_' = space)\n"); + + while(1) { + if (pc.readable()) { // If there's data available from pc + pc_activity = !pc_activity; // LED + test = pc.getc(); + if (test == '!') { // See if it's a valid message + pc_msg_read(); // Valid => read the message and extract the data + //pc.printf("Left pc_msg_read\n"); // "Left the function" test + } + else { // Invalid data or leftover characters + pc.printf("Dumped: "); + while(pc.readable()) { // Keep dumping the leftovers + dump = pc.getc(); + pc.printf("%c",dump); + } + } + //pc.printf("Leaving pc.readable()\n"); // Left the !test + } + if (can2.read(msg)) { + canread(); //Read when interupted. + } + } +} \ No newline at end of file
diff -r 000000000000 -r 495bc2a030c1 mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Thu Feb 24 16:01:37 2011 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/63bcd7ba4912