Hallo,
ich habe einen Brailledrucker, der über Parallel, Seriell, TCP/IP und USB angesteuert werden kann. Bis auf USB funktionieren die anderen Wege. Es wird ein String erzeugt, der jeweils an die Schnittstelle gesendet wird. Dieser Drucker stanzt dann eine Grafik aus Braillepunkten in das Papier.
Nun möchte ich, dass auch über USB gedruckt werden soll. Der Treiber ist korrekt installiert und der Drucker wird auch angezeigt.
Der String "Inhalt" besteht aus ASCII-Zeichen, die der Drucker dann als die gewünschte Grafik druckt. Beispielsweise wird ein "g" als 2x2 Punkte gedruckt.
Über Seriell drucke ich folgendermaßen:
Eine herkömmliche Grafik drucke ich folgendermaßen auf einem normalen Drucker:
Folgendes habe ich, leider Erfolglos versucht:
Es erscheint folgende Fehlermeldung:
"System.ComponentModel.Win32Exception: "Der an einen Systemaufruf übergebene Datenbereich ist zu klein"
Hat jemand eine Idee, woran das liegt oder wie ich einen reinen String an einen Drucker senden kann, ohne ihn vorher auf eine PrintPage malen zu müssen?
Vielen Dank
ich habe einen Brailledrucker, der über Parallel, Seriell, TCP/IP und USB angesteuert werden kann. Bis auf USB funktionieren die anderen Wege. Es wird ein String erzeugt, der jeweils an die Schnittstelle gesendet wird. Dieser Drucker stanzt dann eine Grafik aus Braillepunkten in das Papier.
Nun möchte ich, dass auch über USB gedruckt werden soll. Der Treiber ist korrekt installiert und der Drucker wird auch angezeigt.
Der String "Inhalt" besteht aus ASCII-Zeichen, die der Drucker dann als die gewünschte Grafik druckt. Beispielsweise wird ein "g" als 2x2 Punkte gedruckt.
Über Seriell drucke ich folgendermaßen:
VB.NET-Quellcode
- Dim Anschluesse() As String
- Dim Anschluss as String = "Index Basic-D V3"
- Anschluesse = IO.Ports.SerialPort.GetPortNames()
- If Anschluesse.Length = 0 Then
- Exit Sub
- End If
- For X As Integer = 0 To Anschluesse.Length - 1
- If Anschluesse(X).ToString.ToUpper = Anschluss.ToUpper Then
- Try
- SeriellerAnschluss.PortName = Anschluesse(X)
- SeriellerAnschluss.BaudRate = CInt(Baudrate)
- SeriellerAnschluss.DataBits = CInt(Datenbits)
- If Stopbit = My.Resources.Keine Then
- SeriellerAnschluss.StopBits = IO.Ports.StopBits.None
- Else
- SeriellerAnschluss.StopBits = IO.Ports.StopBits.One
- End If
- Select Case Paritaet.ToUpper
- Case My.Resources.Keine.ToUpper
- SeriellerAnschluss.Parity = IO.Ports.Parity.None
- Case My.Resources.Ungerade.ToUpper
- SeriellerAnschluss.Parity = IO.Ports.Parity.Odd
- Case My.Resources.Gerade.ToUpper
- SeriellerAnschluss.Parity = IO.Ports.Parity.Even
- Case My.Resources.Markierung.ToUpper
- SeriellerAnschluss.Parity = IO.Ports.Parity.Mark
- Case My.Resources.Leerzeichen.ToUpper
- SeriellerAnschluss.Parity = IO.Ports.Parity.Space
- End Select
- SeriellerAnschluss.DtrEnable = True
- SeriellerAnschluss.RtsEnable = True
- Select Case Handshake
- Case My.Resources.Keine
- SeriellerAnschluss.Handshake = IO.Ports.Handshake.None
- Case "XOn/XOff"
- SeriellerAnschluss.Handshake = IO.Ports.Handshake.RequestToSendXOnXOff
- Case "Hardware"
- SeriellerAnschluss.Handshake = IO.Ports.Handshake.RequestToSend
- End Select
- If SeriellerAnschluss.IsOpen Then
- SeriellerAnschluss.Close()
- End If
- SeriellerAnschluss.Open()
- SeriellerAnschluss.Write(Inhalt & vbNewLine)
- SeriellerAnschluss.Close()
Eine herkömmliche Grafik drucke ich folgendermaßen auf einem normalen Drucker:
VB.NET-Quellcode
- 'Die zu druckende Grafik wird inclusive der Ränder auf die Druckseite kopiert. Danach wird die Druckseite ins Hochformat gedreht und schließlich
- 'ausgedruckt.
- DruckseitePuffer = New Bitmap(Seitenbreite, Seitenhoehe)
- Druckseiteobjekt = Graphics.FromImage(DruckseitePuffer)
- Druckseiteobjekt.Clear(Drawing.Color.White)
- If Bild = "Originalbild" Then
- Druckseiteobjekt.DrawImage(OriginalbildBitmap, New Rectangle(LinkerRand, ObererRand, DruckseitePuffer.Width - LinkerRand - RechterRand, DruckseitePuffer.Height - ObererRand - UntererRand), New Rectangle(0, 0, OriginalbildBitmap.Width, OriginalbildBitmap.Height), GraphicsUnit.Pixel)
- Else
- Using Ausgefuellt = New SolidBrush(Drawing.Color.Black)
- For X As Integer = 0 To PunktbildArray.GetUpperBound(0)
- For Y As Integer = 0 To PunktbildArray.GetUpperBound(1)
- If PunktbildArray(X, Y) > HelligkeitScroll.Value Then
- Druckseiteobjekt.FillEllipse(Ausgefuellt, New Rectangle(CInt((LinkerRand + (X * Punktgroesse) + (Punktgroesse / 10))), CInt(ObererRand + ((Y * Punktgroesse) + (Punktgroesse / 10))), CInt(Punktgroesse * 0.8), CInt(Punktgroesse * 0.8)))
- End If
- Next
- Next
- End Using
- End If
- If Grafikausrichtung = 1 Then
- DruckseitePuffer.RotateFlip(RotateFlipType.Rotate270FlipNone)
- End If
- DruckerObjekt.PrinterSettings.PrinterName = Farbdrucker
- DruckerObjekt.Print()
Folgendes habe ich, leider Erfolglos versucht:
VB.NET-Quellcode
- 'Die zu druckende Grafik wird inclusive der Ränder auf die Druckseite kopiert. Danach wird die Druckseite ins Hochformat gedreht und schließlich
- 'ausgedruckt.
- DruckseitePuffer = New Bitmap(Seitenbreite, Seitenhoehe)
- Druckseiteobjekt = Graphics.FromImage(DruckseitePuffer)
- Druckseiteobjekt.Clear(Drawing.Color.White)
- 'Hier die entsprechende Seite füllen
- Dim lBrush = New SolidBrush(System.Drawing.Color.Black)
- Dim lFontNorm As Font = New Font("Arial", 10)
- 'Umstellen der Maßeinheit auf Millimeter
- Druckseiteobjekt.PageUnit = GraphicsUnit.Millimeter
- Druckseiteobjekt.DrawString("Hallo Welt", lFontNorm, lBrush, 10, 10)
- DruckerObjekt.PrinterSettings.PrinterName = Farbdrucker
- DruckerObjekt.Print()
Es erscheint folgende Fehlermeldung:
"System.ComponentModel.Win32Exception: "Der an einen Systemaufruf übergebene Datenbereich ist zu klein"
Hat jemand eine Idee, woran das liegt oder wie ich einen reinen String an einen Drucker senden kann, ohne ihn vorher auf eine PrintPage malen zu müssen?
Vielen Dank