carduinointelintel-galileo

writing and reading data to and from a serial port (to an intel galileo) windows c


I'm building a cnc machine for a school project, it consists of an Intel galileo with a shield that controls stepper motors, this is controlled by a program on a windows machine(windows 7), what the program basically does is read a text file containing gcode and then sends it line by line to the Galileo, the Galileo then takes that line breaks it down into coordinates and instructions, moves the spindle to where it needs to go and when the instruction is finished it sends a message back to the computer through serial telling it that its finished, the computer then sends the next line of code and the process is repeated.

so far I can read the gcode file and send it line by line (using a keypress to send each line) to the galileo and everything works fine. my problem is reading from the galileo I have tried a few methods with no joy. this is what I think is closest to what I should be doing. I wont post the whole source because I think it will be just to much to read through, ive posted the main() which has all the setup functions and the function that is supposed to read the serial.

/************************************************************************************************************
application for controling galileo or arduino cnc machine
by brendan scullion
10/11/2014
**********************************************************************************************************/
#include <string.h>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <time.h>
#include <ctype.h>
#include <conio.h>
#include "functions.h"

int main()
{
system("COLOR 1F");

// Declare variables and structures
unsigned char text_to_send[MAX_PATH];
unsigned char digits[MAX_PATH];
int baudrate = 19200;
int dev_num = 50;
char dev_name[MAX_PATH];
HANDLE hSerial;
HANDLE screen = GetStdHandle(STD_OUTPUT_HANDLE);
DCB dcbSerialParams = {0};
COMMTIMEOUTS timeouts = {0};

 printf("Searching serial ports...\n");
while(dev_num >= 0)
{
    printf("\r                        ");
    printf("\rTrying COM%d...", dev_num);
    sprintf(dev_name, "\\\\.\\COM%d", dev_num);
    hSerial = CreateFile(
                    dev_name,
                    GENERIC_READ|GENERIC_WRITE,
                    0,
                    NULL,
                    OPEN_EXISTING,
                    FILE_ATTRIBUTE_NORMAL,
                    NULL );
    if (hSerial == INVALID_HANDLE_VALUE) dev_num--;
    else break;
}

if (dev_num < 0)
{
    printf("No serial port available\n");
    return 1;
}

printf("OK\n");

// Set device parameters (38400 baud, 1 start bit,
// 1 stop bit, no parity)
dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
if (GetCommState(hSerial, &dcbSerialParams) == 0)
{
    printf("Error getting device state\n");
    CloseHandle(hSerial);
    return 1;
}
//dcbSerialParams.BaudRate = CBR_38400;
dcbSerialParams.BaudRate = baudrate;
dcbSerialParams.ByteSize = 8;
dcbSerialParams.StopBits = ONESTOPBIT;
dcbSerialParams.Parity = NOPARITY;
if(SetCommState(hSerial, &dcbSerialParams) == 0)
{
    printf("Error setting device parameters\n");
    CloseHandle(hSerial);
    return 1;
}
// Set COM port timeout settings
timeouts.ReadIntervalTimeout = 1;
timeouts.ReadTotalTimeoutConstant = 1;
timeouts.ReadTotalTimeoutMultiplier = 10;
timeouts.WriteTotalTimeoutConstant = 50;
timeouts.WriteTotalTimeoutMultiplier = 10;
if(SetCommTimeouts(hSerial, &timeouts) == 0)
{
    printf("Error setting timeouts\n");
    CloseHandle(hSerial);
    return 1;
}

char *cmd = NULL;
char *para1 = NULL;
char *para2 = NULL;
char *para3 = NULL;

char comPort[10];
float baudRate;
int keepGoing = 1;
unsigned char message[MAX_STRING_LENGHT];
//*********************************************************************************************************************

char cmdLine[200];
heading();
while(keepGoing == 1)
{
    printf(">>");
    gets(cmdLine);
    cmd = strtok(cmdLine, " ");

    if(cmd!=false)
    {
        if(cmd != NULL)
        {
            para1 = strtok(NULL, " ");
        }
        else if(para1 != NULL)
        {
           para2 = strtok(NULL, " ");
        }
        else if(para2 != NULL)
        {
            para3 = strtok(NULL, " ");
        }
        if(strcmp(cmd, "help")== 0)
        {
            help();
        }
        else if(strcmp(cmd, "comset")== 0)
        {
            setupComs(comPort, baudRate);
        }
        else if(strcmp(cmd, "getg")== 0)
        {
            getgcode(hSerial,text_to_send,dev_name);
        }
        else if(strcmp(cmd, "readserial")== 0)
        {
            read_serial(hSerial, message, dev_name);
        }
        else if(strcmp(cmd, "offset")==0)
        {
            getOffset(hSerial, text_to_send, dev_name);
        }
        else if(strcmp(cmd, "setup") == 0)
        {
            setup(hSerial, text_to_send, dev_name);
        }

        else if(strcmp(cmd, "exit") == 0)
        {
            keepGoing = 0;
        }
        else
        {
            printf("Unknown command!\n");
        }
        printf("\n");
    }
}
// Close serial port
printf("Closing serial port...");
if (CloseHandle(hSerial) == 0)
{
    printf("Error\n");
    return 1;
}
printf("OK\n");
return 0;
}

and the function for reading

void read_serial(HANDLE hComm, HANDLE screen, char *message, char *devName )
{

    char buffer[MAX_STRING_LENGHT];
    unsigned char ch;
    DWORD bytes_recieved = MAX_STRING_LENGHT, written = 0;
    strcpy(buffer,""); //empty buffer
    strcpy(buffer,"");

    while(buffer!=NULL){ // wait untill serail message revieved
        ReadFile(hComm, &buffer,sizeof(buffer), // read serial
                &bytes_recieved, NULL );
        if(bytes_recieved){                // if something to read
            WriteFile(screen, buffer, bytes_recieved, &written, NULL);
            strcpy(message, buffer);
            printf("%s", message);
            if(kbhit()){
                ch = getch();
                if(ch== 'q')
                    break;
            }
        }
    }
}

i can post the entire source code if anybody wants to have a look at it


Solution

  • In read_serial, you can try replacing &buffer with buffer in the call to ReadFile. Name of a character array should be a pointer to the first element of the array.