Newsgroup: it.comp.programmare.win32
Titolo: Impostare RS232

Sto' scrivendo un programma sotto win2000 per colloquiare con una scheda
munita di microcontrollore 8051 tramite rs-232.
Al momento l'hadware è ok (scheda+cavo con max232) e la scheda puo' essere
connessa ad un 286 (adattissimo per l'uso/prove in laboratorio) con un
software che gira sotto dos scritto un QBASIC -___- piu' di 8 anni fa'....
Il software ha l'utilità solo di test per vedere se la scheda funziona
correttamente.
Passiamo al lato pratico, ho il sorgente in BASIC sto' scrivendo il
corrispettivo in C++ che possa girare sotto win2000.
Facendo una rapida ricerca con google ho trovato delle soluzioni.
Quello che per ora mi interessa è impostare i parametri.
istruzione in BASIC:
OPEN "COM1:1200,0,7,1,RS,CS0,DS0,CD0" FOR RANDOM AS#1
COM1, 1200bps, parità dispari, 7bit, 1bit di stop, ora i segnali:
RS: Sopprime il segnale RTS
CS[t]: Controlla il segnale CTS
DS[t]: Controlla il segnale DSR
CD[t]: Controlla il segnale CD
Le opzioni CD,DS,CD permettono di specificare un tempo t (in ms) di attesa
per il segnale prima di restituire l'errore.
Ora io sto' scrivendo il programma usando le API.
hCom = CreateFile( "COM1",... // ho aperto la COM1
fSuccess = GetCommState(hCom, &dcb); //devo configurare la seriale
impostando i campi della struttura dcb
// Configura COM
dcb.BaudRate = CBR_1200; //1200bps
dcb.ByteSize = 7; //7bit
dcb.Parity = ODDPARITY; //Dispari
dcb.StopBits = ONESTOPBIT; //1 bit di stop
Il mio dubbio/problema i segnali...
dcb.fRtsControl = RTS_CONTROL_DISABLE; //Disabilitare RTS
Come faccio a impostare i tempi di ritardo?
Li disabilito?
dcb.fDsrSensitivity = FALSE; //?
dcb.fOutxCtsFlow = FALSE; //?
dcb.fOutxDsrFlow = FALSE; //?
dcb.fOutX = FALSE; //?
dcb.fInX = FALSE; //?
Altro particolare, la trasmissione analizzando il codice in basic è
asincrona. Viene inviato il bit di start (STX) il dato "0F7" (ad esempio) e
il bit di stop (ETX).
Devo prendere qualche accorgimento? Posso utilizzare ReadFile oppure devo
utilizzare ReadFileEx?
Ciao
Gio

 utilizzare ReadFileEx?
Direi che ReadFile è sufficiente anche per un protocollo di quel 
tipo.
Paolo. 

 modem no?
No. Pero' mi è sorto un problema.
Ho questo comando in basic:
PRINT #1, CHR$(2) + "0" + CHR$(5) + CHR$(3)
dove 1 è la porta COM1
viene inviato il bit di start (STX) poi uno 0, ENQ e poi il bit di stop
(ETX).
Ora se apro la porta COM1 in modalita' overlapped la utilizzo in modalità
asincrona, quindi suppongo che il bit di start e il bit di stop siano
spediti.
Per lo zero nessun problema...ma per l'ENQ(codice ascii 5)?

 
Dipende da che programma c'è dall'altra parte. Prob. con l'ENQ segnali 
all'altro capo del filo che stai aspettando i dati.
-- 
Se non conosci la netiquette o il quoting,
ti prego, prima di rispondere, leggi qui:
http://www.marco5x.net/usenet/galateo.php
http://www.marco5x.net/usenet/quoting.php

Martino Serri wrote:
<snip>
chiedo venia... non avevo letto il messaggio iniziale :P


 Per lo zero nessun problema...ma per l'ENQ(codice ascii 5)?
Come ti hanno già fatto notare STX non è affatto il bit di start 
ed ETX il bit di stop, ma sono semplicemente due byte di dati. 
Poi eviterei la modalità overlapped (o ti serve proprio? e 
perchè?). Infine per inserirli nel buffer e spedirli... beh 
dipende un po' dal tuo programma, comunque, giusto per dare 
l'idea:
char buff[4];
buff[0] = 0x02;
buff[1] = '0';
buff[2] = 0x05;
buff[3] = 0x03;
e passi buff alla WriteFile.
Paolo. 

Dovrei aver risolto in questo modo:
char lettera[2];
lettera[0] = 0x30;
lettera[1] = 0x05;
fSuccess = WriteFile(hCom,   // handle to file to write to
                      lettera,    // pointer to data to write to file
                      2,      // number of bytes to write
                      &written, // pointer to number of bytes written
                      &m_ov);   // pointer to structure needed for
overlapped I/O
Con Portman:
15.02.59 Seriale.exe IRP_MJ_WRITE Serial0 SUCCESS Length 2: 30 05
Invio quindi lo 0 e l'ENQ.
Dall'altra parte c'e' un'8051...sono andato a controllare l'asm e per fare
una determinata cosa (inviare un dato) vuole l'ENQ.
Le righe di codice che ho scritto:
#include <windows.h>
#include <winbase.h>
//#include <iostream>
//#include <stdlib.h>
#include <stdio.h>
//using namespace std;
int main(int argc, char *argv[])
{
DCB  dcb;
HANDLE  hCom;
COMMTIMEOUTS CommTimeouts;
OVERLAPPED  m_ov;   // A structure that contains informations which are
                    // used for asynchronous input and output operations
DWORD written = 0;
//LPDWORD  lpNumberOfBytesWritten = 0;
//LPOVERLAPPED  lpOverlapped = NULL;
BOOL fSuccess;
// Apre la COMM
hCom = CreateFile( "COM1",
    GENERIC_READ | GENERIC_WRITE,
    0,  /* comm devices must be opened w/exclusive-access */
    NULL, /* no security attrs */
    OPEN_EXISTING,/* comm devices must use OPEN_EXISTING */
    FILE_FLAG_OVERLAPPED,  /* overlapped I/O -> prima era
FILE_FLAG_OVERLAPPED*/
    NULL     /* hTemplate must be NULL for comm devices */
);
// Errore
if (hCom == INVALID_HANDLE_VALUE)
   {
    // Handle the error.
    printf("CreateFile failed with error %d.\n", GetLastError());
    return -1;
   }
// config della seriale
fSuccess = GetCommState(hCom, &dcb);
// Configura COM
dcb.BaudRate = CBR_1200;  //1200bps
dcb.ByteSize = 7;         //7bit
dcb.Parity = ODDPARITY;   //Dispari
dcb.StopBits = ONESTOPBIT; //1 bit di stop
dcb.fRtsControl = RTS_CONTROL_DISABLE; //Disabilitare RTS
dcb.fDsrSensitivity = FALSE; //?
dcb.fOutxCtsFlow = FALSE;  //?
dcb.fOutxDsrFlow = FALSE;  //?
dcb.fOutX = FALSE; //?
dcb.fInX = FALSE; //?
fSuccess = SetCommState(hCom, &dcb);
// Errore
if ( !fSuccess ) {
return 1;
}
//Impostare i timeout
//scrivere
// create event for overlapped I/O
m_ov.hEvent = CreateEvent(NULL,   // pointer to security attributes
                          FALSE,   // flag for manual-reset event
                          FALSE,  // flag for initial state
                          NULL);    // pointer to event-object name NULL o
""
//serve???
// Intialize the rest of the OVERLAPPED structure to zero.
m_ov.Internal = 0;
m_ov.InternalHigh = 0;
m_ov.Offset = 0;
m_ov.OffsetHigh = 0;
if ( m_ov.hEvent == INVALID_HANDLE_VALUE )
 {// Handle the error.
  printf("CreateEvent failed with error %d.\n", GetLastError());
  return -1;
 }
char lettera[2];
lettera[0] = 0x30;
lettera[1] = 0x05;
fSuccess = WriteFile(hCom,   // handle to file to write to
                      lettera,    // pointer to data to write to file
                      2,      // number of bytes to write
                      &written, // pointer to number of bytes written
                      &m_ov);   // pointer to structure needed for
overlapped I/O
// chiude la porta
CloseHandle (hCom);
return 0;
}

 perchè?). Infine per inserirli nel buffer e spedirli... beh
Devo riuscire a capire che cavolo di trasmissione usa il listato basic...a
questo punto sincrona.
A me alla fine non importa piu' di tanto, al max mi creo il mio vettore di n
caratteri dove il carattere 0 è STX e l'n-1 carattere ETX...poi appena ho la
scheda sottomano faccio le adeguate prove, fisicamente sulla seriale vengono
spediti i byete che scrive e l'STX e l'ETX vengano inseriti automaticamente?
Vorrei capire se l'STX e ETX utilizzato in qbasic sotto dos servivano solo
ai fini della scrittura su seriale.

 ai fini della scrittura su seriale.
Dovrei risolvere il problema mettendo in atto la soluzione d'inserire STX ed
ETX
tra i byte da spedire sulla seriale.
Grazie ancora per le risposte (me sbadato che è risucito anche a confondere
i bit di start e stop con dei byte... .____.)

 ha scritto nel messaggio
news:2tn90vF...@uni-berlin.de...
