Red de conocimiento informático - Problemas con los teléfonos móviles - Programación del puerto serie vc

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)

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

{

AfxMessageBox("¡Error al escribir en el puerto serie!"

}

}

void CRS485CommDlg::OnReceive()

{

// 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.