Я делаю программу, которая подключается к 3D-принтеру и отправляет / получает от него команды.
Я пытаюсь понять, как получить вывод из $ port.ReadLine () и отправить его в TextBox (вывод ReadOnly в моем графическом интерфейсе).
С тех пор я отредактировал этот OP, чтобы отразить, что теперь я могу нажать кнопку TEST, и сценарий выдает несколько строк вывода на хост-терминал. Между некоторыми из этих выходных строк все еще отсутствуют некоторые строки.
Кроме того, я бы хотел, чтобы это происходило в фоновом режиме, а не с помощью кнопки, чтобы я мог отправлять другие данные в порт и одновременно использовать остальную часть программы.
Я немного посмотрел на Start-Job, но еще не заставил его работать правильно, если вообще.
Мой код:
Clear-Host
$port= new-Object System.IO.Ports.SerialPort COM6,115200,None,8,one
$port.Close()
$port.Open()
Start-Sleep -Milliseconds 1000
$port.ReadTimeout = 1000
function guibutton ($window,$todo,[string]$name="Butty",[string]$text="Butty",
[int]$x=300,[int]$y=200,[int]$w=80,[int]$h=30) {
$Button = New-Object System.Windows.Forms.Button
$Button = New-Object System.Windows.Forms.TextBox
$Button.Location = New-Object System.Drawing.Size($x,$y)
$Button.Size = New-Object System.Drawing.Size($w,$h)
#$Button.Name = $name
$Button.Text = $text
$Button.Add_Click($todo)
$window.Controls.Add($Button)
}
#Generated Form Function
function GenerateForm {
#region Import the Assemblies
Add-Type -AssemblyName System.Drawing
Add-Type -AssemblyName System.Windows.Forms
#region Generated Form Objects
$MainMenu = New-Object System.Windows.Forms.Form
$MainMenu.FormBorderStyle = 'FixedDialog'
$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
#Set window size
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 140
$System_Drawing_Size.Width = 650
#Buttons
$TEST = New-Object System.Windows.Forms.Button
$EXIT = New-Object System.Windows.Forms.Button
$Connect = New-Object System.Windows.Forms.Button
$Disconnect = New-Object System.Windows.Forms.Button
#----------------------------------------------
#Generated Event Script Blocks
#----------------------------------------------
#Provide Custom Code for events specified in PrimalForms.
#Unknown
#$handler_MainMenu_Load =
$OnLoadForm_StateCorrection= { $MainMenu.WindowState = $InitialFormWindowState }
#----------------------------------------------
#Buttons
#----------------------------------------------
$TEST_OnClick={
Write-Host "Port: " + $portnumber
Write-Host "Speed: " + $baudrate
Write-Host "Getting values from COM port..."
read-com
}
$Disconnect_OnClick={
Write-Host "Closing COM port..."
$port.Close()
}
$Connect_OnClick={
$port.Open()
}
$EXIT_OnClick={
$port.Close()
Write-Host "Closing..."
$MainMenu.close()
}
# SET PROGRAM-WIDE FONT HERE
$MainMenu.ClientSize = $System_Drawing_Size
$MainMenu.DataBindings.DefaultDataSourceUpdateMode = 0
$MainMenu.Text = "NAME"
$MainMenu.TopMost = $True
$MainMenu.add_Load($handler_form1_Load)
# == TEST== #
$TEST.Text = "TEST"
$TEST.UseVisualStyleBackColor = $True
$TEST.add_Click($TEST_OnClick)
$TEST.Location = New-Object System.Drawing.Point(300,100)
$TEST.Size = New-Object System.Drawing.Size(80, 30)
# == EXIT Button == #
$EXIT.Text = "EXIT"
$EXIT.UseVisualStyleBackColor = $True
$EXIT.add_Click($EXIT_OnClick)
$EXIT.Location = New-Object System.Drawing.Point(10,100)
$EXIT.Size = New-Object System.Drawing.Size(100, 30)
# == CONNECT Button == #
$Connect.Location = New-Object System.Drawing.Point(10, 35)
$Connect.Size = New-Object System.Drawing.Size(83, 30)
$Connect.Text = "Connect"
$Connect.add_Click($Connect_OnClick)
# == DISCONNECT Button == #
$Disconnect.Text = "Disconnect"
$Disconnect.UseVisualStyleBackColor = $True
$Disconnect.add_Click($Disconnect_OnClick)
$Disconnect.Location = New-Object System.Drawing.Point(98, 35)
$Disconnect.Size = New-Object System.Drawing.Size(83, 30)
# == COM list window NEW STYLE == #
$comlist = New-Object Windows.Forms.ComboBox
$comlist.DropDownStyle = [System.Windows.Forms.ComboBoxStyle]::DropDownList;
$comlist.Items.AddRange([System.IO.Ports.SerialPort]::GetPortNames())
$comlist.location = new-object System.Drawing.Point(10,10)
$comlist.Size = New-Object System.Drawing.Size(70, 10)
$comlist.Add_SelectedValueChanged({
$script:portnumber = $comlist.SelectedItem
Write-Host $portnumber
})
# == Baudrate Selection Box == #
$comboBox1 = New-Object System.Windows.Forms.ComboBox
$comboBox1.DropDownStyle = [System.Windows.Forms.ComboBoxStyle]::DropDownList;
$comboBox1.Location = New-Object System.Drawing.Point(85, 10)
$comboBox1.Size = New-Object System.Drawing.Size(98, 10)
$comboBox1.Items.AddRange(("250000","115200"))
$comboBox1.Add_SelectedValueChanged({
$script:baudrate = $comboBox1.SelectedItem
})
$outputBox = New-Object System.Windows.Forms.TextBox
$outputBox.Location = New-Object System.Drawing.Size(10,200)
$outputBox.Size = New-Object System.Drawing.Size(200,200)
$outputBox.MultiLine = $True
$outputBox.ScrollBars = "Vertical"
$MainMenu.Controls.Add($outputBox)
$MainMenu.Controls.Add($TEST)
$MainMenu.Controls.Add($EXIT)
$MainMenu.Controls.Add($Connect)
$MainMenu.Controls.Add($Disconnect)
$MainMenu.controls.Add($comlist)
$MainMenu.controls.Add($comboBox1)
# == Save and Open Form == #
$InitialFormWindowState = $MainMenu.WindowState
$MainMenu.add_Load($OnLoadForm_StateCorrection)
$MainMenu.ShowDialog()| Out-Null
} #End Function
function read-com {
$port.WriteLine("M503")
do {
Write-Host $port.ReadLine()
Start-Sleep -Milliseconds 10
} Until ($port.ReadLine() -eq "ok")
}
#Call the Function
GenerateForm
Моя функция read-com - это то, что получает информацию из COM-порта.
Вот мой результат:
Getting values from COM port...
echo: G21 ; Units in mm (mm)
echo: M200 D1.75
echo:; Steps per unit:
echo:; Maximum feedrates (units/s):
echo:; Maximum Acceleration (units/s2):
echo:; Acceleration (units/s2): P<print_accel> R<retract_accel> T<travel_accel>
echo:; Advanced: B<min_segment_time_us> S<min_feedrate> T<min_travel_feedrate> J<junc_dev>
echo:; Home offset:
echo:; Auto Bed Leveling:
echo:; Material heatup parameters:
echo: M145 S1 H240 B90 F0
echo: M301 P21.00 I1.25 D86.00
echo: M851 X29.00 Y0.00 Z0.00
Exception calling "ReadLine" with "0" argument(s): "The operation has timed out."
At C:\Users\chevy\Desktop\GUI PROGRAM\TEST OUTPUT - Method 2.ps1:154 char:7
+ Write-Host $port.ReadLine()
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : TimeoutException
Exception calling "ReadLine" with "0" argument(s): "The operation has timed out."
At C:\Users\chevy\Desktop\GUI PROGRAM\TEST OUTPUT - Method 2.ps1:155 char:7
+ Start-Sleep -Milliseconds 10
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : TimeoutException
Вывод ДОЛЖЕН выглядеть так:
Marlin 2.0.5.3
echo: Last Updated: 2020-03-31 | Author: (Bob Kuhn, Anet config)
echo:Compiled: May 13 2020
echo: Free Memory: 11848 PlannerBufferBytes: 1456
echo:V76 stored settings retrieved (640 bytes; crc 30778)
echo: G21 ; Units in mm (mm)
echo: M149 C ; Units in Celsius
echo:; Filament settings: Disabled
echo: M200 D1.75
echo: M200 D0
echo:; Steps per unit:
echo: M92 X100.00 Y100.00 Z401.00 E439.00
echo:; Maximum feedrates (units/s):
echo: M203 X400.00 Y400.00 Z8.00 E50.00
echo:; Maximum Acceleration (units/s2):
echo: M201 X1500.00 Y1500.00 Z100.00 E5000.00
echo:; Acceleration (units/s2): P<print_accel> R<retract_accel> T<travel_accel>
echo: M204 P500.00 R1000.00 T500.00
echo:; Advanced: B<min_segment_time_us> S<min_feedrate> T<min_travel_feedrate> J<junc_dev>
echo: M205 B20000.00 S0.00 T0.00 J0.10
echo:; Home offset:
echo: M206 X0.00 Y0.00 Z0.00
echo:; Auto Bed Leveling:
echo: M420 S0 Z0.00
echo:; Material heatup parameters:
echo: M145 S0 H190 B60 F0
echo: M145 S1 H240 B90 F0
echo:; PID settings:
echo: M301 P21.00 I1.25 D86.00
echo:; Z-Probe Offset (mm):
echo: M851 X29.00 Y0.00 Z0.00
echo:SD init fail