Как считывать данные с последовательного порта системы с помощью c#

#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-порт и получить из него данные. Он просто не понимает, почему данные, которые он получает обратно, не соответствуют его ожиданиям.