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
相关产品推荐
相关产品推荐

