You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Laravel 9中读取RS232串口数据并连接打印机?

在Laravel 9中读取RS232串口数据与实现打印机连接

一、读取RS232串口数据(秤实时数据)

Laravel本身不直接提供串口操作能力,我们可以借助PHP串口类或系统命令来实现,以下是实操方案:

1. 环境准备

  • 确认服务器/本地设备有RS232接口(或USB转RS232适配器),系统已识别串口设备:
    • Linux:设备路径通常为 /dev/ttyUSB0//dev/ttyS0
    • Windows:设备路径通常为 COM3/COM4
  • 给Web服务器用户(如Linux的www-data)添加串口访问权限:
    sudo usermod -a -G dialout www-data
    
    重启Apache/Nginx生效。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 19:00:10