Click here to Skip to main content
15,885,048 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
C++
//Serial Port communication in Windows  for test purpose!!//
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <dos.h>


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


    // Defining hexadecimal bytes to be sent a 200 bps//
    unsigned int bytes_to_send[1];
    bytes_to_send[0] = 0xF0; /* 11110000b */

     // Defining hexadecimal bytes to be sent a 10400 bps//
    unsigned int 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, "Error\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;
    }

    while(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;
    }

    // Send specified text (remaining command line arguments)
    DWORD bytes_written = 0;
    fprintf(stderr, "sending bytes...\n");

        //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;

        // Set baudrate to send bytes at 10400 bps//
        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;
        }

        //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;
    }

    DWORD bytes_written;

    CloseHandle(hSerial);

    if(!WriteFile(hSerial, bytes_written,5, &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 14-Apr-15 23:55pm
v2
Comments
CPallini 15-Apr-15 5:57am    
And what are the problems?
vinod b v 15-Apr-15 6:01am    
I am supposed to get 25ms low and 25ms high square wave upon sending byte 0xF0 at 200 baud, and next my 5 databytes should be sent at 10400, but i am not able to see the exact waveform in my oscilloscope. is there something wrong in the code??
vinod b v 15-Apr-15 7:04am    
@Cpallini Accordingly at 200 baud i should get 25ms and 25ms high,when i measure i am not able to get the required wave i am getting like 10ms low and 40ms high.
But when i just send of at 200 baud without sending other part of the code. i am able to get it, but when i want to do it simultaneously i am failing.

1 solution

vinod b v wrote:
I am supposed to get 25ms low and 25ms high square wave upon sending byte 0xF0 at 200 baud, and next my 5 databytes should be sent at 10400, but i am not able to see the exact waveform in my oscilloscope. is there something wrong in the code??



What do you see on the scope?
Limiting the discussion on the first part of your program (200 baud), there should be a single pulse, like:
______      _______________________________________________
      |_____|

that is high->low transition, 25 msec low (start bit + 4 zero-bits) and then low->high transition ( 4 one-bits, stop bits and finally the line remaining high, idle).
See: "Asynchronous serial communication"[^].
 
Share this answer
 
v2

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