我尝试开发一种从称重机读取重量的应用程序。我已经使用WPF和MVVM来完成这项任务。
这是我的代码:
MainWindow.xaml
<Window .............>
<Window.DataContext>
<vm:MainWindowViewModel />
</Window.DataContext>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="10" />
<RowDefinition Height="Auto" />
<RowDefinition Height="10" />
<RowDefinition Height="Auto" />
<RowDefinition Height="10" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" FontSize="24" Text="Weight :" />
<TextBlock Grid.Row="0" Grid.Column="1" FontSize="24" Text="{Binding Weight}" />
<TextBlock Grid.Row="2" Grid.Column="0" FontSize="24" Text="Fat :" />
<TextBlock Grid.Row="2" Grid.Column="1" FontSize="24" Text="{Binding Fat}" />
<TextBlock Grid.Row="4" Grid.Column="0" FontSize="24" Text="Ports :" />
<ComboBox Grid.Row="4" Grid.Column="1" FontSize="24" ItemsSource="{Binding SerialPorts}"/>
</Grid>
</Window>
MainWindowViewModel.cs
public class MainWindowViewModel : ViewModelBase
{
SerialPort spCom1;
SerialPort spCom2;
public MainWindowViewModel()
{
spCom1 = new SerialPort("COM1", 9600, Parity.None, 8);
spCom1.ReadTimeout = 1000;
spCom1.DataReceived += spCom1_DataReceived;
spCom2 = new SerialPort("COM2", 9600, Parity.None, 8);
//115200 -- baudrate
spCom2.ReadTimeout = 1000;
spCom2.DataReceived += spCom2_DataReceived;
SerialPorts = new ObservableCollection<string>(SerialPort.GetPortNames());
}
void spCom1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
spCom1.Open();
Weight = spCom1.ReadExisting().ToString();
spCom1.Close();
}
void spCom2_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
spCom2.Open();
Fat = spCom2.ReadExisting().ToString();
spCom2.Close();
}
private string _weight;
public string Weight
{
get
{
return _weight;
}
set
{
_weight = value;
NotifyPropertyChanged("Weight");
}
}
private string _fat;
public string Fat
{
get
{
return _fat;
}
set
{
_fat = value;
NotifyPropertyChanged("Fat");
}
}
private ObservableCollection<string> _serialPorts;
public ObservableCollection<string> SerialPorts
{
get
{
return _serialPorts;
}
set
{
_serialPorts = value;
NotifyPropertyChanged("SerialPorts");
}
}
}
从上面提到的代码中可以看出,我正在尝试从连接到COM1的称重机获得重量。我试图从其机器中获取牛奶的脂肪含量,从RS232端口输出数据,CPU从可选的VGA端口接收信号。但是当我连接称重机时,我根本得不到任何数据。那么,我的代码有问题吗?
答案 0 :(得分:1)
void spCom1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
spCom1.Open();
....
在任何DataReceived事件发生之前,您必须打开Com端口。
您正在配置端口,但您从未打开它们。从一个简单的按钮开始。