- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我遇到了一个方式超出我专业领域的问题,而且我没有导师可以寻求帮助。
我有一台收据打印机,需要通过 iOS 应用进行交互。打印机与设备位于同一网络上,因此我可以通过支持的“线路模式命令”对其进行寻址
我想做的是保留我已有的跨平台代码——即它是一个 UIView/NSView,如果你不熟悉 OS X/iOS,它只是一个标准的普通 View 我可以渲染成 PDF/PNG 格式。值得庆幸的是,打印机具有“光栅图形”模式,这似乎正是我所需要的。
不幸的是,无论是命令规范的英文破烂,还是我对基本 C 以外的任何知识都一无所知,或者我完全缺乏图形方面的知识,我什至不知道如何从我的命令规范开始有。我知道打印机和我的网络工作因为我可以通过网络寻址它并向它发送基本的进纸命令。但是,我不知道如何从 PNG -> 打印机需要什么才能使它的“光栅模式”工作。
规范可在 http://www.star-m.jp/eng/service/usermanual/linemode_cm_en.pdf 获得,如果您想提供帮助,您希望开始阅读的页面是 3-68,而我在开始使用时遇到困难的具体命令位于 3-78/3-79。
我只能给你一个勾号,但我向你保证,如果你能为我提供一个正确方向的一点,我将永远感激你。
最佳答案
在编写了一些打印机驱动程序后,我可以确认由于打印机的工作方式,文档通常很困惑。你提到的文件对我来说实际上并不坏。
我认为您在光栅模式下打印是正确的,总体而言这将提供最佳结果。
根据 Star 文档,我认为您需要发送:
1. \x1b*rR Initialize raster mode
2. \x1b*rA Enter raster mode
3. \x1b*rC Clear raster data
4. \x1b*rml
4. b\x##\x##\xAA\xAA\xAA....<DATA>..........
5. \x1b\x0C\x00 Raster Form feed(??) - should spit out the data.
6. \x1b*rB Clear raster data
很明显。上面的\x1b是ESC的C编码(即字符27 0x1b)。
从我一直在阅读的所有文档中,以下是图像应该如何在光栅模式下格式化。在行模式下,它完全不同,因为垂直和水平被交换了。来自 THERMAL PRINTER PROGRAMMER'S MANUAL (TSP552,TSP552II,TSP2000)
这等同于以下字节流。
在第 4 个命令行上,实际上是 'b' 后跟两个定义大小的字节。此大小计算为流 % 256 和/256 中包含的像素数。因此对于 320x1 为 0x40,0x01
所以,将上面的内容插入一个简单的测试程序中,你应该用这个来测试:
char rasterImage [] = {
0x1b, '*', 'r', 'R', // Initialize raster mode
0x1b, '*', 'r', 'A', // Enter raster mode
0x1b, '*', 'r', 'C', // Clear raster data
// n1 n2 d1 d2..
0x1b, 'b', 0x2, 0, 0x00, 0x00, // data
0x1b, 'b', 0x2, 0, 0x1F, 0xF8,
0x1b, 'b', 0x2, 0, 0x3F, 0xFC,
0x1b, 'b', 0x2, 0, 0x77, 0xEE,
0x1b, 'b', 0x2, 0, 0xF8, 0x1F,
0x1b, 'b', 0x2, 0, 0xF8, 0x1F,
0x1b, 'b', 0x2, 0, 0xF8, 0x1F,
0x1b, 'b', 0x2, 0, 0x0F, 0xF0,
0x1b, 'b', 0x2, 0, 0x1F, 0xF8,
0x1b, 'b', 0x2, 0, 0x1F, 0xF8,
0x1b, 'b', 0x2, 0, 0x3E, 0x7C,
0x1b, 'b', 0x2, 0, 0x38, 0x1C,
0x1b, 'b', 0x2, 0, 0x79, 0x9E,
0x1b, 'b', 0x2, 0, 0x73, 0xCE,
0x1b, 'b', 0x2, 0, 0x73, 0xCE,
0x1b, 'b', 0x2, 0, 0xF9, 0x9F,
0x1b, 'b', 0x2, 0, 0xF8, 0x1F,
0x1b, 'b', 0x2, 0, 0xFE, 0x7F,
0x1b, 'b', 0x2, 0, 0xFF, 0xFF,
0x1b, 'b', 0x2, 0, 0xFF, 0xFF,
0x1b, 'b', 0x2, 0, 0x00, 0x00,
0x1b, 'b', 0x2, 0, 0x00, 0x00,
0x1b, 'b', 0x2, 0, 0x00, 0x00,
0x1b, 'b', 0x2, 0, 0x00, 0x00};
[self.currentDataBeingSent appendBytes:rasterImage length:sizeof(rasterImage)];
只需将其喷到打印机上,您就会得到如上图所示的照片。在这里您可以轻松地调整和使用确切的命令来获得有用的东西。通常这是我设法弄清楚应该做什么的唯一方法。
引用。评论。
如果每个像素有一个字节,那么您需要将它们合并成一系列位;以下应该根据您的 pastebin 代码完成这项工作。我还将 char*
更改为未签名,因为它已签名可能会在位操作时导致问题。
NSUInteger bitmapBytePerRow = width/8;
NSUInteger bytesPerRow = 3 + bitmapBytePerRow;
[self.currentDataBeingSent = [NSMutableData dataWithLength:bytesPerRow * height];
[self.currentDataBeingSent appendBytes:initializeRaster length:sizeof(initializeRaster)];
[self.currentDataBeingSent appendBytes:enterRaster length:sizeof(enterRaster)];
NSUInteger byteOffset = 0;
for (NSUInteger y = 0; y < height; y++)
{
unsigned char *rasterCommandForRow = (unsigned char *)calloc(bytesPerRow, sizeof(char));
unsigned char *current_raster = rasterCommandForRow;
*current_raster++ = '\x6B';
*current_raster++ = (width*height) % 256;
*current_raster++ = (width*height) / 256;
unsigned char mask = '\x80' ;
unsigned char out = 0 ;
for (NSUInteger x = 0; x < width; x++)
{
if (*(data + (byteOffset * sizeof(char))))
out |= mask ;
byteOffset++;
mask >>= 1 ;
if( 0 == mask )
{
mask = '\x80' ;
*current_raster++ = out ;
if( out )
lastDot = nextOut ;
out = 0 ;
}
}
// handle partially finished byte .
if( ( '\x80' != mask ) && ( 0 != out ) )
*current_raster++ = out ;
[self.currentDataBeingSent appendBytes:rasterCommandForRow length:bytesPerRow];
}
查看 Mac CUPS support从 Star 那里得到了驱动程序的源代码,其中包含许多有关如何完成此操作的线索。有时代码比文档更容易阅读。
starcupsdrv-3.1.1_mac_20100423.zip\starcupsdrv-3.1.1_mac\SourceCode\
包含 starcupsdrv-src-3.1.1.tar.gz\
子文件夹 starcupsdrv\src\
查看 rastertostar.c,重要的一点是 n1/n2 值的计算。这些根本不是 X 和 Y,而是基于像素数,lastBlackPixel 是来自源的像素数。
putchar('b');
putchar((char) ((lastBlackPixel > 0)?(lastBlackPixel % 256):1));
putchar((char) (lastBlackPixel / 256));
我已经修改了上面的代码以包含修复程序,希望这会更接近。如果不发布打印机输出的扫描件,这将有助于诊断正在发生的事情。
供引用 jsStarUSB.cpp 580:650 之间的代码在我看来,您需要生成一个缓冲区(存储在 nextOut
中),其中包含要直接发送到打印机的格式的光栅数据。
Joshua May 在评论中建议 rasterImage 不需要每一行的 ESC (0x1b) - 只需要 'b' 并且只需删除“对我有用”的 0x1b。
关于objective-c - 使用 'raster mode' : need basic guidance 直接打印到以太网打印机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3995703/
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 3 年前。 Improve
我正尝试在我的 iOS 应用程序中使用 WSDL 和 SOAP。我很绝望。似乎 2 个代码生成器 Sudz.com 和 WSDL2OBJC 都不合适。一个有大量内存泄漏,另一个有其他小问题。 我想要三
很像所提出的问题here ,我也有 NSDisplayOperationStack 的问题。让我先把上下文说清楚。 我有一个窗口,其中包含一个 View ,其中有一个带有多个按钮、 TextView
我是 angularjs 的新手,需要一些关于实现非常简单的东西的 Angular 方式的建议。在我的 $scope 中,我需要设置一些字段默认值,并且在我的 Controller 中多次需要这些默认
所以,我决定学习 DDD,因为它似乎可以解决我一直面临的一些架构问题。虽然有很多视频和示例博客,但我还没有遇到可以指导我解决以下情况的视频和示例博客: 假设我有实体 public class Even
我想在 DJI Mavic Pro 无人机上做一些深度学习测试,但在购买之前我想知道 Guidance SDK 使用哪些编程语言来开发这个脚本,是否可以编辑预先编写的函数这个 SDK? 我一直在搜索,
我是一名非 CIS 专业的学生,在我的大学期间正在为未成年人学习编程入门类(class)。我已经能够成功地编写我需要的大部分 PHP 文件的代码,但一直对如何在同一个文档中执行两个功能感到困惑。希
我是 iOS 开发的新手。抱歉,如果我的问题听起来很主观或内容很容易回答;但我无法在问题标题中简要描述我的问题。 我需要设计一些 View 并在它们之间导航,但我不确定什么是最好的。所以在这种情况下需
我遇到了一个方式超出我专业领域的问题,而且我没有导师可以寻求帮助。 我有一台收据打印机,需要通过 iOS 应用进行交互。打印机与设备位于同一网络上,因此我可以通过支持的“线路模式命令”对其进行寻址 我
我正在寻找一种解决方案,直接从服务器或Next-intl中的内容管理系统(CMS)加载翻译文件,而不是依赖本地翻译文件。目前,文档建议从消息目录导入翻译文件,如以下代码片段所示:。I18n.ts。然而
我正在寻找一种解决方案,直接从服务器或Next-intl中的内容管理系统(CMS)加载翻译文件,而不是依赖本地翻译文件。目前,文档建议从消息目录导入翻译文件,如以下代码片段所示:。I18n.ts。然而
因此,我的 iPhone 应用程序通过 POST 将 XML 文件中的购物车发送到 URL。这是执行此操作的代码行 NSString *pathToSerializedCart = [rootPath
我正在寻找如何将Azure AD身份验证集成到为.NET Framework4构建的遗留ASP.NET WebForms项目(特别是.aspx页面)中的指导。尽管进行了广泛的研究,但我还没有看到任何相
我是一名优秀的程序员,十分优秀!