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

PowerShell如何设置TCP收发的行结束符为<CR>而非<LF>

解决方案:修改TCP收发的结束符为

你的问题核心在于StreamWriter.WriteLine()和StreamReader.ReadLine()默认使用**CRLF(\r\n)作为行结束符,但设备要求单独的CR(\r)**作为收发结束符。以下是具体修改点和完整脚本:

1. 发送逻辑修改

移除WriteLine()(自动添加CRLF),改用Write()手动拼接消息+CR结束符:
原代码:

$Writer.WriteLine($_)

修改为:

$Writer.Write($_ + "`r")  # `r 代表CR字符

2. 接收逻辑修改

ReadLine()无法识别单独的CR作为结束符,需要自定义读取逻辑,直到读取到CR字符为止:
替换原有的$Response = $Reader.ReadLine()为以下代码:

$responseBuilder = New-Object System.Text.StringBuilder
while ($true) {
    $char = $Reader.Read()
    if ($char -eq -1) { break } # 流结束
    if ([char]$char -eq "`r") { break } # 遇到CR结束符
    [void]$responseBuilder.Append([char]$char)
}
$Response = $responseBuilder.ToString()

完整修改后的脚本

Function Send-TCPMessage { 
    Param ( 
            [Parameter(Mandatory=$true, Position=0)]
            [ValidateNotNullOrEmpty()] 
            [string] 
            $EndPoint
        , 
            [Parameter(Mandatory=$true, Position=1)]
            [int]
            $Port
        , 
            [Parameter(Mandatory=$true, Position=2)]
            [string]
            $Message
    ) 
    Process {
        # Setup connection 
        $IP = [System.Net.Dns]::GetHostAddresses($EndPoint) 
        $Address = [System.Net.IPAddress]::Parse($IP) 
        $Socket = New-Object System.Net.Sockets.TCPClient($Address,$Port) 
    
        # Setup stream writer/reader
        $Stream = $Socket.GetStream() 
        $Writer = New-Object System.IO.StreamWriter($Stream)
        $Reader = New-Object System.IO.StreamReader($Stream)

        # Write message with CR terminator
        $Message | ForEach-Object {
            $Writer.Write($_ + "`r")  # 手动添加CR结束符
            $Writer.Flush()
        }

        # Read response until CR terminator
        $responseBuilder = New-Object System.Text.StringBuilder
        while ($true) {
            $char = $Reader.Read()
            if ($char -eq -1) { break }
            if ([char]$char -eq "`r") { break }
            [void]$responseBuilder.Append([char]$char)
        }
        $Response = $responseBuilder.ToString()

        # Close connection and stream
        $Stream.Close()
        $Socket.Close()

        return $Response
    }
}

# 发送实时日期,格式符合设备要求的[date]格式(可根据实际需求调整日期格式)
$currentDate = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$message = "[$currentDate]"
$returnMessage = Send-TCPMessage -Port 23 -Endpoint 127.0.0.1 -message $message
Write-Host "Return Message = " $returnMessage

额外说明

  • Get-Date -Format "yyyy-MM-dd HH:mm:ss"可以根据设备对日期格式的要求调整,比如设备需要特定格式,修改对应的格式字符串即可。
  • 测试时确保Hercules SETUP Utility的收发结束符设置为,这样就能和脚本的逻辑匹配。

内容的提问来源于stack exchange,提问作者bigbadplayer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 15:07:21