I
infineonintern
Guest
Per le persone che hanno maneggiato con porta seriale di programmazione, si prega di aiuto.Sto cercando di lasciare due PCS
per generare la comunicazione tra l'altro.Sono di nuovo la porta seriale di programmazione e
scritto due semplici programmi per funzionare su ogni PC.Il programma è una applicazione DOS in Windows
ed è scritto in C .Uno dei PC sarà la "lettura" del PC e gli altri PC sarà il
"scrittura" per PC.La "lettura" del PC solo leggere e visualizzare il numero di byte che viene inviato da
la porta seriale di "scrittura" per PC.Il problema è questo, quando i due programmi di eseguire su ogni
PC, la "lettura" del PC è la lettura da una propria porta seriale e la "scrittura" è iscritto al PC
la propria porta seriale.Essi non sono handshake o comunicare.Ho collegato i due
porte seriali tramite un cavo null-modem, ma non funziona.Mi chiedo è non vi è nulla
sbagliato con il mio codice o la fissazione di handshake.Si prega di guida!Questo è il codice per la "lettura" del PC (l'output del programma appena printf 0 byte, come
far rilevare che il 9 byte dalla "scrittura" PC?):
Codice:# include "windows.h"
# include <stdio.h>
# include <io.h>
# include <conio.h>
# include <stdlib.h># define maxBytes 32
# define MAX 128int main ()
(
MANIGLIA hSerial;
DCB dcbSerialParams = (0);
COMMTIMEOUTS timeout = (0);
DWORD dwBytesRead = 0;
char szBuff [maxBytes] = (0);
int readbytes, i;/ / apertura della porta seriale
hSerial = CreateFile ( "COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, 0);if (hSerial == INVALID_HANDLE_VALUE)
(
if (GetLastError () == ERROR_FILE_NOT_FOUND)
(
printf ( "porta seriale non esiste \ n");
)
printf ( "Altri errori \ n");
)/ / parametri di impostazione
dcbSerialParams.DCBlength = sizeof (dcbSerialParams);/ / GetCommState è quello di recuperare le attuali impostazioni di controllo per un determinatodispositivo di comunicazione.
if (! GetCommState (hSerial, & dcbSerialParams))
(
printf ( "Non GetCommState, non è in grado di recuperare l'attuale controllo. \ n");
)dcbSerialParams.BaudRate = CBR_9600;
dcbSerialParams.ByteSize = 8;
dcbSerialParams.StopBits = ONESTOPBIT;
dcbSerialParams.Parity = NOPARITY;/ / SetCommState configura un dispositivo di comunicazione in base alle specifiche
/ / nel DCB.
La funzione di controllo hardware reinizializza tutte le impostazioni, ma non
/ / vuoto code in ingresso o in uscita
if (! SetCommState (hSerial, & dcbSerialParams))
(
printf ( "Non SetCommState, non configura la porta seriale secondo DCBspecifiche di \ n ");
)/ / impostazione timeout
timeouts.ReadIntervalTimeout = 50;
timeouts.ReadTotalTimeoutConstant = 50;
timeouts.ReadTotalTimeoutMultiplier = 50;
timeouts.WriteTotalTimeoutConstant = 50;
timeouts.WriteTotalTimeoutMultiplier = 50;/ / SetCommTimeouts impostare il time out per tutti i parametri di lettura e scrittura
if (! SetCommTimeouts (hSerial, & timeout))
(
printf ( "Non SetCommTimeouts, non può impostare il timeout per i parametri di serieporto \ n ");
)if (! readfile (hSerial, szBuff, maxBytes, & dwBytesRead, NULL)) (
printf ( "Errore \ n");
)
else (
while (readfile (hSerial, szBuff, maxBytes, & dwBytesRead, NULL))
(
readbytes = sscanf ( "% d", szBuff);for (i = 0; i <readbytes; i )
(
printf ( "% c", szBuff );
)printf ( "\ n");
printf ( "Read% d byte da porta seriale. \ n", readbytes);
)/ / chiusura
CloseHandle (hSerial);
)
)
per generare la comunicazione tra l'altro.Sono di nuovo la porta seriale di programmazione e
scritto due semplici programmi per funzionare su ogni PC.Il programma è una applicazione DOS in Windows
ed è scritto in C .Uno dei PC sarà la "lettura" del PC e gli altri PC sarà il
"scrittura" per PC.La "lettura" del PC solo leggere e visualizzare il numero di byte che viene inviato da
la porta seriale di "scrittura" per PC.Il problema è questo, quando i due programmi di eseguire su ogni
PC, la "lettura" del PC è la lettura da una propria porta seriale e la "scrittura" è iscritto al PC
la propria porta seriale.Essi non sono handshake o comunicare.Ho collegato i due
porte seriali tramite un cavo null-modem, ma non funziona.Mi chiedo è non vi è nulla
sbagliato con il mio codice o la fissazione di handshake.Si prega di guida!Questo è il codice per la "lettura" del PC (l'output del programma appena printf 0 byte, come
far rilevare che il 9 byte dalla "scrittura" PC?):
Codice:# include "windows.h"
# include <stdio.h>
# include <io.h>
# include <conio.h>
# include <stdlib.h># define maxBytes 32
# define MAX 128int main ()
(
MANIGLIA hSerial;
DCB dcbSerialParams = (0);
COMMTIMEOUTS timeout = (0);
DWORD dwBytesRead = 0;
char szBuff [maxBytes] = (0);
int readbytes, i;/ / apertura della porta seriale
hSerial = CreateFile ( "COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, 0);if (hSerial == INVALID_HANDLE_VALUE)
(
if (GetLastError () == ERROR_FILE_NOT_FOUND)
(
printf ( "porta seriale non esiste \ n");
)
printf ( "Altri errori \ n");
)/ / parametri di impostazione
dcbSerialParams.DCBlength = sizeof (dcbSerialParams);/ / GetCommState è quello di recuperare le attuali impostazioni di controllo per un determinatodispositivo di comunicazione.
if (! GetCommState (hSerial, & dcbSerialParams))
(
printf ( "Non GetCommState, non è in grado di recuperare l'attuale controllo. \ n");
)dcbSerialParams.BaudRate = CBR_9600;
dcbSerialParams.ByteSize = 8;
dcbSerialParams.StopBits = ONESTOPBIT;
dcbSerialParams.Parity = NOPARITY;/ / SetCommState configura un dispositivo di comunicazione in base alle specifiche
/ / nel DCB.
La funzione di controllo hardware reinizializza tutte le impostazioni, ma non
/ / vuoto code in ingresso o in uscita
if (! SetCommState (hSerial, & dcbSerialParams))
(
printf ( "Non SetCommState, non configura la porta seriale secondo DCBspecifiche di \ n ");
)/ / impostazione timeout
timeouts.ReadIntervalTimeout = 50;
timeouts.ReadTotalTimeoutConstant = 50;
timeouts.ReadTotalTimeoutMultiplier = 50;
timeouts.WriteTotalTimeoutConstant = 50;
timeouts.WriteTotalTimeoutMultiplier = 50;/ / SetCommTimeouts impostare il time out per tutti i parametri di lettura e scrittura
if (! SetCommTimeouts (hSerial, & timeout))
(
printf ( "Non SetCommTimeouts, non può impostare il timeout per i parametri di serieporto \ n ");
)if (! readfile (hSerial, szBuff, maxBytes, & dwBytesRead, NULL)) (
printf ( "Errore \ n");
)
else (
while (readfile (hSerial, szBuff, maxBytes, & dwBytesRead, NULL))
(
readbytes = sscanf ( "% d", szBuff);for (i = 0; i <readbytes; i )
(
printf ( "% c", szBuff );
)printf ( "\ n");
printf ( "Read% d byte da porta seriale. \ n", readbytes);
)/ / chiusura
CloseHandle (hSerial);
)
)