每行的新行而不是每个字符?

时间:2012-10-07 17:49:52

标签: c# string loops serial-port grasshopper

从变量 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 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

我建议您首先通过Wireshark检查数据是否真的以您假设的格式发送,这样您就可以确定它不是编码问题。
This program允许您记录数据,以便您可以在Wireshark中进行检查。

答案 2 :(得分:1)

查看启用握手的Xon / Xoff是否有帮助。

更新:

这是调整握手方法的属性。 DTR(RequestToSend)更常见:

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

答案 3 :(得分:1)

尝试.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();
    }
}