ciao a tutti,
sono riuscito finalmente a parlare con la seriale ma ho un problema. Per prima cosa vi spiego come provo la comunicazione seriale: ho un cavo NULL modem collegato da una parte alla seriale del pc e dall altra a un adattatore USB/Seriale che non fa altro che far vedere una porta USB come una porta seriale.
lo schema e questo di principio e questo
Seriale PC(COM1)<---->Seriale PC(COM3)
Dalla parte della COM3 uso hyperterminal di windows mentre COM1 e gestita con il software C.
Ora per la trasmissione da COM1 a COM3 nessun problema, il programma invia correttamente cio che io gli dico di mandare ( e infatti lo visualizzo correttamente su hyperterminal)...se invece cerco di ricevere qualcosa da COM3 non ce verso...o almeno e tutto il giorno che ci provo senza alcun risultato....vi riporto il codice qui sotto:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <winbase.h>
int main()
{
OVERLAPPED osWrite = {0};
DCB PortDCB;
DWORD dwBytesTransferred=0,timeout=10000;
HANDLE hComm,Rx;
COMMTIMEOUTS CommTimeouts;
int i;
char *porta="COM1:\0";
char *pippo;
char prova;
// Creazione dell handle relativo all apertura della porta in lettura(COM1)
Rx = CreateFile(porta,
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
0);
if (Rx == INVALID_HANDLE_VALUE)
{exit(0);}// error opening port; abort
GetCommState(Rx,&PortDCB); // Preleva i setting attuali della porta
// setting dei paramentri (9600 8N1)
PortDCB.BaudRate = 9600; // Current baud
PortDCB.fBinary = FALSE; // Binary mode; no EOF check
PortDCB.fParity = FALSE; // Enable parity checking
PortDCB.fOutxCtsFlow = FALSE; // No CTS output flow control
PortDCB.fOutxDsrFlow = FALSE; // No DSR output flow control
PortDCB.fDtrControl = DTR_CONTROL_DISABLE;
// DTR flow control type
PortDCB.fDsrSensitivity = FALSE; // DSR sensitivity
PortDCB.fTXContinueOnXoff = FALSE; // XOFF continues Tx
PortDCB.fOutX = FALSE; // No XON/XOFF out flow control
PortDCB.fInX = FALSE; // No XON/XOFF in flow control
PortDCB.fErrorChar = FALSE; // Disable error replacement
PortDCB.fNull = FALSE; // Disable null stripping
PortDCB.fRtsControl = RTS_CONTROL_DISABLE;
// RTS flow control
PortDCB.fAbortOnError = FALSE; // Do not abort reads/writes on
// error
PortDCB.ByteSize = 1; // Number of bits/byte, 4-8
PortDCB.Parity = NOPARITY; // 0-4=no,odd,even,mark,space
PortDCB.StopBits = ONESTOPBIT; // 0,1,2 = 1, 1.5, 2
SetCommState(Rx,&PortDCB); // Setting della porta
GetCommTimeouts(Rx,&CommTimeouts);// rivela i paramentri di timeout della porta
CommTimeouts.ReadIntervalTimeout = timeout; // imposto i paramentri di timeout a mio piacimento
CommTimeouts.ReadTotalTimeoutMultiplier = 0;
CommTimeouts.ReadTotalTimeoutConstant = 0;
CommTimeouts.WriteTotalTimeoutMultiplier = 10;
CommTimeouts.WriteTotalTimeoutConstant = 1000;
SetCommTimeouts(Rx,&CommTimeouts); // setting dei paramentri di timeout su COM1
while(dwBytesTransferred==0)
{ReadFile (Rx, // Port handle
&prova, // Pointer to data to read
1, // Number of bytes to read
&dwBytesTransferred, // Pointer to number of bytes
// read
NULL // Must be NULL for Windows CE
);
}
CloseHandle(Rx);
system("pause");
}
In pratica lui non esce dal ciclo finche il numero di byte trasferito non diventi diverso da 0, cosa che avviene quando l input buffer della seriale si riempe. Avviato il programma si puo scrivere cosa si vuole su hyperterminal ma dall altra parte continua a non uscire dal ciclo, e come se non ricevesse niente........
2) Inoltre avrei un altra questione:
ho notato che la seriale (in scrittura) si puo gestire anche con questo codice
FILE *fp;
char *c="sce";
char pippo;
fp=fopen("COM1:","w");
fprintf(fp,"%s",c);
fclose(fp);
cioe con del C puro...pero in questo modo come si possono cambiare i parametri della porta?
Grazie a tutti per le rispo! Saluti!

