CEN/XFS 如何初始化ptr_raw_data发送指令为打印机设置代码页
问题解决方案
问题根因
- 缓冲区定义错误:代码中定义的
LPBYTE buffer[6]为指针数组,将数值强转为LPBYTE存储属于非法操作,存储二进制指令需使用BYTE类型数组。 - 数据拼接逻辑缺失:当前缓冲区仅存入3字节代码页设置指令
1B 74 02,未拼接待打印的fmtData内容,且打印长度参数与缓冲区实际内容不匹配,导致打印内容丢失、编码异常。 - 类型强转错误:将指针数组地址直接强转为
LPBYTE传入WFSPTRRAWDATA结构体,打印机读取到非法内存数据,无法识别指令与打印内容。
修正步骤
- 重新构造打印缓冲区,先写入3字节的代码页设置指令,再将待打印的字符串内容追加到缓冲区后方
- 打印总长度设置为指令长度与待打印字符串长度的总和
- 使用正确的
BYTE类型数组存储二进制数据,避免非法指针强转
修正后代码
std::string fmtData = text; // 总缓冲区长度 = 3字节代码页设置指令长度 + 待打印字符串长度 int totalBufferLen = 3 + fmtData.size(); LPBYTE printBuffer = new BYTE[totalBufferLen]; // 写入代码页设置指令 1B 74 02 printBuffer[0] = 0x1B; printBuffer[1] = 0x74; printBuffer[2] = 0x02; // 追加待打印内容到缓冲区 memcpy(printBuffer + 3, fmtData.c_str(), fmtData.size()); WFSPTRRAWDATA print_data = { WFS_PTR_INPUTDATA, totalBufferLen, printBuffer }; wfs_execute(WFS_CMD_PTR_RAW_DATA, &print_data, TIMEOUT_WFS_CMD_PTR_RAW_DATA, wfsResult); // 操作完成后释放缓冲区,避免内存泄漏 delete[] printBuffer;
额外注意事项
- 确认打印机支持代码页500,且
1B 74 02指令确实对应目标代码页,不同厂商打印机的ESC指令和代码页索引可能存在自定义差异,可核对官方指令手册确认。 - 待打印的
fmtData编码需要和设置的代码页500兼容,若字符串本身为UTF-8编码,需提前转码为代码页500对应的编码格式后再发送,避免出现乱码。
问题示意图

内容的提问来源于stack exchange,提问作者Marcos Dalte
相关产品推荐
相关产品推荐

