2

変数myReceivedLines(以下のコード) でシリアル ポートから受信したデータは、すべての「文」に対して 1 行ずつではなく、すべての文字に対して新しい行を表示します。

「文」を文字ではなく別の行に表示する方法はありますか?

   //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

.ReadExisting() の代わりに .ReadLine() を試してください。これは、新しい行に到達するまで読み取る必要があります

または、ループを設定して、各文字を文字列に追加することもできます

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 に答える