Visual Basic - ERROR Oncomm

Life is soft - evento anual de software empresarial
 
Vista:

ERROR Oncomm

Publicado por aTauRy (6 intervenciones) el 29/08/2005 13:44:40
Estoy intentando controlar un auntómata por el puerto serie, el caso es que tanto si doy a abrir puerto me dice que esta abierto, o si le doy a cerrar, me dice que esta cerrado....

He probado con sentencias if:

If Not Form1.MSComm1.PortOpen Then Form1.MSComm1.PortOpen = True

y su inversa

If Form1.MSComm1.PortOpen Then Form1.MSComm1.PortOpen = False

No se porqué me da el error (y no soy el único, a un compañero le pasa lo mismo...), eso si, si le doy a depurar el programa entonces funciona, pero a veces sale es error....

He probado a capar el error usando:
On Error Resume Next
antes de las secuenicias if... En principio va bien, solo que me ocurre que en ocasiones no esta comunicando y el resto de mi programa funciona mal...

¿se os ocurre cómo solucionarlo? ¿esta mal el mscomm?

Gracias por vuestra ayuda
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:ERROR Oncomm

Publicado por Xavi R. (29 intervenciones) el 29/08/2005 16:29:19
Bueno, suele ser un error común y suele darse a la hora de invocar portOpen antes de la asignación de los parámetros Settings = "9600,n,8,1" y CommPort = NumeroPuerto.

En el caso de que el error continue:

- Asegurate que no tengas ninguna aplicación que utilice el puerto RS232 ( impresora, lectores, modem ...). Ten en cuenta que si por ejemplo instalas los drivers para una impresora que comunique vía serie, aunque la impresora esté apagada, el driver continua bloqueando el puerto indicado y el objeto MSCOMM no puede abrir el puerto.

- ¿Probaste con otro número de puerto?

- ¿Utilizas directamente los puertos de la placa base o se trata de una placa expansora de puertos?. De tratarse de una placa expansora, accede a las propiedades y comprueba que los siguientes valores estén activados:

* Habilita CTS/RTS
* Activa usar buffer FIFO.
* Tamaño de FIFO de 8k.
* Buffer de recepción a 14
* Buffer de recepción a 16

Algunos nombres cambian dependiendo el proveedor de la placa.

Prueba estas soluciones, si no dan solución comentalo y buscaremos otro modo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:ERROR Oncomm

Publicado por aTauRy (1 intervención) el 29/08/2005 20:32:37
Hola,

Muchísimas gracias por tu respuesta, realmente útil y clara.

El puerto com1 es el de la placa base, no es una tarjeta de expansión.
No he probado con otro puerto, el ordenador con el que trabajo solo tiene 1 DB9 (com1), el otro es DB26 (¿26?) (com2) el equipo es viejo....

En cuanto a otras aplicaciones... es precisamente ese el problema, durante uno de los procesos de mi programa debo cerrar el puerto:

If Not Form1.MSComm1.PortOpen Then Form1.MSComm1.PortOpen = True

y permitir que una aplicación ajena comunique, y tras ello retornar a mi programa (ya esta cerrada la aplicación y el puerto libre). En este momento uso el de apertura:

If Form1.MSComm1.PortOpen Then Form1.MSComm1.PortOpen = False

Y lo extraño es que en depuración me dice que se cumple la condición del if, pero al continuar el programa me dice que no.... Da error al cerrar y al abrir...

El error NO sale siempre, y eso es lo peor ya que me costará mas depurarlo....

He probado a poner la instrucción "settings" antes, y parece que por hoy me funciona, espero que siga asi...

Muchas gracias, ya te contaré como va ;)

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:ERROR Oncomm

Publicado por Xavi R. (2 intervenciones) el 30/08/2005 07:48:03
Buenas, espero que todo vaya bien, pero si todavía continua el error comprueba que no estes trabajando con el evento OnComm activado (RThreshold <> 0 o SThreshold<>0 ).
En el caso de que tengas activado el evento oncomm, puede ser que al cerrar el puerto todavía queden restos en uno de los buffers de trasmisión y salte un error.

Yo siempre establezco RThreshold = 0 y SThreshold = 0. De este modo desautomatizo la captura de eventos del objeto MSCOMM y trato directamente los buffers de envio y recepción. Por otra parte, suele ir mejor trabajar así ya que eres tu quien controla la línea de comunicación con el automata. De lo contrario este evento puede enviarte a otra línea de código (evento), en tiempo de ejecución y tu creer que el error salta en otra función.

Prueba con esto si el problema persiste.

Xavi R.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:ERROR Oncomm

Publicado por aTauRy (6 intervenciones) el 30/08/2005 10:40:28
Hola,
Pues va a ser eso, necesito usar oncomm ya que el autómata me envía tramas de distintas longitudes que debo descifrar...
Tengo RThreshold = 1 y SThreshold = 0 e Inputlen=1, de esta forma salta el evento a cada caracter, los recojo de 1 en 1 y reconstruyo la trama recibida.
En principio use temporizaciones y leer el buffer directamente, sin los eventos, esto ralentizaba y bloqueaba el resto del programa, asi que tuve que usar los eventos...

De todas formas tras leer tu anterior mensaje rehice el oncomm, y usé lo de "settings" y parece ser que ahora va bien, por ahora ;)

Muchas Gracias de Nuevo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:ERROR Oncomm

Publicado por Xavi R. (29 intervenciones) el 30/08/2005 11:06:08
Una pregunta, ¿el automata envia datos aleatoriamente o la aplicación es la que desencadena la comunicación (master)? petición(app) -> respuesta(automata).

Te lo comento porque de ser así, te recomiento que crees una rutina de recepción de datos como puede ser:

Dim Buffer as string
Dim strByte as string
Tout as date

......

mscomm.output = trama_envio

buffer = ""
strByte = ""
tout = dateadd("s",5,now)
do
doevents
strByte = buffer & mscomm.input
if len(strByte) > 0 then
buffer = buffer & strByte
end if
loop until tout > now or len(strByte) = 0

.....

De este modo tendrías la trama recibida en la variable Buffer. Con la variable Tout aplicamos el tiempo de espera necesario antes de dar la comunicación como errónea.

Este código es mejorable, pero te lo muestro como pequeño ejemplo de rutina de recepción de datos estándar. Yo programo cajeros automáticos sobre VB
y todas las comunicaciones con periféricos las realizo así. Desestimé el evento onComm porque da muchisimos problemas de seguimiento de código.

Una idea, si usas Timers que también está bién, intenta usar la sentencia DoEvents en todos los bucles de este modo evitarás que la aplicación se relentice o bloquee la pantalla.

Xavi R.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:ERROR Oncomm

Publicado por aTauRy (6 intervenciones) el 30/08/2005 13:40:44
Gracias de nuevo,
la idea es buena, pero no puedo ocupar el micro con ese bucle, ya que estoy enviando y recibiendo contínuamente tramas, y en función de ellas trabajo...

Por eso usé el evento, esta es la rutina Oncomm, donde cadenaTOTAL es una variable global

Public Sub MSComm1_OnComm()
Static cadaux, caracter As String

If Form1.MSComm1.CommEvent = 2 Then 'comEvReceive Recibido nº RThreshold de caracteres.
caracter = ""
caracter = Form1.MSComm1.Input
If caracter <> Chr(13) Then 'Corto en el * la trama recibida
cadaux = cadaux + caracter
Else
CadenaTOTAL = cadaux
cadaux = ""
caracter = ""
End If
End If
End Sub

Por ahora va bien, Hasta Otra ;)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:ERROR Oncomm

Publicado por aTauRy (6 intervenciones) el 30/08/2005 19:59:17
Pues no, NO funciona.... sigue el mismo fallo...

Me estoy volviendo loco... Antes funcionaba, porque había parcheado los errores, y creía que los había quitado.

El fallo es con la 1ª cadena que envio tras haber cerrado la aplicación ajena y haber vuelto a mi programa...

Seguiré haciendo pruebas... si es solo la primera cadena parchearé el error con un contador y fiesta, a ver si asi funciona.

Ciao ;)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

ERROR Oncomm

Publicado por Silomon Tolomeo (22 intervenciones) el 30/08/2005 20:09:15
Pues vuelvete loco.... yo creo q lo mejor es q te retires de la programacion visual orientada a objetos..

Saludos Terricolas
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:ERROR Oncomm

Publicado por aTauRy (6 intervenciones) el 31/08/2005 10:21:07
Gracias artista, tu comentario me ha servido de mucho...

Ya puestos es mejor que te retires de este mundo en general XD
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:ERROR Oncomm

Publicado por Xavi R. |( (29 intervenciones) el 31/08/2005 13:41:12
Di que si aTauRy, que para escribir cosas de esas no vale la pena ni levantarse por la mañana.

Xavi R.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar