Newsgroup: it.comp.programmare.win32
Titolo: programmazione porta seriale

Salve a tutti
Il mio problema è quello di connettermi ad un terminale Z80 tramite
seriale.
Ho usato x fare ciò il Visual C++ 6.0 ed ho scritto il codice
seguente. Il problema è che quando invio i comandi alla Z80 questa non
mi restituisce i valori nel formato numerico come mi aspetterei. Credo
che dipenda dal tipo di connessione impostata, ossia la not
overlapped, mentre ho visto un esempio sotto Dos che invece utilizza
una connessione asincrona. Quali modifiche devo fare e come devo
gestire gli event nel codice di cui sotto?
AIutatemi x favore
Grazie in anticipo! 
// serial.cpp : Defines the entry point for the console application.
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <io.h>
#include <stdlib.h>
#include <direct.h>
#include <windows.h>
// ****** FUNZIONI ******
HANDLE open_serial_port(int iCom);
int Write_Comport (HANDLE DriverHandle, DWORD NumBytes, void *Buffer);
// *************************************
// Main
// *************************************
void main(){
int i=0,ch, iCom, iAttesa, j ;
char  sStr[128], sStr2[160];
HANDLE	hCom;
DWORD	iBytesRead;
BOOL bReadRC;
printf("\n Select the COM : ");					scanf("%d",&iCom);
printf(" Select the Sampling time : ");		scanf("%d",&iAttesa);
//	***********************************
	//	LETTURA  FILE DI CONFIGURAZIONE
	//	***********************************
	printf("\n TNT CONTROL SOFTWARE");
			printf("\n Software for Z80 processor programming");
			printf("\n by Igor Di Varano INAF - TE\n");
			printf("\n\n Press any key to continue\n");
 
	hCom = open_serial_port(iCom);
	printf("Premi Reset sulla Z80\n\n");
			//printf("Premi un tasto per continuare\n\n");
	printf("COM selected is:0x%X\n\n",hCom);
	for (i=0;i<sizeof(sStr2); i++) sStr2[i]=0;i=0;
	while (1){
 
		for (i=0;i<128; i++) sStr[i]=0;i=0;
		if (kbhit()){
 
			//spedisci il comando RETURN alla Z80
			while ((ch=getch())!='q') sStr[i++]=ch; 	    	              
sStr[i]='\r';
			sStr[i+1]='\0';//inserisco NULL alla fine della stringa
			//strcpy(sStr,"\r");
                        //visualizza il msg di reset
			printf("String to send:%s\n",sStr);
			Write_Comport (hCom,166,sStr); 
		    Sleep(1000*iAttesa);
	bReadRC=ReadFile(hCom,sStr2 ,sizeof sStr2),&iBytesRead,NULL);//32
	if (bReadRC==TRUE) printf("Sta leggendo la porta seriale\n",bReadRC);
			else {
	printf("Non sta leggendo nulla, hai selezionato la porta sbagliata
\n");
				exit(0);
			} 
 
 
			printf("String received is:");
			//for(j=0;j<sizeof(sStr2); j++) 
			puts(sStr2);
			//j=0;
			printf("\n");
 
 
		}
 
	}
	CloseHandle(hCom);
}
// *************************************
// Funzione per l'apertura della COM
//
//   IN : numero della COM
//  OUT : l'HANDLE della porta seriale
// *************************************
HANDLE open_serial_port(int iCom)
{
char sCom[5];
HANDLE	hMano;
COMMTIMEOUTS	CommTimeouts;
DCB		dcb;
	sprintf(sCom,"Com%d\0",iCom);
		// Apertura della COM1
	hMano = CreateFile(sCom, GENERIC_READ | GENERIC_WRITE, 0,NULL,
OPEN_EXISTING, 	0,NULL);
 
	// Dimensionato il buffer della seriale per 512 byte
		SetupComm (hMano,256,256); 
 
	GetCommState(hMano, &dcb);
	// Modifiche alla struttura di setup in mase ai parametri
		dcb.fBinary		  = TRUE;
		dcb.fAbortOnError = TRUE;
     	dcb.BaudRate      = CBR_9600;
		dcb.ByteSize      = 8;
		dcb.Parity        = NOPARITY;
		dcb.StopBits      = ONESTOPBIT;
		dcb.fDtrControl = DTR_CONTROL_DISABLE;
		dcb.fRtsControl= RTS_CONTROL_DISABLE; //RTS_CONTROL_TOGGLE
		dcb.fInX = TRUE;
		dcb.fOutX = TRUE;
		dcb.XonLim=10;
		dcb.XoffLim=10;
		dcb.fOutxCtsFlow = FALSE;
		dcb.fOutxDsrFlow = FALSE;
	// Spedizione della struttura di setup della seriale con le modifiche
			// sopra apportate
	SetCommState(hMano, &dcb);
		// Acquisizione dei setup dei Timeout standard 
		// (stessa procedura adottata per i parametri della seriale)
	//CommTimeouts ={0x01,0,0,0,0};
	GetCommTimeouts(hMano, &CommTimeouts);
			// Modifica parametri
	CommTimeouts.ReadIntervalTimeout         =50;
	CommTimeouts.ReadTotalTimeoutConstant    =50;
	CommTimeouts.ReadTotalTimeoutMultiplier  =10;
	CommTimeouts.WriteTotalTimeoutConstant   =50;
	CommTimeouts.WriteTotalTimeoutMultiplier =10;
			// Spedizione parametri
	SetCommTimeouts (hMano, &CommTimeouts);
	 //
        // Setup a mask that allows us to tell if the port is done
transmitting
        // the current buffer of data
        //
      SetCommMask (hMano, EV_TXEMPTY);
    	return hMano;
}
int Write_Comport (HANDLE DriverHandle, DWORD NumBytes, void *Buffer)
{
    DWORD EvtMask, BytesWritten;
    BOOL status;
    //
    // Sanity check on the Handle
    //
    if ((DriverHandle == 0) || (DriverHandle == INVALID_HANDLE_VALUE))
{
        return FALSE;
    } 
    //
    // Some devices may require setting RTS or DTR to specific states
prior to
    // tranmission of data 
    //
    //EscapeCommFunction (DriverHandle, SETRTS);
	PurgeComm(DriverHandle,PURGE_RXCLEAR);
    //
    // Output the data to the Comport
    //
    status = WriteFile (DriverHandle, Buffer, NumBytes, &BytesWritten,
0);
    //
    // If you want, use the WaitCommEvent() function to wait for the 
    // data Transmission to complete
    //
    WaitCommEvent(DriverHandle, &EvtMask, NULL);
  // Some devices may require clearing RTS or DTR to after
transmission of data
 
    //EscapeCommFunction (DriverHandle, CLRRTS);
 
    return TRUE;
}

 Write_Comport (hCom,166,sStr); 
-- 
Valter Minute
vmi...@inwind.it
 (the reply address of this message is invalid)