使用 C# 从 Mettler Toledo (IND560) 秤设备读取数据
Reading data from Mettler Toledo (IND560) scale device using C#
我在使用 C# 从 Mettler Toledo (IND560) 秤设备接收数据时遇到一些问题。
当我向设备发送 "taring" 命令 (T) 时,它工作正常但没有任何响应。 BytesToRead 始终为空,"while" 处于无限循环中。
当我发送 "send stable weight value" 命令 (S) 时,我遇到了同样的无限循环问题。我猜命令 运行 正确但没有响应。
代码如下:
private decimal? BalancaIND560(string porta, string comando) {
SerialPort SerialObj = new SerialPort(porta);
if (!SerialObj.IsOpen)
SerialObj.Open();
string retorno = "";
try {
SerialObj.BaudRate = 9600;
SerialObj.Parity = Parity.Even;
SerialObj.DataBits = 7;
SerialObj.StopBits = StopBits.One;
SerialObj.Handshake = Handshake.XOnXOff;
SerialObj.DiscardInBuffer();
SerialObj.DiscardOutBuffer();
SerialObj.Write(comando);
while ((SerialObj.BytesToRead == 0))
Application.DoEvents();
Thread.Sleep(500);
retorno = SerialObj.ReadExisting();
SerialObj.DiscardInBuffer();
SerialObj.DiscardOutBuffer();
} finally {
try { SerialObj.Close(); } catch { }
}
decimal? resultado = null;
try {
string[] aux = retorno.Split(' '); //"S S 100.52 kg"
StringBuilder sb = new StringBuilder();
for (int i = 0; i < aux.Length; i++)
sb.Append(String.Format("aux[{0}]: {1}" + Environment.NewLine, i, aux[i]));
MessageBox.Show(sb.ToString());
decimal peso = 0.0M;
if (!Decimal.TryParse(aux[6].Trim(), NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out peso))
Decimal.TryParse(aux[7].Trim(), NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out peso);
resultado = peso;
} catch { }
return resultado;
}
// Sending command
try {
decimal? peso = BalancaIND560("COM1", "S");
if (peso.HasValue)
MessageBox.Show(String.Format("Peso: {0}", peso.Value));
else
MessageBox.Show("Peso não foi encontrado", "ATENÇÃO", MessageBoxButtons.OK, MessageBoxIcon.Warning);
} catch {
MessageBox.Show("Erro ao executar comando", "ERRO", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
我找到了解决办法!我只需要更改秤配置,它就可以工作了!!!如果有人遇到同样的问题,只需将设备中的 COM
配置 (Configuration > Comunication > Conections
) 更改为 SICS
,我的代码运行得非常好!!谢谢大家!
我在使用 C# 从 Mettler Toledo (IND560) 秤设备接收数据时遇到一些问题。
当我向设备发送 "taring" 命令 (T) 时,它工作正常但没有任何响应。 BytesToRead 始终为空,"while" 处于无限循环中。
当我发送 "send stable weight value" 命令 (S) 时,我遇到了同样的无限循环问题。我猜命令 运行 正确但没有响应。
代码如下:
private decimal? BalancaIND560(string porta, string comando) {
SerialPort SerialObj = new SerialPort(porta);
if (!SerialObj.IsOpen)
SerialObj.Open();
string retorno = "";
try {
SerialObj.BaudRate = 9600;
SerialObj.Parity = Parity.Even;
SerialObj.DataBits = 7;
SerialObj.StopBits = StopBits.One;
SerialObj.Handshake = Handshake.XOnXOff;
SerialObj.DiscardInBuffer();
SerialObj.DiscardOutBuffer();
SerialObj.Write(comando);
while ((SerialObj.BytesToRead == 0))
Application.DoEvents();
Thread.Sleep(500);
retorno = SerialObj.ReadExisting();
SerialObj.DiscardInBuffer();
SerialObj.DiscardOutBuffer();
} finally {
try { SerialObj.Close(); } catch { }
}
decimal? resultado = null;
try {
string[] aux = retorno.Split(' '); //"S S 100.52 kg"
StringBuilder sb = new StringBuilder();
for (int i = 0; i < aux.Length; i++)
sb.Append(String.Format("aux[{0}]: {1}" + Environment.NewLine, i, aux[i]));
MessageBox.Show(sb.ToString());
decimal peso = 0.0M;
if (!Decimal.TryParse(aux[6].Trim(), NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out peso))
Decimal.TryParse(aux[7].Trim(), NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out peso);
resultado = peso;
} catch { }
return resultado;
}
// Sending command
try {
decimal? peso = BalancaIND560("COM1", "S");
if (peso.HasValue)
MessageBox.Show(String.Format("Peso: {0}", peso.Value));
else
MessageBox.Show("Peso não foi encontrado", "ATENÇÃO", MessageBoxButtons.OK, MessageBoxIcon.Warning);
} catch {
MessageBox.Show("Erro ao executar comando", "ERRO", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
我找到了解决办法!我只需要更改秤配置,它就可以工作了!!!如果有人遇到同样的问题,只需将设备中的 COM
配置 (Configuration > Comunication > Conections
) 更改为 SICS
,我的代码运行得非常好!!谢谢大家!