如何在Laravel 9中读取RS232串口数据并连接打印机?
在Laravel 9中读取RS232串口数据与实现打印机连接
一、读取RS232串口数据(秤实时数据)
Laravel本身不直接提供串口操作能力,我们可以借助PHP串口类或系统命令来实现,以下是实操方案:
1. 环境准备
- 确认服务器/本地设备有RS232接口(或USB转RS232适配器),系统已识别串口设备:
- Linux:设备路径通常为
/dev/ttyUSB0//dev/ttyS0 - Windows:设备路径通常为
COM3/COM4
- Linux:设备路径通常为
- 给Web服务器用户(如Linux的
www-data)添加串口访问权限:
重启Apache/Nginx生效。sudo usermod -a -G dialout www-data
2. 集成PHP串口类
使用成熟的php_serial.class.php类库,将其放入app/Helpers目录,然后封装为服务类:
<?php namespace App\Services; require_once app_path('Helpers/php_serial.class.php'); class SerialScaleService { private $serial; public function __construct() { $this->serial = new \phpSerial(); // 按秤的说明书配置串口参数(波特率、数据位等) $this->serial->deviceSet('/dev/ttyUSB0'); $this->serial->confBaudRate(9600); $this->serial->confParity('none'); $this->serial->confCharacterLength(8); $this->serial->confStopBits(1); $this->serial->confFlowControl('none'); } public function fetchRealTimeData() { try { $this->serial->deviceOpen(); // 读取串口缓冲区数据(按需调整读取字节数) $rawData = $this->serial->readPort(1024); $this->serial->deviceClose(); // 解析秤的输出格式(示例:去除冗余空格换行) return trim($rawData); } catch (\Exception $e) { return "读取失败:{$e->getMessage()}"; } } }
3. 控制器调用
<?php namespace App\Http\Controllers; use App\Services\SerialScaleService; class ScaleController extends Controller { public function getScaleData(SerialScaleService $service) { $data = $service->fetchRealTimeData(); return response()->json(['scale_data' => $data]); } }
前端可通过AJAX定时轮询该接口,实现“实时”数据展示。
二、实现打印机连接功能
根据打印机类型(本地直连/网络打印机),提供两种方案:
1. 本地直连打印机
借助系统打印命令,结合Symfony Process组件执行打印任务:
<?php namespace App\Services; use Symfony\Component\Process\Process; class LocalPrintService { // 打印文本内容 public function printText(string $content, string $printerName = 'default') { $tempFile = tempnam(sys_get_temp_dir(), 'print_'); file_put_contents($tempFile, $content); // 根据系统选择打印命令 if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { $process = new Process(["print", "/D:$printerName", $tempFile]); } else { $process = new Process(["lp", "-d", $printerName, $tempFile]); } $process->run(); unlink($tempFile); return $process->isSuccessful() ? '打印任务已发送' : "打印失败:{$process->getErrorOutput()}"; } // 打印PDF文件(Windows需安装SumatraPDF) public function printPdf(string $pdfPath, string $printerName = 'default') { if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { $process = new Process(["SumatraPDF.exe", "-print-to", $printerName, $pdfPath]); } else { $process = new Process(["lp", "-d", $printerName, $pdfPath]); } $process->run(); return $process->isSuccessful() ? 'PDF打印任务已发送' : "PDF打印失败:{$process->getErrorOutput()}"; } }
2. 网络打印机
通过Socket连接打印机的9100端口(多数网络打印机支持)直接发送数据:
<?php namespace App\Services; class NetworkPrintService { public function sendToNetworkPrinter(string $content, string $printerIp, int $port = 9100) { try { $socket = fsockopen($printerIp, $port, $errno, $errstr, 10); if (!$socket) { return "连接打印机失败:$errstr ($errno)"; } fwrite($socket, $content); fclose($socket); return '网络打印机任务已发送'; } catch (\Exception $e) { return "打印出错:{$e->getMessage()}"; } } }
控制器调用示例
<?php namespace App\Http\Controllers; use App\Services\LocalPrintService; class PrintController extends Controller { public function printReceipt(LocalPrintService $service) { $receipt = "===== 收银小票 =====\n"; $receipt .= "商品:红富士苹果\n"; $receipt .= "数量:2斤\n"; $receipt .= "总价:16.8元\n"; $receipt .= "===================\n"; $result = $service->printText($receipt, 'EPSON_TM_T82'); return response()->json(['status' => $result]); } }
内容的提问来源于stack exchange,提问作者Omar Kech
相关产品推荐
相关产品推荐

