Red de conocimiento informático - Material del sitio web - Cómo escribir un asistente de depuración de puerto serie usando vc++

Cómo escribir un asistente de depuración de puerto serie usando vc++

1. Cree un proyecto

2. Inserte el control MSComm en el proyecto

3. Utilice ClassWizard para definir las variables de control de clase CMSComm. p>4.Agregue controles en el cuadro de diálogo

5. Agregue la función de procesamiento de mensajes de eventos del puerto serie OnComm()

6. Abra y configure los parámetros del puerto serie.

7. Enviar datos

8. Enviar caracteres hexadecimales

9. Mostrar en hexadecimal en el cuadro de recepción

10. p >

11. ¿Cuál es el tipo de datos VARIANT? ¿Cómo utilizar el tipo de datos VARIANT?

 

1. Cree un proyecto: abra VC++6.0 y cree una aplicación MFC basada en diálogo SCommTest (igual que mi código fuente, será más conveniente para usted más adelante). );

2. Inserte el control MSComm en el proyecto, seleccione la opción Componentes y controles... en el submenú Agregar al proyecto en el menú Proyecto y haga doble clic en el elemento Controles ActiveX registrados en el archivo. cuadro de diálogo emergente (espere un momento para que este proceso sea más lento), todos los controles ActiveX registrados aparecen en el cuadro de lista. Seleccione Microsoft Communications Control, versión 6.0, haga clic en el botón Insertar para insertarlo en nuestro Proyecto y acepte las opciones predeterminadas. (Si no ve Microsoft Communications Control, versión 6.0 en la lista de control, es posible que no haya seleccionado ActiveX al instalar VC6. Simplemente reinstale VC6 y seleccione ActiveX),

En este momento, puede ver la clase CMSSomm en la ventana ClassView (nota: esta clase no se puede ver en ClassWizard, y lo mismo ocurre con la reconstrucción del archivo clw), y el icono de teléfono aparece en la barra de herramientas de Controles (como se muestra en la figura) como como se muestra en 1), lo que debe hacer ahora es usar el mouse para arrastrar este ícono al cuadro de diálogo. Después de ejecutar el programa, este ícono no será visible.

3. Utilice ClassWizard para definir el objeto de control de clase CMSComm Abra la pestaña ClassWizard->Member Viariables, seleccione la clase CSCommTestDlg y agregue la variable de control para IDC_MSCOMM1: m_ctrlComm. un vistazo al archivo de encabezado del cuadro de diálogo //{{AFX_INCLUDES() #i nclude "mscomm.h" //}}AFX_INCLUDES se agrega automáticamente (ejecute el programa en este momento, si hay un error, comience desde el principio nuevamente. ).

4. Agregue controles al cuadro de diálogo. Agregue dos cuadros de edición al cuadro de diálogo principal. Uno se usa para recibir datos de visualización con el ID de IDC_EDIT_RXDATA y el otro se usa para ingresar los datos de envío. el ID de IDC_EDIT_TXDATA Luego agregue un botón cuya función es enviar el contenido en el cuadro de edición de envío una vez cuando se presiona una vez, y establezca su ID en IDC_BUTTON_MANUALSEND. No olvide seleccionar las propiedades Miltiline y Desplazamiento vertical en Propiedades->Estilos del cuadro de edición de recepción. Si desea ingresar varias líneas de texto en el cuadro de edición de envío, también puede seleccionar Miltiline.

Abra la pestaña ClassWizard->Member Viariables, seleccione la clase CSCommTestDlg, agregue la variable CString m_strRXData para IDC_EDIT_RXDATA y agregue la variable CString m_strTXData para IDC_EDIT_TXDATA.

Descripción: m_strRXData y m_strTXData se utilizan para colocar datos de caracteres recibidos y enviados respectivamente.

5. Agregue la función de procesamiento de mensajes de eventos del puerto serie OnComm(). Abra ClassWizard->Message Maps, seleccione la clase CSCommTestDlg, seleccione IDC_MSCOMM1, haga doble clic en el mensaje OnComm y cambie el nombre de la función a OnComm. en el cuadro de diálogo emergente, (Fácil de recordar) Aceptar.

Esta función se utiliza para manejar eventos de mensajes del puerto serie. Por ejemplo, cada vez que el puerto serie recibe datos, se generará un evento de mensaje de que hay caracteres en el búfer de datos del puerto serie y la función nosotros. Se ejecutará recién agregado. Podemos lograr las funciones que queremos agregando el código de procesamiento correspondiente a la función OnComm (). Agregue el siguiente código a la función:

void CSCommTestDlg::OnComm()

{

// TODO: agregue aquí el código del controlador de notificaciones de control

VARIANT variante_inp;

COleSafeArray safearray_inp;

LONG len,k;

BYTE rxdata[2048] //Establecer matriz BYTE An Entero de 8 bits que no está firmado.

CString strtemp;

if(m_ctrlComm.GetCommEvent()==2) //Un valor de evento de 2 significa que hay caracteres en la recepción buffer

{ ////////Puede agregar código de procesamiento de acuerdo con su propio protocolo de comunicación a continuación

variante_inp=m_ctrlComm.GetInput() //Leer buffer

safearray_inp=variant_inp; //La variable VARIANT se convierte en variable ColeSafeArray

len=safearray_inp.GetOneDimSize() //Obtiene la longitud efectiva de los datos

for(k =0 ;k

safearray_inp.GetElement(&k,rxdata k);// Convertir a matriz BYTE

for(k=0;k

{

BYTE bt=*(char*)(rxdata k); //Tipo de carácter

strtemp); . Format("%c",bt); //Envía los caracteres a la variable temporal strtemp para su almacenamiento

m_strRXData =strtemp //Agrega la cadena correspondiente al cuadro de edición de recepción

<; p> }

}

UpdateData(FALSE); //Actualiza el contenido del cuadro de edición

}

Hasta ahora No se pueden ver los datos en el cuadro de edición de recepción porque aún no hemos abierto el puerto serie, pero no debería haber ningún error al ejecutar el programa. De lo contrario, no debiste haber mirado con atención porque abrí VC6 y. Escribí una línea paso a paso. Intente ejecutarlo.

¿Bien? Luego siga el siguiente paso:

6. Abra el puerto serie y configure los parámetros del puerto serie. Puede abrir el puerto serie cuando lo necesite, por ejemplo, hacer un botón de inicio en el programa y abrir el. puerto serie en la función de procesamiento del botón. Ahora abrimos el puerto serie en CSCommTestDlg::OnInitDialog() del cuadro de diálogo principal y agregamos el siguiente código:

// TODO: Agregue inicialización adicional aquí

if(m_ctrlComm. GetPortOpen())

m_ctrlComm.SetPortOpen(FALSE);

m_ctrlComm.SetCommPort(1); //Seleccione com1

if( !m_ctrlComm.GetPortOpen( ))

m_ctrlComm.SetPortOpen(TRUE);//Abre el puerto serie

else

AfxMessageBox("no se puede abrir el puerto serie");

m_ctrlComm. SetSettings("9600,n,8,1"); //Velocidad en baudios 9600, sin paridad, 8 bits de datos, 1 bit de parada

m_ctrlComm.SetInputMode(1); / Con Recuperar datos en modo binario

m_ctrlComm.SetRTreshold(1);

//El parámetro 1 significa que cada vez hay más o igual a 1 carácter en el puerto serie de recepción. buffer, un evento OnComm para recibir datos

m_ctrlComm.SetInputLen(0); //Establece la longitud de datos del área de recepción actual en 0

m_ctrlComm.GetInput(); lea primero el búfer para borrar los datos residuales

Ahora puedes probar el programa después de conectar el cable del puerto serie (¿no sabes cómo conectarlo? Consulta el método básico de cableado del puerto serie que escribí). Abra el asistente de depuración del puerto serie y configure la configuración del puerto serie. En com2, seleccione el envío automático o puede enviarlo manualmente más tarde. Ejecute el programa que escribió nuevamente y deberían aparecer datos en el cuadro de recepción.

7. Para enviar datos, primero agregue un mensaje de clic, es decir, la función de procesamiento BN_CLICKED para el botón de envío. Abra ClassWizard->Message Maps, seleccione la clase CSCommTestDlg, seleccione IDC_BUTTON_MANUALSEND y haga doble clic en BN_CLICKED. agregue la función OnButtonManualsend() y agregue la función OnButtonManualsend() en la función Agregue el siguiente código en:

void CSCommTestDlg::OnButtonManualsend()

{

// TODO: agregue aquí el código del controlador de notificaciones de control

UpdateData(TRUE); //Lea el contenido del cuadro de edición

m_ctrlComm.SetOutput(COleVariant(m_strTXData)) ; //Enviar datos

}

Ejecute el programa, ingrese cualquier cosa en el cuadro de edición de envío, haga clic en el botón enviar, ¡ah! Eche un vistazo a lo que aparece en el cuadro de recepción del asistente de depuración del puerto serie (u otra herramienta de depuración) en el otro extremo.

Si es la primera vez que incursionas en la programación de puertos serie y lo vuelves a lograr, entonces deberías darme las gracias, porque me costó mucho hacer la programación de puertos serie por primera vez, y la La información en Internet no era fácil de encontrar en ese momento. Es broma, gracias por tu apoyo, no olvides enviarme una copia si tienes algo bueno.

Finalmente, debido al uso del control VC, cuando se ejecuta en una computadora sin VC instalado, mscomm32.ocx, msvcrt.dll y mfc42.dll deben copiarse desde VC al subsistema Sistema en Windows. directorio.directorio (Win2000 es System32)

8. Enviar caracteres hexadecimales

Agregue un botón de verificación en el cuadro de diálogo principal con el ID IDC_CHECK_HEXSEND Título: Envío hexadecimal y luego use ClassWizard para agregue una variable de control: m_ctrlHexSend;

Agregue las siguientes dos funciones miembro PUBLIC a la clase SCommTestDlg en ClassView e ingrese el código correspondiente;

//Due Debido a la limitación de formato de esta función de conversión, se debe insertar un espacio entre cada dos caracteres en los caracteres hexadecimales en el cuadro de envío

//Por ejemplo: A1 23 45 0B 00 29

//CByteArray es una matriz de bytes dinámica, consulte la ayuda de MSDN

int CSCommTestDlg::String2Hex(CString str, CByteArray &senddata)

{

int hexdata,lowhexdata;

int hexdatalen=0;

int len=str.GetLength();

senddata.SetSize(len /2);

for(int i=0;i

{

char lstr,hstr=str[i];

si (hstr==' ')

{

i ;

continuar;

}

i ;

if(i>=len)

romper;

lstr=str[i];

hexdata=ConvertHexChar(hstr) ;

lowhexdata=ConvertHexChar(lstr);

if((hexdata==16)||(lowhexdata==16))

romper;

else

hexdata=hexdata*16 lowhexdata;

i ;

enviar datos[hexdatalen]=(char) hexdata;

hexdatalen;

}

enviar datos.SetSize(hexdatalen);

devolver hexdatalen;

}

//Esta es una función que convierte caracteres en valores hexadecimales correspondientes

//Se puede encontrar en muchos libros de lenguaje C

//Función: si es un carácter entre 0-F, se convierte al carácter hexadecimal correspondiente; de ​​lo contrario, se devuelve -1

char CSCommTestDlg::ConvertHexChar(char ch)

{

if ((ch>='0')&&(ch<='9'))

return ch-0x30;

si no((ch>='A')&& (ch<='F'))

return ch-'A' 10;

si no((ch>=' a')&&(ch<='f' ))

volver canal

-'a' 10;

else return (-1);

}

 

Luego CSCommTestDlg::OnButtonManualsend() Modificar al siguiente formulario:

void CSCommTestDlg::OnButtonManualsend()

{

// TODO: Agregue aquí el código del controlador de notificaciones de control

UpdateData(TRUE); //Lee el contenido del cuadro de edición

if(m_ctrlHexSend.GetCheck())

{

CByteArray hexdata;

int len=String2Hex(m_strTXData,hexdata); //El len devuelto aquí se puede utilizar para calcular cuántos números hexadecimales se envían

m_ctrlComm.SetOutput(COleVariant(hexdata)) ; //Enviar datos hexadecimales

}

else

m_ctrlComm.SetOutput(COleVariant(m_strTXData)); //Enviar datos de caracteres ASCII

p>

}

Ahora, primero conecte el cable del puerto serie y abra el asistente de depuración del puerto serie V2.1, seleccione la visualización en sistema hexadecimal, configure el puerto serie correspondiente y luego ejecute nuestro programa. en el cuadro de envío, ingrese 00 01 02 03 A1 CC y otros caracteres hexadecimales, y seleccione Enviar en hexadecimal, haga clic en Envío manual, debería ver 00 01 02 03 A1 en el cuadro de recepción del asistente de depuración del puerto serie CC.

 

9. Visualización en hexadecimal en el cuadro de recepción

Esto es mucho más fácil: agregue un botón de verificación al cuadro de diálogo principal, IDC_CHECK_HEXDISPLAY Título: Visualización hexadecimal y luego use ClassWizard para agregar una variable de control: m_ctrlHexDiaplay.

Luego modifique la función CSCommTestDlg::OnComm():

void CSCommTestDlg::OnComm()

{

// TODO: agregue su código de controlador de notificaciones de control aquí

VARIANT variante_inp;

COleSafeArray safearray_inp;

LONG len,k;

BYTE rxdata[2048] //Establecer BYTE; array Un entero de 8 bits que no está firmado.

CString strtemp;

if(m_ctrlComm.GetCommEvent()==2) //El valor del evento es 2, lo que indica que hay caracteres en el búfer de recepción

{

variant_inp=m_ctrlComm.GetInput(); //Leer el búfer

safearray_inp=variant_inp //La variable de tipo VARIANT se convierte a Variable de tipo ColeSafeArray

len=safearray_inp.GetOneDimSize(); //Obtener la longitud efectiva de los datos

for(k=0;k

safearray_inp.GetElement( &k,rxdata k);//Convertir a matriz BYTE

for(k=0;k

{

BYTE bt=*(char*)(rxdata k); //Tipo de carácter

if(m_ctrlHexDisplay.GetCheck())

strtemp. Format(" " c",bt); //Envía los caracteres a la variable temporal strtemp para su almacenamiento

m_strRXData =strtemp; //Agrega la cadena correspondiente al cuadro de edición de recepción

}

}

UpdateData(FALSE); //Actualiza el contenido del cuadro de edición

}

Prueba: ingresa 00 01 02 03 A1 en el cuadro de envío del asistente de depuración del puerto serie CC y otros caracteres hexadecimales, y seleccione Enviar en hexadecimal, haga clic en Envío manual, después de ejecutar este programa, seleccione Mostrar en hexadecimal, haga clic en Envío manual o Envío automático en el Asistente de depuración del puerto serie Entonces debería poder ver 00 01 02 03 A1 CC en el cuadro de recepción de este programa.

 

10. Cómo configurar el envío automático

La forma más sencilla de configurar el período de envío automático es utilizar la función SetTimer(), que es muy útil. En la recopilación de datos, la transmisión de instrucciones en control también puede utilizar la transmisión por tiempo.

El método es: seleccione la tarjeta MessageMap en ClassWizard, luego seleccione la clase CSCommTestDlg en ID de objetos, luego seleccione el mensaje WM_TIMER en el cuadro Mensajes, haga clic en ADD_ para unirse al vacío CSCommTestDlg::OnTimer(UINT nIDEvent ) función, esta función es el código que se procesará después de que "se acabe el tiempo":

void CSCommTestDlg::OnTimer(UINT nIDEvent)

{

/ / TODO: Agregue su código de controlador de mensajes aquí y/o llame a default

OnButtonManualsend();

CDialog::OnTimer(nIDEvent);

}

Agregue un botón de verificación en el cuadro de diálogo principal con el ID IDC_CHECK_AUTOSEND Título: Enviar automáticamente (ciclo de 1 segundo) y luego use ClassWizard para agregar la función de procesamiento de mensajes BN_CLICK void CSCommTestDlg::OnCheckAutosend():

void CSCommTestDlg::OnCheckAutosend()

{

// TODO: agregue aquí el código del controlador de notificaciones de control

m_bAutoSend=!m_bAutoSend;

if(m_bAutoSend)

{

SetTimer(1,1000,NULL);//El tiempo es 1000 milisegundos

}< / p>

else

{

KillTimer(1); //Cancelar sincronización

}

}

Entre ellos: m_bAutoSend es una variable BOOL, agregada a la clase CSCommTestDlg en CLASSVIEW e inicializada en el constructor:

m_bAutoSen=FALSE;

Ahora puedes ejecutar el prueba del programa.