变量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