¿Cómo enviar y recibir caracteres entre dos PC?
y proceso de programación detallado (2)
Autor: Gong Jianwei 2001.8.25
Puede reimprimirlo a voluntad, pero el autor Se debe tener en cuenta y las descripciones de no se pueden utilizar comercialmente.
Contenido:
1. Crear el proyecto
2. Insertar el control MSComm en el proyecto.
3. Utilice ClassWizard para definir las variables de control de clases CMSComm.
4. Agregar controles al cuadro de diálogo
5. Agregar el controlador de mensajes de eventos en serie OnComm()
6. >
p>
Enviar datos
8. Enviar caracteres hexadecimales
9.
10. ¿Cómo configurar el archivo automático?
11. ¿Qué es el tipo de datos variables? ¿Cómo utilizar el tipo de datos VARIANT?
Esta es la continuación del programa fuente del asistente de depuración en serie y del proceso de programación detallado (1). En primer lugar, gracias por vuestro apoyo y aliento.
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íe en hexadecimal y luego use ClassWizard para agregar una variable de control: m_ctrlhexsend
Agregue las siguientes dos funciones miembro públicas a la clase SCommTestDlg en ClassView e ingrese el código correspondiente;
//Debido a las limitaciones de formato de esta función de conversión, se debe insertar un espacio entre cada dos 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::string 2 hex(CString str, CByteArray y amp envían datos)
{
int hexdata, lowhexdata
int hexdatalen = 0;
int len=str. GetLength();
Enviar datos. SetSize(len/2);
for(int I = 0; i & ltlen)
{
char lstr, hstr = str[I];
if(hstr== ' ')
{
i++;
Continuar;
}
i++;
Si (i & gt=len)
Romper;
lstr = str[I];
datos hexadecimales = ConvertHexChar(hstr);
datos hexadecimales = ConvertHexChar(lstr);
if((datos hexadecimales = = 16)| |(datos hexadecimales = = 16))
Romper;
Otros
datos hexadecimales = datos hexadecimales * 16+datos hexadecimales bajos;
i++;
enviar datos[hex datalen]=(char)hex data;
hexdatalen++;
}
Enviar datos. SetSize(hexdatalen);
Return hexdatalen
}
//Esta es una función que convierte caracteres en los valores hexadecimales correspondientes.
//Se puede encontrar en muchos libros en lenguaje C.
//Función: si es un carácter entre 0 y f, se convierte al carácter hexadecimal correspondiente; de lo contrario, se devuelve -1.
char CSCommTestDlg::ConvertHexChar(char ch)
{
If ((ch & gt= ' 0 ')& amp; & amp(ch & lt='9'))
Regresar ch-0x 30;
else if((ch & gt;= ' A ')& amp;& amp(ch & lt= 'F '))
Devuelve ch-' A '+10;
else if((ch & gt; = ' a ')& amp; & amp(ch & lt ='f '))
Devuelve ch-' a '+10;
de lo contrario devuelve (-1);
}
Luego modifique cscommtestdlg::onbuttonmanualsend() a la siguiente forma:
void CSCommTestDlg::OnButtonManualsend()
{
// TODO: Agregar aquí Control código del controlador de notificaciones
update data(TRUE); //Lee el contenido del cuadro de edición
if(m_ctrl exsend.GetCheck())
{
CByteArray hexdata
int len=String2Hex(m_strTXData, hex data); //El len devuelto aquí se puede utilizar para calcular cuántos números hexadecimales se han enviado.
m_ctrlComm. set output(variante de cole(datos hexadecimales)); //Enviar datos hexadecimales
}
Otros
m_ctrlComm. SetOutput(cole variante(m _ strTXData)); //Enviar datos de caracteres ASCII
}
Ahora, primero conecte la línea del puerto serie, abra el asistente de depuración del puerto serie V2.1. y seleccione dieciséis pantallas hexadecimales, configure el puerto serie correspondiente, luego ejecute nuestro programa, ingrese 00 01 02 03 A1 CC y otros caracteres hexadecimales en el cuadro de envío, seleccione envío hexadecimal y haga clic para enviar manualmente. Deberías ver 00 en el cuadro de recepción del Asistente de depuración del puerto serie.
9. Visualización en hexadecimal en el cuadro de recepción.
Esto es mucho más simple: agregue un botón de verificación al cuadro de diálogo principal y muéstrelo en hexadecimal, y luego use ClassWizard para agregar una variable de control: m_ctrlHexDiaplay. Luego modifique la función CSCommTestDlg::on com():
void CSCommTestDlg::on com()
{
// TODO: Agregar notificación de control aquí Código del controlador
Variante variante_inp
COleSafeArray safearray_inp
Long len, k;
Bytes rxdata[2048] // Establece el byte; matriz a un entero de 8 bits sin signo.
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(); //Búfer de lectura
safearray_inp = variante_inp//Las variables VARIANT se convierten en variables ColeSafeArray.
len=safearray_inp.
GetOneDimSize(); //Obtener la longitud de datos válida
for(k = 0; k & ltlenk++)
safearray_inpGetElement(& k, rxdata+k); array
for(k = 0; k & ltlenK++) //Convierte la matriz en una variable de tipo Cstring.
{
BYTE Bt = *(char *)(rxdata+k); //Tipo de carácter
if(m_ctrlHexDisplay.GetCheck()) p>
p>
strtemp. Format (" %02X ", Bt); //Envía caracteres a la variable temporal strtemp y los almacena en hexadecimal. Tenga en cuenta que se ha añadido un espacio aquí.
Otro
strtemp. Format("%c", Bt); //Enviar caracteres a la variable temporal strtemp para su almacenamiento.
m _ str xdata+= strtemp; //Agrega la cadena correspondiente al cuadro de edición de recepción.
}
}
update data(FALSE); //Actualiza el contenido del cuadro de edición
}
Prueba: Ingrese 00 01 02 03 A1 CC y otros caracteres hexadecimales en el cuadro de envío del asistente de depuración del puerto serie, seleccione envío hexadecimal, haga clic en envío manual, seleccione visualización hexadecimal después de ejecutar este programa y depure en el puerto serie Haga clic Envío manual o Envío automático en el asistente, entonces debería ver 00 065 438+0 0203A 65448 en el cuadro de recepción de este programa.
10. ¿Cómo configurar el archivo automático?
La forma más sencilla de configurar el período de transmisión automática es utilizar la función SetTimer(). Esta función es muy útil en la recopilación de datos, y la transmisión de instrucciones también se puede utilizar en el control.
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_FUNCTION para agregar la función Void CSCommTestDlg::on TIMER (evento uintnid) , Este es el código que se procesará cuando se acabe el tiempo:
void CSCommTestDlg::on timer(UINT nIDEvent)
{
// TODO: Agregue aquí el código del controlador de mensajes y/o la llamada predeterminada
OnButtonManualsend();
CDialog::on timer(nIDEvent);
}
Luego agregue un botón VERIFICAR con el ID IDC _ comprobar _ AUTOSEND Título: enviar automáticamente (período 1 segundo) en el cuadro de diálogo principal, y luego use ClassWizard para agregar una función de procesamiento de mensajes BN_CLICK Void CSCommtestDLG::oncheckautosend():
void CSCommTestDlg::OnCheckAutosend()
{
// TODO: Agregue el código del controlador de notificaciones de control aquí
m_bAutoSend=! m _ bAutoSend
if(m_bAutoSend)
{
SetTimer(1, 1000, vacío); //El tiempo es 1000ms.
}
Otros
{
kill timer(1); //Cancelar temporizador
}
}
Donde m_bAutoSend es una variable BOOL, agregada a la clase CSCommTestDlg en CLASSVIEW e inicializada en el constructor:
m_bAutoSen = FALSE
p >Ahora puedes ejecutar la prueba del programa.
11. ¿Qué es el tipo de datos variables? ¿Cómo utilizar el tipo de datos VARIANT?
No sé cómo utilizar el tipo de datos VARIANT. Muchos amigos tienen dolor de cabeza con el nuevo tipo de datos VARIANT. Los parámetros VARIANT requeridos en la función SetOutput() también se pueden generar simplemente usando el constructor de la clase COleVARIANT. Ahora que el valor de retorno de la función GetInput() es una variante, ¿cómo extraer contenido útil del valor de retorno? VARIANT y su clase COleVariant derivada se utilizan principalmente para la transferencia de datos en la automatización OLE. De hecho, VARIANT es solo una estructura recién definida y sus miembros principales incluyen una unión y una variable. Una unión consta de miembros de datos de varios tipos y esta variable se utiliza para indicar el tipo de datos que trabaja actualmente en la unión. Los datos recibidos que nos ocupan se almacenan en un miembro de datos del sindicato. Este complejo tiene muchos tipos de datos, desde unas pocas variables simples hasta matrices y punteros muy complejos. Debido a que lo que se recibe a través del puerto serie suele ser una cadena de bytes, usaremos uno de los arrays o punteros para acceder a los datos recibidos. Lo que te recomiendo aquí es apuntar a una variable de tipo SAFEARRAY (COleSafeArray). Como sugiere el nombre, el nuevo tipo de datos SAFEARRAY es una "matriz segura" que puede ajustar automáticamente su definición de 16 o 32 bits según el entorno del sistema y no será modificada por OLE (algunos tipos como BSTR se pasarán entre 16 y 32 bits). o aplicaciones de 32 bits) convertidas por OLE, destruyendo así los datos binarios que contiene). No necesita conocer la definición específica de SAFEARRAY, solo necesita saber que es otra estructura que contiene un puntero de tipo (void *), y la memoria a la que apunta es donde se almacenan pvData útiles. En resumen, busque el puntero Parry de la variable VARIANT devuelta por la función GetInput() y luego busque el puntero pvData de la variable SAFEARRAY a la que apunta el puntero, y podrá obtener los datos recibidos como si accediera a la matriz. Para aplicaciones específicas, consulte la función void CSCommTestDlg::on com().
Tal vez no pueda responder a esta pregunta ahora. Desde la primera vez que entré en contacto con esto hasta ahora, no se lo he explicado claramente a nadie.
Además, consulte la descripción del control MSComm para conocer la configuración del transceptor binario.