云海游戏(中国区)有限公司官网



    1. Echo server

      samples\example\c\canecho.c

      /*
      ** This software is furnished as Redistributable under the 云海游戏 Software Licence
      ** https://www.kvaser.com/canlib-webhelp/page_license_and_copyright.html
      ** Description:
      ** "Echo Server" for CANLIB. If you send a message to this little program,
      ** it will respond with the same message where the identifier is increased by one.
      */
      /* First, include the whole known universe. */
      #include <stdlib.h>
      #include <stdio.h>
      #include <memory.h>
      #include <windows.h>
      #include <conio.h>
      #include <time.h>
      // CANLIB requires the following #include.
      #include <canlib.h>
      #ifdef __BORLANDC__
      #pragma argsused
      #endif
      void Usage(int argc, char* argv[])
      {
      printf("\nCANLIB Echo Server\n");
      printf("(Part of the CANLIB SDK from KVASER AB - http://www.kvaser.se)\n");
      printf("\n");
      printf("This is a sample program which acts as an \"Echo Server\".\n");
      printf("If you send a message to this little program, it will respond with\n");
      printf("the same message where the identifier is increased by one.\n");
      printf("\n");
      printf("It requires a CAN interface supported by CANLIB, and runs\n");
      printf("under most versions of Windows.\n");
      printf("\nUsage: tx [flags]\n");
      printf(" -X Use channel number X as source. (Default 0.)\n");
      printf(" -B<value> Set the bitrate. Value is any of 1000,500,250,125.\n");
      printf(" Default bitrate is 125 kbit/s.\n");
      printf(" -Sbbb,t1,t2 Set the bitrate using specified values for tseg1 and tseg2.\n");
      printf(" bbb=bitrate in bps.\n");
      printf(" t1=# of quanta before the sampling point, not including\n");
      printf(" the sync segment.\n");
      printf(" t2=# of quanta after the sampling point.\n");
      printf(" -q Be quiet.\n");
      exit(1);
      }
      //
      // Global variables for the command-line options.
      //
      int Tseg1, Tseg2;
      int Bitrate = canBITRATE_125K;
      int Channel = 0;
      int Quiet = 0;
      //
      // Check a status code and issue an error message if the code
      // isn't canOK.
      //
      void Check(char* id, canStatus stat)
      {
      if (stat != canOK) {
      char buf[50];
      buf[0] = '\0';
      canGetErrorText(stat, buf, sizeof(buf));
      printf("%s: failed, stat=%d (%s)\n", id, (int)stat, buf);
      }
      }
      //
      // Setup a CAN controller.
      //
      int InitCtrl(int ctrl)
      {
      canStatus stat;
      canHandle hnd;
      //
      // First, open a handle to the CAN circuit. Specifying
      // canOPEN_EXCLUSIVE ensures we get a circuit that noone else
      // is using.
      //
      printf("canOpenChannel, channel %d... ", ctrl);
      if (hnd < 0) {
      Check("canOpenChannel", (canStatus)hnd);
      exit(1);
      }
      printf("OK.\n");
      //
      // Using our new shiny handle, we specify the baud rate
      // using one of the convenient canBITRATE_xxx constants.
      //
      // The bit layout is in depth discussed in most CAN
      // controller data sheets, and on the web at
      // http://www.kvaser.se.
      //
      printf("Setting the bus speed...");
      stat = canSetBusParams(hnd, Bitrate, Tseg1, Tseg2, 1, 1, 0);
      if (stat < 0) {
      printf("canSetBusParams failed, stat=%d\n", stat);
      }
      printf("OK.\n");
      //
      // Then we start the ball rolling.
      //
      printf("Go bus-on...");
      stat = canBusOn(hnd);
      if (stat < 0) {
      printf("canBusOn failed, stat=%d\n", stat);
      }
      printf("OK.\n");
      // Return the handle; our caller will need it for
      // further exercising the CAN controller.
      return hnd;
      }
      //
      // Calculate the next valid identifier; valid as according to the CAN spec.
      // Technically you will probably get along with sending the "illegal"
      // identifiers too.
      //
      void IncreaseId(long *id, int flags)
      {
      unsigned long i = *(unsigned long*)id;
      i++;
      if (flags & canMSG_STD) {
      if (i > 2031) i = 0;
      }
      else if (flags & canMSG_EXT) {
      if ((i & 0x03F0) == 0x03F0) {
      i = (i & 0xFFFFFC00) + 0x800 + (i & 0x0F);
      }
      i &= 0x1FFFFFFF;
      }
      *id = i;
      }
      void EchoLoop(void)
      {
      canHandle hnd;
      long id;
      canStatus stat;
      BYTE msg[8];
      int Ready;
      unsigned int i, dlc, flags;
      unsigned long time;
      hnd = InitCtrl(Channel);
      Ready = FALSE;
      do {
      do {
      //
      // Read a message; timeout after 250 ms.
      //
      stat = canReadWait(hnd, &id, msg, &dlc, &flags, &time, 250);
      if (stat != canOK) break;
      //
      // Calculate a new id.
      //
      IncreaseId(&id, flags);
      //
      // Send the reply.
      //
      stat = canWrite(hnd, id, msg, dlc,
      flags & (canMSG_STD | canMSG_EXT | canMSG_RTR));
      Check("canWrite", stat);
      //
      // Print the message we just sent.
      //
      if (!Quiet) {
      printf("%8ld%c%c%c %u ",
      id,
      (flags & canMSG_EXT) ? 'x' : ' ',
      (flags & canMSG_RTR) ? 'R' : ' ',
      (flags & canMSGERR_OVERRUN) ? 'o' : ' ',
      dlc);
      // Print the data bytes, but not for Remote Frames.
      if ((flags & canMSG_RTR) == 0) {
      for (i = 0; i < dlc; i++) printf("%3u ", msg[i]);
      for (; i < 8; i++) printf(" ");
      }
      // Print the time, in raw format.
      printf("%08lu\n", time);
      }
      } while (stat == canOK);
      //
      // Check the keyboard.
      //
      if (_kbhit()) {
      int c = _getch();
      switch (c) {
      case 27:
      Ready = TRUE;
      default:
      ;
      }
      }
      } while (!Ready);
      (void)canBusOff(hnd);
      (void)canClose(hnd);
      }
      //
      //
      void main(int argc, char* argv[])
      {
      int i;
      //
      // First, parse the command-line arguments.
      //
      for (i = 1; i < argc; i++) {
      int tmp;
      char c;
      int tmp1, tmp2;
      if (sscanf(argv[i], "-%d%c", &tmp, &c) == 1) {
      Channel = tmp;
      }
      else if (sscanf(argv[i], "-B%d%c", &tmp, &c) == 1) {
      switch (tmp) {
      case 1000: Bitrate = canBITRATE_1M; break;
      case 500: Bitrate = canBITRATE_500K; break;
      case 250: Bitrate = canBITRATE_250K; break;
      case 125: Bitrate = canBITRATE_125K; break;
      default: Usage(argc, argv);
      }
      }
      else if (sscanf(argv[i], "-S%d,%d,%d%c", &tmp, &tmp1, &tmp2, &c) == 3) {
      Bitrate = tmp;
      Tseg1 = tmp1;
      Tseg2 = tmp2;
      }
      else if (strcmp(argv[i], "-q") == 0) {
      Quiet++;
      }
      else {
      Usage(argc, argv);
      }
      }
      if (!Quiet) printf("Starting...\n");
      //
      // Initialize CANLIB.
      //
      EchoLoop();
      printf("\nThat's all for today!\n");
      }
      【网站地图】【sitemap】