ublo
bogdan's (micro)blog

bogdan

bogdan » simple windows COM port logger

03:30 pm on Dec 20, 2011 | read the article | tags:

yesterday, i’ve posted my wrapper library for the windows COM port with the promise of posting the actual C program that uses it. to compile it you need mingw (see here my tutorial on how to get it up and running). the program is simple and writes in the text.txt file whatever it receives on the serial interface, but no more than MAXLINES lines (in this case, 10 lines). you need to save the previous code as “serial.h” in the same directory as the code below. then, compile it and that’s it! =)

ask whatever questions here, and i will answer.

#include <stdio.h>
#include <windows.h>
#include "serial.h"
// the number of lines read from the serial interface.
// good for data acquisition for a specified amount of time.
#define MAXLINES 10

int main (int argc, int ** argv) {
    HANDLE comPort;
    FILE * f;
    char buffer[32];
    unsigned short int readbits = 0;
    unsigned long int lines = 0;
    unsigned short int c;

    // my COM port is COM15. be sure to change it accordingly
    if ((comPort = openSerialConsole("\\\\.\\COM15")) == (void *) NULL) {
        printf ("Error: COM Port!\n");
        return 1;
        }

    // open the file "text.txt". change it for a different file
    f = fopen ("test.txt", "w+");

    // read online MAXLINES lines
    while (lines < MAXLINES) {
        // readbits is the number of bytes read from the COM port
        while ((readbits = readFromSerialConsole(comPort, buffer, 32)) != 0) {
            // a good thing to check that the readbits+1 character marks the end
            // of the string. saves you from "Segmentation fault!" errors
            buffer[readbits] = 0;

            // check buffer for ENDL character
            for (c = 0; c<readbits; c++)
                if (buffer[c] == '\n') {
                    lines++;
                    if (lines == MAXLINES) buffer[c] = 0;
                    }

            // output to the standard IO, and
            printf("%s", buffer);
            // to the file
            fprintf(f, "%s", buffer);
            }
        }

    // close the file handle
    fclose (f);

    // close the COM port
    closeSerialConsole(comPort);

    return 0;
    }
bogdan

bogdan » simple windows COM port wrapper library

06:00 pm on Dec 19, 2011 | read the article | tags:

searching for a way to read the serial port in windows using C (usually i do my programming under linux), i found a cute little wrapper for the serial port here. i don’t like .NET that’s why i’ve wanted a pure C implementation. here’s the code (most of it from the source). read the comments as it saved me a lot of problems accessing higher COM ports. remember to escape the characters in the string!

HANDLE openSerialConsole (LPCSTR p) {
// LPCSTR p is a string containing the name of the device
// in Windows namespace, the safest way to access the COM ports
// is to use the \\.\COMxx syntax. remember, p is a string
// and \ escapes characters so p should really be "\\\\.\\COMxx"
    HANDLE h;
    DCB params = {0};
    COMMTIMEOUTS timeouts = {0};

    h = CreateFile ( p,
        GENERIC_READ | GENERIC_WRITE, // the way we want to interact with the COM port
        0, // not the wisest way to open the device as it takes exclusive control over
        NULL, // no security attributes, meaning no child process access
        OPEN_EXISTING, // only if we have a COM port
        0, // some things i didn't understood completely
        NULL);
    if (h == INVALID_HANDLE_VALUE) {
        printf("Error: Could not create handle!\n");
        return (void *) NULL;
        }

    params.DCBlength = sizeof(params);
    if (!GetCommState(h, &params)) {
        printf("Error: Setting COM State!\n");
        CloseHandle (h);
        return (void *) NULL;
        }

    // 9600 bauds, with a 8N1 format
    params.BaudRate=CBR_9600;
    params.ByteSize=8;
    params.Parity=NOPARITY;
    params.StopBits=ONESTOPBIT;
    if (!SetCommState(h, &params)) {
        printf("Error: Setting BAUD!\n");
        CloseHandle (h);
        return (void *) NULL;
        }

    // timeouts, avoid hanging
    timeouts.ReadIntervalTimeout=50;
    timeouts.ReadTotalTimeoutConstant=50;
    timeouts.ReadTotalTimeoutMultiplier=10;
    timeouts.WriteTotalTimeoutConstant=50;
    timeouts.WriteTotalTimeoutMultiplier=10;
    if (!SetCommTimeouts(h, &timeouts)) {
        printf("Error: Setting timeouts!\n");
        CloseHandle (h);
        return (void *) NULL;
        }

    return h;
    }

unsigned long int readFromSerialConsole ( HANDLE h, char * buffer, int size ) {
    unsigned long int bytes = 0;
    COMSTAT status;
    unsigned long int errors;

    ClearCommError (h, &errors, &status);

    if (status.cbInQue > 0) {
        size = status.cbInQue > size ? size : status.cbInQue;
        if (ReadFile(h, buffer, size, &bytes, NULL) && bytes != 0)
            return bytes;
        }
    return bytes;
    }

unsigned long int writeToSerialConsole(HANDLE h, char * buffer, int size) {
    unsigned long int bytes = 0;
    if (!WriteFile(h, buffer, size, &bytes, NULL));
    return bytes;
    }

void closeSerialConsole (HANDLE h) {
    CloseHandle (h);
    }
bogdan

bogdan » using mingw with notepad++ and nppexec

11:28 pm on Dec 17, 2011 | read the article | tags:

first time i heard about mingw was from florin manea, then a lecturer at the university of bucharest, faculty of mathematics. i didn’t pay to much attention to it as i was a dedicated gentoo user. time has passed, and the table turned, me being the one to teach a small course on physical computing at the physics faculty. student’s have various backgrounds but none comes from a computer science oriented faculty, so i had to show them how to connect the μC serial output to their windows environment.

(more…)

aceast sait folosește cookie-uri pentru a îmbunătăți experiența ta, ca vizitator. în același scop, acest sait utilizează modulul Facebook pentru integrarea cu rețeaua lor socială. poți accesa aici politica mea de confidențialitate.