关于USB小票打印机无驱打印的问题

starytx 2018-05-18 11:12:52
加精
使用CreateFile,WriteFile等系统API来操作USB小票打印机,有一款打印机在无纸的状态时,调用WriteFile发送POS指令时会阻塞住,怎么改都不行,只有把纸放进去,检测到有纸时程序才会继续走下去。试过用WriteFileEx版本(异步模式),虽然不会阻塞,但是会出现各种错误或者打印的东西混乱不堪,基本不可行(或者是我需要做更多的维护工作),有没有大佬指点一下如何入手,试过这种打开方式:
CreateFile(device.Port.c_str(), GENERIC_READ | GENERIC_WRITE,
0, NULL,
OPEN_EXISTING,
FILE_FLAG_WRITE_THROUGH, NULL); 没有作用。
...全文
4514 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
summercw 2018-07-23
  • 打赏
  • 举报
回复
没纸时提示,保存任务,有纸是运行任务
sarah.zhou 2018-07-09
  • 打赏
  • 举报
回复
USB打印机确实不好搞
specsakana 2018-07-03
  • 打赏
  • 举报
回复
around_you 2018-07-01
  • 打赏
  • 举报
回复
123
引用 22 楼 around_you 的回复:
引用 21 楼 a3192048 的回复:
USB打印机确实不好搞123
123123
around_you 2018-07-01
  • 打赏
  • 举报
回复
引用 21 楼 a3192048 的回复:
USB打印机确实不好搞123
123123
啊大1号 2018-06-30
  • 打赏
  • 举报
回复
USB打印机确实不好搞
月冷清晨 2018-06-29
  • 打赏
  • 举报
回复
时间慢来 2018-06-24
  • 打赏
  • 举报
回复
wowocpp 2018-06-24
  • 打赏
  • 举报
回复
usb 通信 他这个 阻塞是怎么实现的,用 bus hound 监控看看
  • 打赏
  • 举报
回复
学到点东西了
starytx 2018-06-21
  • 打赏
  • 举报
回复
算了,不搞了,之前的版本也是这个问题,看来这是打印机的特性,没纸一切免谈,怎么折腾也没用的。感谢回复!
zhuzhenxing886 2018-06-21
  • 打赏
  • 举报
回复
starytx 2018-06-21
  • 打赏
  • 举报
回复
引用 12 楼 youyingbo 的回复:
引用 11 楼 starytx 的回复:
[quote=引用 10 楼 youyingbo 的回复:]
当然,同步时没纸无限阻塞,等你放了纸再继续,也有他的道理,只不过有时候用户体验不好。改用异步方式,没纸时进行提示能改善用户体验,只不过等多少时间是没纸是个问题。或许你等一段时间,看看能不能检查发送的数据数目是多少,为0说明没纸,一个数据没发;大于0说明正在工作中,需要再等待。
现在主要是没纸 的话,什么指令好像都无效,包括开钱箱


这也可以啊,每个流程执行前先检查一下纸,啥都解决了[/quote]没有检查纸的指令,看手册说说的有也是只支持串口和网口的,这是USB口的
tiger波波 2018-06-21
  • 打赏
  • 举报
回复
引用 11 楼 starytx 的回复:
引用 10 楼 youyingbo 的回复:
当然,同步时没纸无限阻塞,等你放了纸再继续,也有他的道理,只不过有时候用户体验不好。改用异步方式,没纸时进行提示能改善用户体验,只不过等多少时间是没纸是个问题。或许你等一段时间,看看能不能检查发送的数据数目是多少,为0说明没纸,一个数据没发;大于0说明正在工作中,需要再等待。
现在主要是没纸 的话,什么指令好像都无效,包括开钱箱
这也可以啊,每个流程执行前先检查一下纸,啥都解决了
starytx 2018-06-20
  • 打赏
  • 举报
回复
引用 10 楼 youyingbo 的回复:
当然,同步时没纸无限阻塞,等你放了纸再继续,也有他的道理,只不过有时候用户体验不好。改用异步方式,没纸时进行提示能改善用户体验,只不过等多少时间是没纸是个问题。或许你等一段时间,看看能不能检查发送的数据数目是多少,为0说明没纸,一个数据没发;大于0说明正在工作中,需要再等待。
现在主要是没纸 的话,什么指令好像都无效,包括开钱箱
tiger波波 2018-06-20
  • 打赏
  • 举报
回复
当然,同步时没纸无限阻塞,等你放了纸再继续,也有他的道理,只不过有时候用户体验不好。改用异步方式,没纸时进行提示能改善用户体验,只不过等多少时间是没纸是个问题。或许你等一段时间,看看能不能检查发送的数据数目是多少,为0说明没纸,一个数据没发;大于0说明正在工作中,需要再等待。
tiger波波 2018-06-20
  • 打赏
  • 举报
回复
另外我觉着异步方式应该采用回调函数,等WriteFile成功后调用回调函数。你这样等10ms的方式,有纸会成功也可能程序报错
tiger波波 2018-06-20
  • 打赏
  • 举报
回复
引用 7 楼 starytx 的回复:
[quote=引用 6 楼 youyingbo 的回复:] 你用WriteFile发送个乱码(不属于任何指令)试试,不阻塞再发POS指令,如果阻塞,我觉着应该是这款打印机做的限制。
现在改成异步方式写USB口了,不会无限阻塞,感觉每次WriteFile的返回值都是失败的(不管有没有纸),随后调用GetLastError返回值是ERROR_ID_PENDING,具体代码如下:
	bSuccess = WriteFile(m_hCom, pbuff, len, &written, &m_ov);
	if (!bSuccess )
	{
		if (ERROR_IO_PENDING == GetLastError())
		{
			WaitForSingleObject(m_ov.hEvent, 10);   // 无纸或其他情况阻塞只等待10毫秒
// 			return -1;
		}
	}
其实没纸的时候还是会无限阻塞,只不过设置了只等待10ms而已[/quote] 异步情况下返回ERROR_ID_PENDING是应该的啊,不返回这个还出错呢。 我觉着同步时,如果有纸,发送WriteFile成功;没纸,发送WriteFile失败,那么就是这个打印机做的限制,目的就是多替开发人员考虑了一步
starytx 2018-06-19
  • 打赏
  • 举报
回复
引用 6 楼 youyingbo 的回复:
你用WriteFile发送个乱码(不属于任何指令)试试,不阻塞再发POS指令,如果阻塞,我觉着应该是这款打印机做的限制。
现在改成异步方式写USB口了,不会无限阻塞,感觉每次WriteFile的返回值都是失败的(不管有没有纸),随后调用GetLastError返回值是ERROR_ID_PENDING,具体代码如下:
	bSuccess = WriteFile(m_hCom, pbuff, len, &written, &m_ov);
	if (!bSuccess )
	{
		if (ERROR_IO_PENDING == GetLastError())
		{
			WaitForSingleObject(m_ov.hEvent, 10);   // 无纸或其他情况阻塞只等待10毫秒
// 			return -1;
		}
	}
其实没纸的时候还是会无限阻塞,只不过设置了只等待10ms而已
tiger波波 2018-06-19
  • 打赏
  • 举报
回复
你用WriteFile发送个乱码(不属于任何指令)试试,不阻塞再发POS指令,如果阻塞,我觉着应该是这款打印机做的限制。
加载更多回复(2)

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧