Spanish Problema con impresion Bluetooth

Edu Portu

Member
Licensed User
Longtime User
Hola a todos,

Estoy desarrollando una aplicacion en la que se imprime por Bluetooth en una STAR DP8340S. La aplicacion esta casi acabada y aparentemente imprime sin problemas, pedidos, facturas, cobros, listados...

Pero haciendo ya pruebas un poco mas complejas me he dado cuenta de que cuando intento imprimir mas de 30 lineas (aproximadamente), el buffer de la impresora se vuelve loco y se pierden caracteres y lineas.

He hecho un ejemplo para delimitar el problema y con este codigo:

B4X:
Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
    'Variables para imprimir
    Dim btAdmin As BluetoothAdmin
    Dim StarDP8340s As Serial
    Dim printer As TextWriter
End Sub

Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.
   
End Sub

Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    'Activity.LoadLayout("Layout1")
   
    Dim Btn As Button
   
    Btn.Initialize("Boton")
    Btn.Text = "Imprimir prueba"
    Activity.AddView(Btn, 0, 0, 100, 100)
End Sub

Sub Boton_Click
    'Imprimimos la prueba
    btAdmin.Initialize("BlueTeeth")
    StarDP8340s.Initialize("StarPrinter")
    StartPrinter
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub


Sub StarPrinter_Connected (Success As Boolean)
    Dim i As Int
   
    If Success Then
        printer.Initialize(StarDP8340s.OutputStream)
        'Prueba
           For i = 0 To 50
            printer.WriteLine(RellenaI(i,60,"0"))
            printer.Flush
        Next
        ToastMessageShow("Impresion finalizada.....",True)
           
        printer.Close
        StarDP8340s.Disconnect
    Else
        If Msgbox2("", "Error de impresora","Reimprimir","Cancelar","",Null) = DialogResponse.POSITIVE Then
            StartPrinter
        End If
    End If
End Sub


Sub StartPrinter
    Dim PairedDevices As Map
    Dim L As List
    Dim Res As Int

    PairedDevices.Initialize

    Try
        PairedDevices = StarDP8340s.GetPairedDevices
    Catch
        Msgbox("Conectando dispositivos","Error de impresora")
        StarDP8340s.Disconnect
    End Try

    If PairedDevices.Size = 0 Then
        Msgbox("Error Conectando a la impresora - Impresora no encontrada","")
        Return
    End If

    If PairedDevices.Size = 1 Then
        Try
        StarDP8340s.ConnectInsecure(btAdmin,PairedDevices.Get(PairedDevices.GetKeyAt(0)),1)
        Catch
            Msgbox("Conectando","Error de impresora")
            StarDP8340s.Disconnect
        End Try
    Else
        L.Initialize

        For i = 0 To PairedDevices.Size - 1
            L.Add(PairedDevices.GetKeyAt(i))
        Next

        Res = InputList(L, "Elige dispositivo", -1)

        If Res <> DialogResponse.CANCEL Then
            StarDP8340s.Connect(PairedDevices.Get(L.Get(Res)))
        End If
    End If   
End Sub

Sub Replicate(Caracter As String, Ancho As Int)
    Dim Cadena As String = ""
    Dim i As Int
    For i = 0 To Ancho-1
        Cadena = Cadena & Caracter
    Next
    Return Cadena
End Sub

Sub Len(Text As String) As Int
    Return Text.Length
End Sub

Sub RellenaI(Cadena As String, Ancho As String, Car As String) As String
    Return Replicate(Car, Ancho - Len(Cadena)) & Cadena
End Sub

Empieza a imprimir y cuando va por la linea 30 imprime solo media linea, luego pasa a la 32, luego media linea 42... asi hasta llegar a la linea 50, como si se perdiesen datos del buffer de impresion.

Cada linea hago un printer.flush para que se imprima inmediatamente.

Saludos y gracias
Edu
 

Edu Portu

Member
Licensed User
Longtime User
He probado haciendo pruebas a sustituir los WriteLine

B4X:
    If Success Then
        printer.Initialize(StarDP8340s.OutputStream)
        'Prueba
           For i = 0 To 50
            printer.WriteLine(RellenaI(i,60,"0"))
            printer.Flush
        Next

por un solo WriteList

B4X:
    Dim impreso As List
   
    If Success Then
        printer.Initialize(StarDP8340s.OutputStream)
        'Prueba
        impreso.Initialize
           For i = 0 To 50
            impreso.add(RellenaI(i,60,"0"))
        Next
        printer.WriteList(impreso)
        printer.flush

y el resultado es el mismo, se cortan y pierden las lineas a partir de la 30... por si puede servir de ayuda...

Saludos y gracias
Edu
 

Edu Portu

Member
Licensed User
Longtime User
Sigo investigando, parece ser que el problema es que a la conexion Bluetooth o a la impresora se le atraganta tanto dato seguido (supongo que un problema de buffer).

He probado a hacer una pausa a mitad de impresion...

B4X:
If Success Then
        printer.Initialize(StarDP8340s.OutputStream)
        'Prueba
         For i = 0 To 50
            printer.WriteLine(RellenaI(i,60,"0"))
            printer.Flush
            if i = 25 then MsgBox("PAUSA", "PAUSA")
        Next

...e imprime las 50 lineas perfectamente.

Alguna solucion para que no se atasque el buffer? O meterle un temporizador para que despues de cada X lineas espere X segundos?

Saludos y gracias
Edu
 

Descartex

Well-Known Member
Licensed User
Longtime User
Muy buenas, Edu.
Yo intentaría ponerle una especie de retardo cada x lineas, si te funciona y no te ralentiza las operaciones, perfecto.
Prueba con varios rangos de tiempo, de menos a mas.
Un saludo.
 

JOSE HIGINIO DIZ DIOS

New Member
Licensed User
Longtime User
Hola Edu,
Ya sé que tu POS es muy antiguo y supongo que finalmente habrás solucionado tu problema que igualmente ocurría si se utilizaban las impresoras desde un PDA. El caso es que estoy pasando mi aplicación a b4a y tengo problemas al imprimir con las DP8340S con un conector de bluetooth BT-100. De momento utilicé el programa que pones de ejemplo en este POS y otros programas que encontré en el foro, pero al lanzar el programa a veces imprime, a veces no, otras da error de broken pipe, otras simplemente hace ruido la impresora pero no imprime... no consigo imprimir dos ejemplos seguidos correctamente.
No sé si en algún momento te surgió este problema y lo solucionaste... ¿podría ser un problema de librerias, manifest, versión de android? ¿podrías subirme un ejemplo que sepas con certeza que imprime cada vez que pulsas un botón de imprimir?
A ver si puedes ayudarme con el tema.
Gracias
 
Top