www.mikrocontroller.net

modemtest.c

modemtest.c
/****************************************************************
 File:    modemtest.c
 Author:  Peter Fleury <pfleury@gmx.ch>
 
 Test modem communication using win32

 This code demonstrates an extremely simple serial connection.
 
 Compiled using the freeware MinGW Compiler http://www.mingw.org/
 
 Compile commands:
 gcc  -Wall -c modemtest.c
 gcc  modemtest.o   -o modemtest
 
*****************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <windows.h>


/*
 *  function prototypes
 */
void ErrorHandler(char *message, DWORD error);

int modemInit( 
    char    *comPort,
    int     baudRate,
    HANDLE  *comHandle );
    
int modemReadLine(
    HANDLE  comHandle,
    char    *data,
    int     *dataLen );
        
int modemWriteMsg(
    HANDLE  comHandle,
    char    *data,
    int     dataLen );



/************************************************************************
open comport, set baudrate and return handle to it
************************************************************************/
int modemInit(
    char    *comPort,
    int     baudRate,
    HANDLE  *comHandle )
{
  BOOL success;
  DCB dcb;
  COMMTIMEOUTS timeouts;

  /* Open the comm port. Can open COM, LPT, or \\\\.\\TELNET */
    *comHandle = CreateFile(comPort, 
                        GENERIC_READ|GENERIC_WRITE, 
                        0, 0, OPEN_EXISTING,
                        FILE_ATTRIBUTE_NORMAL, 0);
  if (*comHandle == INVALID_HANDLE_VALUE)
    ErrorHandler("In CreateFile", GetLastError());

  /* Get the current settings of the COMM port */
  success = GetCommState(*comHandle, &dcb);
  if (!success) ErrorHandler("In GetCommState",GetLastError());

    /* Modify the baud rate, etc. */
  dcb.BaudRate = baudRate;
  dcb.ByteSize = 8;
  dcb.Parity   = NOPARITY;
  dcb.StopBits = ONESTOPBIT;

  /* Apply the new comm port settings */
  success = SetCommState(*comHandle, &dcb);
  if (!success) ErrorHandler("In SetCommState",GetLastError());

  /* Change the ReadIntervalTimeout so that          */
  /* ReadFile will return immediately (MAXDWORD) or  */
  /* not return until it has data (0)                */
  timeouts.ReadIntervalTimeout         = 0;
  timeouts.ReadTotalTimeoutMultiplier  = 0;
  timeouts.ReadTotalTimeoutConstant    = 0;
  timeouts.WriteTotalTimeoutMultiplier = 0;
  timeouts.WriteTotalTimeoutConstant   = 0;
  SetCommTimeouts( *comHandle, &timeouts );

    return 0;
}


int modemReadLine(
    HANDLE  comHandle,
    char    *data,
    int     *dataLen )
/* read <LF> terminated line from modem */
{
  BOOL  success;
  DWORD numRead;
    char c;
    
    *dataLen = 0;
    do {
        success = ReadFile(comHandle, &c, 1, &numRead, 0);
      if (!success)
        ErrorHandler("In ReadFile", GetLastError());
        *data++ = c;
        (*dataLen)++;
    }while( c != '\n' );
    
    *data = '\0';
    
    return 0;
    
};/* modemReadLine */

    
int modemWriteMsg(
    HANDLE  comHandle,
    char    *data,
    int     dataLen )
/* write data to modem */
{
    BOOL success;
  DWORD numWrite;
    
  success = WriteFile(comHandle, data, dataLen, &numWrite, 0);
  if (!success) 
    ErrorHandler("modemWriteMsg:WriteFile", GetLastError());

    return 0;
    
};/* modemWriteMsg */



/* 
 *  module global variables
 */




void ErrorHandler(char *message, DWORD error)
{
    fprintf(stderr,"Message=%s Errno=%u\n", message, (unsigned int)error );
  ExitProcess(1);
}


int main( int argc, char **argv)
{
  HANDLE comHandle;
  int  retval;
  char str[1100];
    
    
    retval = modemInit( "COM1", 9600, &comHandle );    

  /* Set the Data Terminal Ready line */
  EscapeCommFunction(comHandle, SETDTR);

  /* Send an "at" command to the modem. Be sure to use \r rather than \n */
    strcpy(str, "atz\r" );
    modemWriteMsg(comHandle, str, strlen(str) );
    modemReadLine( comHandle, str, &retval );       /* read echo */

    /* expect OK */
    modemReadLine( comHandle, str, &retval );       /* read one line from modem      */
  printf("Received: Len=%4d %s",  retval, str );  /* and print the string received */

    /* send "at &v" */
    strcpy(str, "at&v\r" );
    modemWriteMsg(comHandle, str, strlen(str) );

    /* read answer from modem */
    do {
        modemReadLine( comHandle, str, &retval );       /* read one line from modem      */
      printf("Received: Len=%4d %s",  retval, str );  /* and print the string received */
    } while ( !strstr(str,"OK"));
    
  // Clear the DTR line
  EscapeCommFunction(comHandle, CLRDTR);

  CloseHandle(comHandle);  
  
  exit(0);
}

webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net