2

从变量中的串行端口接收的数据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

4 回答 4

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;
        }
    }
}
于 2012-10-12T08:29:07.173 回答
1

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

于 2012-10-10T09:10:41.377 回答
1

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

更新:

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

serPort.Handshake = Handshake.XOnXOff
serPort.Handshake = Handshake.RequestToSendXOnXOff
serPort.Handshake = Handshake.RequestToSend
于 2012-10-10T09:19:25.623 回答
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();
    }
}
于 2012-10-11T15:21:35.543 回答