leer datos de comunicacion serial (BYTE) de indicador de peso y convertir a int

Iniciado por pedromigl010, 29 Junio 2016, 05:54 AM

0 Miembros y 5 Visitantes están viendo este tema.

pedromigl010

Buenas soy nuevo en el foro.

Mi problema es el siguiente estoy intentando leer los datos que recibo de un indicador digital de peso vía serial a mi pc. Los datos son interpretados por el dato tipo BYTE. El codigo que estoy utilizando es uno que encontre en la web es el siguiente:

#ifndef serie_h
#define serie_h

#include <windows.h>

// Open Serial port
HANDLE OpenSerialPort( char *psPort, // "COM1","COM2"
DWORD bBaudRate, // CBR_9600, CBR_19200. CBR_56000
BYTE bByteSize, // 7,8
BYTE bParity, // NOPARITY, EVENPARITY, ODDPARITY
BYTE bStopBits, // ONESTOPBIT, ONE5STOPBITS, TWOSTOPBITS
DWORD ReadTimeout   // Programmable Read Timeout
);

// Send a byte
BOOL SerialSendByte(HANDLE hPort, BYTE byte);
// return TRUE: Send OK

// Receive a byte
BOOL SerialReceiveByte(HANDLE hPort, BYTE *pbyte, BOOL *pTimeout);
// return TRUE & *pTimeout TRUE Send OK
// return TRUE & *pTimeout FALSE Timeout
// return FALSE Receive Error

// Close Serial Port
BOOL CloseSerialPort(HANDLE hPort);

// Write&Read strings from serial port using standard file I/O functions

/*BOOL ReadFile(
   HANDLE hFile, // handle of file or serial port to read
   LPVOID lpBuffer, // address of buffer that receives data  
   DWORD nNumberOfBytesToRead, // number of bytes to read
   LPDWORD lpNumberOfBytesRead, // address of number of bytes read
   LPOVERLAPPED lpOverlapped // NULL  
  );
*/

/*
BOOL WriteFile(

   HANDLE hFile, // handle to file or serial port to write to
   LPCVOID lpBuffer, // pointer to data to write to file
   DWORD nNumberOfBytesToWrite, // number of bytes to write
   LPDWORD lpNumberOfBytesWritten, // pointer to number of bytes written
   LPOVERLAPPED lpOverlapped // NULL
  );
*/

#endif

///Archivo cpp
#include "serie.h"

HANDLE OpenSerialPort( char *psPort, // "COM1","COM2"
DWORD dwBaudRate, // CBR_9600, CBR_19200. CBR_56000
BYTE bByteSize, // 7,8
BYTE bParity, // NOPARITY, EVENPARITY, ODDPARITY
BYTE bStopBits, // ONESTOPBIT, ONE5STOPBITS, TWOSTOPBITS
DWORD Timeout       // Timeout
) {

HANDLE hPort; // port handler
DCB dcbPort; // Port configuration
COMMTIMEOUTS commTimeouts; // Port Timeouts
DWORD dwError; // Error code

// Open Serial Port
hPort=CreateFile(
psPort, // pointer to name of the file
GENERIC_READ | GENERIC_WRITE, // access (read-write) mode
0, // share mode: 0 the object cannot be share
NULL, // pointer to security attributes: NULL the handle cannot be inherited
OPEN_EXISTING, // how to create: Comx exist
0, // file/port attributes
NULL); // handle to file/port with attributes to copy  

// If the function fails, the return value
//is INVALID_HANDLE_VALUE
if ( hPort == INVALID_HANDLE_VALUE ) {
dwError = GetLastError (); // Flush error code
return hPort;
}

// Set Port Configuration

// Delete DCB configuration
FillMemory(&dcbPort, sizeof(dcbPort), 0);
dcbPort.DCBlength = sizeof(dcbPort);

// Current DCB in use for the communications port
GetCommState (hPort, &dcbPort);

// Update DCB with new parameters
dcbPort.BaudRate = dwBaudRate;        
dcbPort.ByteSize = bByteSize;                
dcbPort.Parity = bParity;            
dcbPort.StopBits = bStopBits;        

// Fixed parameters (Disable XON-XOFF and modem handshake)
dcbPort.fBinary = TRUE;               // Binary mode; no EOF check
dcbPort.fParity = TRUE;               // Enable parity checking
dcbPort.fOutxCtsFlow = FALSE;         // No CTS output flow control
dcbPort.fOutxDsrFlow = FALSE;         // No DSR output flow control
dcbPort.fDtrControl = DTR_CONTROL_ENABLE;
// DTR flow control type
// Raises the DTR line when the device is opened
dcbPort.fDsrSensitivity = FALSE;       // DSR sensitivity
dcbPort.fTXContinueOnXoff = TRUE;     // XOFF continues Tx
dcbPort.fOutX = FALSE;                 // No XON/XOFF out flow control
dcbPort.fInX = FALSE;                 // No XON/XOFF in flow control
dcbPort.fErrorChar = FALSE;           // Disable error replacement
dcbPort.fNull = FALSE;                 // Disable null stripping
dcbPort.fRtsControl = RTS_CONTROL_ENABLE;
// RTS flow control
// Raises the RTS line when the device is opened
dcbPort.fAbortOnError = FALSE;         // Do not abort reads/writes on
// error
// Set new configuration
if (!SetCommState (hPort, &dcbPort)) {
dwError = GetLastError (); // Flush error code
CloseSerialPort(hPort);
hPort = INVALID_HANDLE_VALUE;
return hPort;
}

// Set Port Timeouts
// Timeouts preparation  MORE INFORMATION IN WIN32 API: COMMTIMEOUTS
commTimeouts.ReadIntervalTimeout = 0;   // Specifies the maximum time, in milliseconds, allowed to elapse between the arrival
// of two characters on the communications line
// A value of zero indicates that interval time-outs are not used.
commTimeouts.ReadTotalTimeoutMultiplier = 50;   // Specifies the multiplier, in milliseconds, used to calculate
// the total time-out period for read operations.
// For each read operation, this value is multiplied
// by the requested number of bytes to be read.
commTimeouts.ReadTotalTimeoutConstant = Timeout;// Specifies the constant, in milliseconds, used to calculate the total
// time-out period for read operations
//
commTimeouts.WriteTotalTimeoutMultiplier = 10;  // Specifies the multiplier, in milliseconds, used to calculate the
// total time-out period for write operations.
// For each write operation, this value is multiplied
// by the number of bytes to be written.
commTimeouts.WriteTotalTimeoutConstant = 1000;  // Specifies the constant, in milliseconds, used to calculate the total time-out period
// for write operations
// See de win32 api for more information
// Set Timeouts
if (!SetCommTimeouts (hPort, &commTimeouts)) {
dwError = GetLastError (); // Flush error code
CloseSerialPort(hPort);
hPort = INVALID_HANDLE_VALUE;
return hPort;
}
return hPort;
}

BOOL SerialSendByte(HANDLE hPort, BYTE byte){
BOOL bRes;
DWORD dwError, dwNumBytesWritten=0;

bRes=WriteFile(
hPort, // handle to file or serial port to write to
&byte, // pointer to data to write to file
1, // number of bytes to write
&dwNumBytesWritten, // pointer to number of bytes written
NULL // NULL
);


if ((!bRes)||(dwNumBytesWritten!=1)){
dwError = GetLastError (); // Flush error code
}
return bRes;
}

BOOL SerialReceiveByte(HANDLE hPort, BYTE *pbyte, BOOL *pTimeout){
BOOL bRes;
DWORD dwError, lpNumberOfBytesRead=0;

*pTimeout=FALSE;
bRes=ReadFile( hPort, // handle of file or serial port to read
pbyte, // address of buffer that receives data  
1, // number of bytes to read
&lpNumberOfBytesRead, // address of number of bytes read
NULL // NULL  
);

if (!bRes) {
dwError = GetLastError (); // Flush error code
}
if ((bRes)&&(lpNumberOfBytesRead==0)){
*pTimeout = TRUE;
}
return bRes;
}

BOOL CloseSerialPort(HANDLE hPort){
BOOL bRes;
DWORD dwError;

bRes=CloseHandle(hPort);
if (!bRes) {
dwError = GetLastError (); // Flush error code
}
return bRes;
}
///////////////////////////////////////////////////////////////////////////////////////////////////

#include "serie.h"
#include "windows.h"
#include "stdio.h"
#include <stdint.h>

int main(){
HANDLE hPort;
BOOL bRes;
BYTE byte;
BOOL timeout;

hPort=OpenSerialPort("COM1",CBR_9600,8,NOPARITY,TWOSTOPBITS,5000);

if (hPort==INVALID_HANDLE_VALUE){
printf("Error abriendo puerto com1");
return 1;
}

while(1){
bRes=SerialReceiveByte(hPort,&byte,&timeout);
if (!bRes) {
break;
}

if (timeout){
printf("\n--->timeout\n");
}

else
{
       putchar(byte);
}

}

if (!bRes) {
printf("Error leyendo de puerto com1");
return 1;
}

CloseSerialPort(hPort);
return 0;


bien lo que obtengo de salida  en la pantalla de la pc es lo siguiente:C°xxCx° Cx°Cx xxx° xCx x°xC C C C C C C C°xxCx° y este patron se repite constantemente. En este caso esos valores simbolizan el numero 0 que muestra el indicador digital de peso quisiera saber como puedo convertir esos valores del tipo BYTE al valor 0 Kg que muestra el indicador digital de peso pero en la pc.

Gracias de antemano por la ayuda

AlbertoBSD

Hola que marca es tu indicador digital? ¿Bascula?

La cadena

C°xxCx° Cx°Cx xxx° xCx x°xC C C C C C C C°xxCx° No indica nada sobre la salida real.
Cuando las x salen, ¿Mueves el dispositivo?

la instruccion que esta imprimiendo eso es:

putchar(byte);

El cual solo imprime un caracter de lo leído en el puerto serie... significa que la cadena que leiste es lo que mando la maquina.

Tal vez la marca nos indique el formato de  la cadwna leída

Saludos

Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

pedromigl010

Si bueno la marca del indicador digital de peso es: virtual measurement & control mod. VC 210.

Te cuento que ese patrón de caracteres C°xxCx° Cx°Cx xxx° xCx x°xC C C C C C C C°xxCx° es el que se repite constantemente cuando la bascula esta indicando el valor 0 kg absolutamente todos esos codigos, sin mover nada simplemente la bascula de mantiene en 0, porque lo digo, porque cuando cambia el valor por ejemplo 200 kg se representan otros símbolos que no poseo en este momento. Cuando vuelve a 0 kg vuelve a indicar el valor C°xxCx° Cx°Cx xxx° xCx x°xC C C C C C C C°xxCx° completo es un patron que se repite constantemente claro siempre y cuando este en 0 kg cuando cambia a otro peso cambian los codigos.
Espero que me puedan ayudar lo otro que estoy pensando es si en el codigo que estoy utilizando los parámetros de la función main son los indicados si la sincronizacion es de 9600 o en el valor de paridad esta bien, la verdad es que no se realmente. Espero que puedan ayudarme a interpretar estos codigos a valores en Kg saludos amigo

AlbertoBSD

Hola.

Tienes que encontrar  el manual, lo busque y es una pesadilla, Paginas donde te tienes que registrar y paginas diversas dondw tiens que bajar alguna app solo para el j0did0 PDF.

Baja el manual de ese modelo y tal ve ahi venga algo sobre el formato.

Saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

pedromigl010

AlbertoBSD no es necesario descargar el manual con el nombre de la marca, tengo el codigo de la placa base del indicador digital de pes es de la serie LP7510E, de todas formas el link para descargar el manual esta aca: http://www.awtscale.com/attachments/89-LP7510_indicator_manual.pdf te agradezco por la ayuda ofrecida

pedromigl010

disculpa que te envié este otro link sobre el manual es casi igual al anterior solo que este me parece que algunas cosas en la sección de comunicación presenta mejor la información http://www.vestildocs.com/manuals/scale-s_1209.pdf saludos

AlbertoBSD

En la pagina 24 de ese link que pusiste (El primero) esta el formarto que buscas, se requiere  capturar varios valores para despues ajustarlo al formato descrito en ese documento.


Dame unos minutos y te publico un codigo para procesar la salida.

por cierto u a pregunta el patron que pones, te lo pone uno por linea?

Saludos!!
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

pedromigl010

AlbertoBSD ¿como puedo adjuntar por acá una imagen? que tome a la pantalla para que puedas observar bien el patrón.

pedromigl010

y el patrón que te indique se repite aproximadamente dos veces por linea, digo aproximado porque no llega a completarse el segundo patrón en la linea. Lo que si observo es que el patrón esta compuesto de la siguiente forma:

C°xxCx°     Cx°Cx      xxx°     xCx      x°xC     C    C    C    C    C   C

Yo logro distinguir que este patrón esta compuesto de 6 a 11 valores lo cual no estoy seguro, porque digo esto, por como los caracteres están mostrados y luego viene la separación por los espacios:

C°xxCx°     Cx°Cx      xxx°     xCx      x°xC     C    C    C    C    C   C
    1                2            3          4          5                        6

y la otra forma seria:

C°xxCx°     Cx°Cx      xxx°     xCx      x°xC     C    C    C    C    C   C
    1                2            3          4          5         6    7     8    9    10  11

¿si existe la posibilidad de mostrar la imagen por este medio? si es asi mejor.

Y de verdad muchas gracias!!! si puedes publicar el código para procesar la salida del valor del indicador, de verdad me ha costado interpretar esos valores que me arroja el código,  no sabes cuanto te lo agradecería!

Saludos

pedromigl010

Los últimos 6 valores, es decir las 6 C que aparecen, en la pantalla:C°xxCx°     Cx°Cx   xxx°   xCx      x°xC     C    C    C    C    C   C representan el valor del peso de la balanza en 0 Kg. Lo menciono porque cuando el valor incremento a 4400 kg este es el resultado que me arrojo:C°xxCx°     Cx°Cx      xxx°     xCx      x°xC     C    C   C   °C   °CC   °C variando en las ultimas 3 C. Debo extraer cada uno de esos valores y convertirlos en formato de int o char para mostrarlo en mi programa, habrá alguien que pueda ayudarme con este problema? no se cada cuantos caracteres representan un byte o si cada carácter representa un byte la verdad es que no lo se.
Saludos