Новая строка для каждой строки, а не для каждого символа?

Данные, полученные из последовательного порта в переменной myReceivedLines (код ниже) отображает новую строку для каждого символа, а не строку за строкой для каждого "предложения".

Есть ли способ заставить "предложения" появляться в отдельных строках в отличие от символа?

   //Fields
    string myReceivedLines;

    //subscriber method for the port.DataReceived Event
    private void DataReceivedHandler(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;
        myReceivedLines = sp.ReadExisting();
    }


    protected override void SolveInstance(IGH_DataAccess DA)
    {

        List<string> gcode = new List<string>();
        DA.GetDataList(0, gcode);
        string selectedportname = default(string);
        DA.GetData(1, ref selectedportname);
        int selectedbaudrate = default(int);
        DA.GetData(2, ref selectedbaudrate);
        bool connecttodevice = default(bool);
        DA.GetData(3, ref connecttodevice);

        SerialPort port = new SerialPort(selectedportname, selectedbaudrate, Parity.None, 8, StopBits.One); //Create the serial port
        port.DtrEnable = true;   //enables the Data Terminal Ready (DTR) signal during serial communication (Handshaking)

        port.Open();             //Open the port

        if ((port.IsOpen) && (connecttodevice == true))
        {
            port.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
            DA.SetDataList(0, myReceivedLines);
        }

4 ответа

Решение

Предполагая, что введенные вами данные содержат символы новой строки, используйте ReadLine для достижения этой цели. Помните, что это блокирующий вызов, если вы не настроили ReadTimeout, Я бы поставил ReceivedBytesThreshold ожидаемой средней длины строки, а также храните мои строки в любой коллекции, которая соответствует моим потребностям.

//Fields
List<string> myReceivedLines;

//subscriber method for the port.DataReceived Event
private void DataReceivedHandler(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
    SerialPort sp = (SerialPort)sender;
    while(sp.BytesToRead > 0)
    {
        try 
        {
            myReceivedLines.Add(sp.ReadLine());
        }
        catch(TimeOutException) 
        {
            break;
        }
    }
}

Попробуйте.ReadLine() вместо.ReadExisting(), это должно читать, пока не достигнет новой строки

или вы можете настроить цикл для добавления каждого символа в строку, пока не найдете все, что вам нужно, чтобы обозначить новую строку, так как вы сказали здесь предложение, вы можете проверить на период

private void DataReceivedHandler(object sender,System.IO.Ports.SerialDataReceivedEventArgs e)
{
    SerialPort sp = (SerialPort)sender;
    String s=sp.ReadExisting();
    while(s != ".")
    {
        myReceivedLines += s;
        s=sp.ReadExisting();
    }
}

Посмотрите, поможет ли включение Xon/Xoff для рукопожатия.

ОБНОВИТЬ:

Вот свойство для настройки метода рукопожатия. DTR (RequestToSend) является более распространенным:

serPort.Handshake = Handshake.XOnXOff
serPort.Handshake = Handshake.RequestToSendXOnXOff
serPort.Handshake = Handshake.RequestToSend

Я хотел бы предложить, чтобы вы сначала проверили через Wireshark, что данные действительно отправляются в том формате, который вы предполагаете, так что вы можете быть уверены, что это не проблема кодирования.
Эта программа позволяет вам записывать данные, чтобы вы могли проверить их в Wireshark.

Другие вопросы по тегам