![Sane 停止检测 USB 扫描仪](https://linux22.com/image/1580158/Sane%20%E5%81%9C%E6%AD%A2%E6%A3%80%E6%B5%8B%20USB%20%E6%89%AB%E6%8F%8F%E4%BB%AA.png)
sane-find-scanner
我的扫描仪(MX860 多功能打印机的扫描仪功能)使用命令或使用被识别scanimage -L
。它与 Simple Scan、scanimage
实用程序和sane-backend
(使用 C++)一起工作。突然它停止工作 - Linux 上的 sane 不再识别该设备。
我正在使用双启动的 Lubuntu 18.04/Windows 10。Windows 10 仍然可以识别该扫描仪。
我在使用sane-backend
C++ 时也遇到过这种情况,但我不确定这如何导致错误——我认为代码不会破坏扫描仪的识别。该打印机肯定受 sane 支持,并且已安全连接到电源并通过 USB 电缆连接到我的计算机。
如果您认为这可能是罪魁祸首,以下是 C++ 代码。它从扫描仪读取数据并将数据保存到 PNM 图像文件中。它一直运行良好,直到outFile.open()
突然开始返回状态Invalid argument
,即scanimage -L
停止识别扫描仪。
unsigned char data[50000];
int maxLength = 50000;
int length;
std::ofstream outFile;
outFile.open("./out/test.pnm");
SANE_Handle handle;
SANE_Parameters parm;
SANE_Status openStatus = sane_open("pixma:04A91735_10C369", &handle);
SANE_Status paramStatus = sane_get_parameters(handle, &parm);
SANE_Status startStatus = sane_start(handle);
SANE_Status readStatus;
// write header of PNM file
outFile << "P6\n# SANE data follows\n" << parm.pixels_per_line << " " << parm.lines << "\n" << ((parm.depth <= 8) ? 255 : 65535) << "\n";
do {
readStatus = sane_read(handle, data, maxLength, &length);
outFile.write((const char *) data, length);
} while(readStatus == SANE_STATUS_GOOD);
sane_close(handle);
outFile.close();
// debugging
std::cout << sane_strstatus(openStatus) << std::endl;
std::cout << sane_strstatus(paramStatus) << std::endl;
std::cout << sane_strstatus(startStatus) << std::endl;
std::cout << sane_strstatus(readStatus) << " " << length << std::endl;
有什么想法吗?
答案1
几个小时后我发现了这一点。输出中scanimage -L
有以下文本:
# No USB scanners found. If you expected something different, make sure that
# you have loaded a kernel driver for your USB host controller and have setup
# the USB system correctly. See man sane-usb for details.
# SANE has been built without libusb support. This may be a reason
# for not detecting USB scanners. Read README for more details.
我安装了libusb
( )并在 sane-backends 目录中apt install libusb-1.0-0-dev
重新制作了sane-backends
() 。./configure && make && sudo make install
这解决了问题。但是,我不知道为什么该脚本在没有libusb
安装之前就能运行。