#c# #.net #serial-port
#c# #.net #последовательный порт
Вопрос:
Я пытаюсь создать программное обеспечение для взвешивания моста, в то время как пытаюсь считывать данные с помощью кода c #, показывая некоторые другие данные, подобные приведенным ниже
)0 12589 00 )0 12589 00 )0 12589 00 )0 12589 00 )0 12589 00 )0 12589 00
private void timer1_Tick(object sender, EventArgs e)
{
string Port = GenDbUtility.GetElixirConfigValue("SERIAL_PORT", Globals.CompCode);
//<-- This block ensures that no exceptions happen
if (serialPort1 != null amp;amp; serialPort1.IsOpen)
serialPort1.Close();
if (serialPort1 != null)
serialPort1.Dispose();
//<-- End of Block
serialPort1 = new SerialPort("COM1"); //<-- Creates new SerialPort using the name selected in the combobox
serialPort1.Encoding = Encoding.ASCII;
serialPort1.BaudRate = 9660;
serialPort1.Parity = Parity.None;
serialPort1.StopBits = StopBits.One;
serialPort1.DataBits = 50;
serialPort1.Handshake = Handshake.None;
serialPort1.RtsEnable = true;
serialPort1.ReadBufferSize = 4096;
serialPort1.ReceivedBytesThreshold = 100000;
serialPort1.NewLine = "rn";
serialPort1.DataReceived = new SerialDataReceivedEventHandler(serialPort1_DataReceived);
serialPort1.Open(); //<-- make the comport listen
}
void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (serialPort1.IsOpen)
{
SerialPort sp = (SerialPort)sender;
string newVal = sp.ReadExisting().ToString();
///string[] qty = newVal.Split(' ');
//txtQuantity.Invoke(this.myDelegate, new Object[] { qty[3].ToString() });
//string[] qty = newVal.Split(' ');
//decimal Quantity1 = Convert.ToDecimal(qty[0]);
//decimal Quantity2 = Convert.ToDecimal(qty[1]);
//decimal Quantity3 = Convert.ToDecimal(qty[2]);
//decimal Quantity4 = Convert.ToDecimal(qty[3]);
//txtQuantity.Text = Quantity3.ToString();
//if (String.Compare(txtQuantity.Text, qty[3]) != 0)
//{
// txtQuantity.Text = Convert.ToString(qty[3]);
// //lblweight.Text = Convert.ToString(qty[2]);
// //qty[2].ToString();
//}
}
}
Комментарии:
1. Каждый из байтов в пакете, который вы читаете, должен что-то значить. Прочитайте документацию о том, что они означают. Не все данные.
2. Попробуйте реализовать средство чтения SerialPort, как в примерах из MSDN ( msdn.microsoft.com/en-us/library /… ) Есть целый примерный класс, который вы можете использовать.
3. Может попытаться использовать инструмент для считывания COM-порта, чтобы сравнить полученный результат с полученным вами. Может ли элемент, адаптированный к COM-порту, возвращать неправильные данные.
Ответ №1:
Последовательный порт не знает, какой длины «сообщение». Устройство, с которого вы читаете, опубликует некоторую форму протокола, которой вам нужно будет следовать для чтения правильных данных.
Вы не можете предполагать sp.ReadExisting()
, что данные будут содержать ровно одно сообщение, в нем может быть меньше полного сообщения, и оно может объединять части двух сообщений вместе и возвращать их как один результат (это проблема, с которой вы столкнулись). Перейдите к документации по мосту взвешивания и прочитайте только те части, которые вы должны считывать.
Ответ №2:
com-порты можно открывать как диск, т.Е. COM1: вместо, например, C: я недостаточно использую C #, чтобы знать функции файловой системы, но в C / C его fopen() и др.
Комментарии:
1. Это не имеет ничего общего с проблемой операционной системы. Он может нормально открыть com-порт и получить из него данные. Он просто не понимает, почему данные, которые он получает обратно, не соответствуют его ожиданиям.