porta seriale problemi

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);

)

)

 
Bene, questo sicuramente non come vorrei fare I / O su porta seriale, ma dal momento che non ho intenzione di dare un corso di programmazione, mi limiterò a nome che un approccio corretto è quello di aprire il file con il FILE_FLAG_OVERLAPPED insieme, fornire uno correttamente inizializzata sovrapposta struttura e di utilizzare diversi fili per la lettura e la scrittura, con la sincronizzazione in qualche luogo.

Ora nel tuo esempio, non posso notare che si chiama WriteFile con un puntatore a un buffer che si riempiono solo in seguito.Non solo ciò non è una bella cosa da fare, ma non funziona perché non è sovrapposta la modalità WriteFile non tornare finché non è fatto per iscritto 'maxBytes' byte di spazzatura,
in modo successive modifiche al buffer sono privi di significato.

All'altra estremità del tubo, si chiama readfile una volta in quello che sembra un tentativo di prova per gli errori?In realtà questo invito non sia andata e ritorno fino a quando non recita 'maxBytes' byte, o riceve un EOF.In ogni caso si scarta il leggere i dati quando si esegue la successiva chiamata in 'altro' percorso (supponendo che la chiamata riesce).

Per riassumere:
- Sul lato di lettura, rimuovere la 'if / else' e mantenere solo la ', mentre';
- Sul lato scrittura, initlialize il buffer prima della ', mentre'; rimuovere il 'if / else', ma mantenere la WriteFile (in un ', mentre', se volete).

Anche se questo funziona, io suggerisco di ricercare farlo in modo asincrono, come dovrebbe essere fatto.

Arthur

 

Welcome to EDABoard.com

Sponsor

Back
Top