Click here to Skip to main content
15,885,278 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
I have written a code that sends the byte OF at 200 bps and then should send 5 bytes at 10400, i need to loop this data continuously, how can this be done? i use two while loop one for sending single byte at 200 and then again another for sending 5 bytes of data at 10400, when i start the program i can see the OF being transmitted and only when i press a key, i see the 5 bytes being transferred, i want all these in a single shot. How to do it. Here is the attached code.

C++
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#include <process.h>
#define true 1

int main()
{
   // int _kbhit();
   // int _getch();

   // Defining hexadecimal bytes to be sent a 200 bps for generation of low high sequence//
   unsigned char bytes_to_send[1];
   bytes_to_send[0] = 0xF0; /* 11110000b */
   unsigned char databytes_send[5];
   databytes_send[0] = 0x81;
   databytes_send[1] = 0x11;
   databytes_send[2] = 0xF1;
   databytes_send[3] = 0x11;
   databytes_send[4] = 0x04;

   /*int GetPressedKey()
   {
      int ret = 0;
      if (_kbhit())
      {
         ret = _getch();
      }
      return ret;
    }*/
   // Declare variables and structures//
   HANDLE hSerial;
   DCB dcbSerialParams = {0};
   COMMTIMEOUTS timeouts = {0};

   // Open the available serial port number//
   fprintf(stderr, "Opening serial port...");
   hSerial = CreateFile("COM4", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
   if (hSerial == INVALID_HANDLE_VALUE)
   {
      fprintf(stderr, "Check for port connections\n");
      return 1;
   }
   else
      fprintf(stderr, "OK\n");
   // Set device parameters (200 baud, 1 start bit, 1 stop bit, no parity)
   dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
   if (GetCommState(hSerial, &dcbSerialParams) == 0)
   {
      fprintf(stderr, "Error getting device state\n");
      CloseHandle(hSerial);
      return 1;
   }

   // Set baudrate to send bytes at 200 bps//
   dcbSerialParams.BaudRate = 200;
   dcbSerialParams.ByteSize = 8;
   dcbSerialParams.StopBits = ONESTOPBIT;
   dcbSerialParams.Parity = NOPARITY;
   if (SetCommState(hSerial, &dcbSerialParams) == 0)
   {
      fprintf(stderr, "Error setting device parameters\n");
      CloseHandle(hSerial);
      return 1;
   }

   // Set COM port timeout settings//
   timeouts.ReadIntervalTimeout = 50;
   timeouts.ReadTotalTimeoutConstant = 50;
   timeouts.ReadTotalTimeoutMultiplier = 10;
   timeouts.WriteTotalTimeoutConstant = 50;
   timeouts.WriteTotalTimeoutMultiplier = 10;
   if (SetCommTimeouts(hSerial, &timeouts) == 0)
   {
      fprintf(stderr, "Error setting timeouts\n");
      CloseHandle(hSerial);
      return 1;
   }
   while(true)
   {
      // Send specified text (remaining command line arguments)
      DWORD bytes_written = 0;
      fprintf(stderr, "sending bytes...\n");

      while(1)
      {
         //Transmit slow initialization data
         if (!WriteFile(hSerial, bytes_to_send, 1,&bytes_written, NULL))
            // break;

         fprintf(stderr, "%d bytes written\n", bytes_written);

            //check for key press event
            /*if (GetPressedKey()) */
              // break;
      }


      // Open the available serial port number//


      // Set device parameters (200 baud, 1 start bit, 1 stop bit, no parity)
      dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
      if (GetCommState(hSerial, &dcbSerialParams) == 0)
      {
         fprintf(stderr, "Error getting device state\n");
         CloseHandle(hSerial);
         return 1;
      }
      // Set baudrate to send bytes at 10400 bps 8 N 1//

      dcbSerialParams.BaudRate = 10400;
      dcbSerialParams.ByteSize = 8;
      dcbSerialParams.StopBits = ONESTOPBIT;
      dcbSerialParams.Parity = NOPARITY;
      if (SetCommState(hSerial, &dcbSerialParams) == 0)
      {
         fprintf(stderr, "Error setting device parameters\n");
         CloseHandle(hSerial);
         return 1;
      }

      // Set COM port timeout settings//
      timeouts.ReadIntervalTimeout = 50;
      timeouts.ReadTotalTimeoutConstant = 50;
      timeouts.ReadTotalTimeoutMultiplier = 10;
      timeouts.WriteTotalTimeoutConstant = 50;
      timeouts.WriteTotalTimeoutMultiplier =10;
      if (SetCommTimeouts(hSerial, &timeouts) == 0)
      {
         fprintf(stderr, "Error setting timeouts\n");
         CloseHandle(hSerial);
         return 1;
      }

      while(1)
      {
         //Transmit fast initialization data
         if (!WriteFile(hSerial, databytes_send, 5, &bytes_written, NULL))
            // break;

         fprintf(stderr, "%d bytes written\n", bytes_written);

         //Check for key press event
         /*   if (GetPressedKey())
         */
             break;
      }

      CloseHandle(hSerial);

      if (!WriteFile(hSerial, bytes_written,6, &bytes_written, NULL))
      {
         fprintf(stderr, "End of transmission\n");
         CloseHandle(hSerial);
         return 1;
      }
      fprintf(stderr, "%d bytes written\n", bytes_written);

      // Close serial port
      fprintf(stderr, "Closing serial port...");
      if (CloseHandle(hSerial) == 0)
      {
         fprintf(stderr, "Error\n");
         return 1;
      }
      fprintf(stderr, "OK\n");

      // exit normally
      return 0;
   }
}
Posted
Updated 21-Apr-15 23:59pm
v4

If no key has been pressed then GetPressedKey returns zero, so the loop continues. You should remove these two functions, as they do nothing except delay your code.
 
Share this answer
 
Comments
vinod b v 22-Apr-15 5:31am    
@ Richard MacCutchan I tried it but unfortunately the second part of the code does not run. I mean the i can only see F0 being displayed in my waveform and repeats continously
Richard MacCutchan 22-Apr-15 6:54am    
Yes, of course it does, because you are doing it in an infinite loop.
In addition to solution 1 (which is a good advice because it will remove the need to press a key), you can enclose your whole process in another, root level while loop:
C
while (true) {
   // Send specified text (remaining command line arguments)
   DWORD bytes_written = 0;
   fprintf(stderr, "sending bytes...\n");
   // ...
}

This will take care of the continuously-running requirement.
You can eventually make a key-press test if you want to be able to cancel this root-level while loop (reusing your GetPressedKey method for the occasion).

Hope this helps.
 
Share this answer
 
Comments
phil.o 22-Apr-15 5:40am    
Comments are not meant to host huge pieces of code.
Better improve your question and post the relevant code in it. I won't even try to read code in comments.
vinod b v 22-Apr-15 5:47am    
I did change it, but only F0 at 200 baud rate is being transferred, but unable to view the next 5 bytes at 10400 baud rate, i have updated the question.
phil.o 22-Apr-15 6:08am    
You should put a beakpoint and start debugging ; you will see where the problems are :
- you commented out some break statements, but that breaks the logic as they were belonging to non-brackets-enclosed if statements.
- you may put the end of the while loop before the part that is closing the file ; or put the start of the while loop before the part that is opening it.

Best way for you is to debug your code (F5).

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900