Programación del puerto serie vc
Rutina 1
Abra VC 6.0, cree un nuevo proyecto basado en diálogo RS485Comm, agregue dos botones en la ventana de diálogo principal IDD_RS485COMM_DIALOG, los ID son IDC_SEND e IDC_RECEIVE, y los títulos son respectivamente, para "Enviar" y "Recibir" agregue un cuadro de texto estático IDC_DISP para mostrar el contenido recibido por el puerto serie.
Agregue variables globales en el archivo RS485CommDlg.cpp:
HANDLE hCom; //Variables globales, identificadores de puerto serie
OnInitDialog( en el archivo RS485CommDlg.cpp ) y agregue el siguiente código: // TODO: Agregar inicialización adicional aquí
hCom=CreateFile("COM1", //Puerto COM1
GENERIC_READ|GENERIC_WRITE, //Permitir lectura y escribiendo
0, //Modo exclusivo
NULL,
OPEN_EXISTING, //Abrir en lugar de crear
0, // Modo síncrono
NULL);
if(hCom==(HANDLE)-1)
{
AfxMessageBox("Error al open COM ");
return FALSE;
}
SetupComm(hCom, 100, 100); //Los tamaños del búfer de entrada y el el buffer de salida es 1024
COMMTIMEOUTS TimeOuts;
//Establecer tiempo de espera de lectura
TimeOuts.ReadIntervalTimeout=MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier =0;
TimeOuts.ReadTotalTimeoutConstant=0;
//La operación de lectura regresa inmediatamente después de leer el contenido del búfer de entrada una vez,
//independientemente de si se lee en los caracteres requeridos.
//Establecer tiempo de espera de escritura
TimeOuts.WriteTotalTimeoutMultiplier=100;
TimeOuts.WriteTotalTimeoutConstant=500
SetCommTimeouts(hCom, amp ; TimeOuts); //Establecer tiempo de espera
DCB dcb;
GetCommState(hCom, amp; dcb); la velocidad en baudios es 9600
dcb.ByteSize=8; //Cada byte tiene 8 bits
dcb.Parity=NOPARITY; //Sin bit de paridad
dcb .StopBits=TWOSTOPBITS; //Dos bits de parada
SetCommState(hCom, amp; dcb
PurgeComm(hCom, PURGE_TXCLEAR|PURGE_RXCLEAR); >Haga doble clic en el botón IDC_SEND y en el botón IDC_RECEIVE respectivamente, y agregue las funciones de respuesta de los dos botones: void CRS485CommDlg::OnSend()
{
// TODO: Agregar su código de controlador de notificación de control aquí
// Aquí necesitamos presentar brevemente el protocolo de comunicación del XMA5000 de Baxter:
// La comunicación RS485 de este instrumento adopta el modo de transmisión del host.
//Serial half-duplex, trama 11 bits, 1 bit de inicio (0), 8 bits de datos, 2 bits de parada (1)
//Por ejemplo: Leer el instantáneo valor mostrado por el instrumento y el host envía: DC1 AAA BB ETX
//Donde: DC1 es un símbolo de control del código ASCII estándar y el valor del código es 11H (17 en decimal) p>
//En el protocolo de comunicación de XMA5000, DC1 significa leer el valor instantáneo
//AAA es el código de dirección esclava, que es la dirección de comunicación del instrumento de visualización XMA5000
//BB Es el número de canal Al leer el valor instantáneo, el valor es 01
//ETX también es un símbolo de control del código ASCII estándar y el valor del código es 03H<. /p>
//En el protocolo de comunicación de XMA5000, ETX representa el carácter final del host
char lpOutBuffer[7];
memset(lpOutBuffer, ''\0' ', 7); //Los primeros 7 bytes se borran primero
lpOutBuffer[0]=''\x11'' //El primer byte del búfer de envío es DC1
lpOutBuffer[1]=''0''; //El segundo byte es el carácter 0 (30H)
lpOutBuffer[2]=''0''; //El tercer byte es el carácter 0 ( 30H)
lpOutBuffer[3]=''1''; //El cuarto byte es el carácter 1 (31H)
lpOutBuffer[4]=''0''; /El quinto byte es el carácter 0 (30H)
lpOutBuffer[5]=''1''; //El sexto byte es el carácter 1 (31H)
lpOutBuffer[6] =' '\x03''; //El séptimo byte es el carácter ETX
//Se puede ver en este código que la dirección de comunicación del instrumento es 001
DWORD dwBytesWrite=7 ;
COMSTAT ComStat;
DWORD dwErrorFlags;
BOOL bWriteStat;
ClearCommError(hCom, amp; dwErrorFlags, amp ; ComStat) ;
bWriteStat=WriteFile(hCom, lpOutBuffer, dwBytesWrite, amp; dwBytesWrite, NULL);
if(!bWriteStat)
{ p>
AfxMessageBox("¡Error al escribir en el puerto serie!"
}
}
void CRS485CommDlg::OnReceive() ); p>
{
// TODO: agregue aquí el código del controlador de notificaciones de control
char str[100];
memset(str,'' \0'',100 );
DWORD wCount=100; //El número de bytes leídos
BOOL bReadStat;
bReadStat=ReadFile(hCom, str, wCount, amp ;wCount, NULL);
if(!bReadStat)
AfxMessageBox("¡Error al leer el puerto serie!
");
PurgeComm(hCom, PURGE_TXABORT|
PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
m_disp=str;
UpdateData( FALSE);
}
Puede observar que la cadena devuelta tiene la misma parte que el valor de visualización del instrumento y puede realizar las operaciones de cadena correspondientes para obtener el valor de visualización del instrumento <. /p>
Abra ClassWizard, agregue la variable de tipo CString m_disp al cuadro de texto estático IDC_DISP y agregue la función correspondiente de WM_CLOSE: void CRS485CommDlg::OnClose()
{
// TODO: Agregue su código de controlador de mensajes aquí y/o llame a default
CloseHandle(hCom); //Cierre el puerto serie cuando el programa salga
CDialog::OnClose; ();
p>}
Las partes correspondientes del programa se han introducido en detalle dentro del código. Conecte la parte del hardware, compile y ejecute el programa y comprenda cuidadosamente. parte de operación de sincronización del puerto serie.