每行换行,而不是每个字符换行



变量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);
        }

假设您的输入包含换行符,请使用 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;
        }
    }
}

我建议您首先通过Wireshark检查数据是否确实以您假设的格式发送,以便您可以确定它没有编码问题。
该程序允许您记录数据,以便您可以在Wireshark中进行检查。

尝试 。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

最新更新