从变量 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);
}
答案 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();
}
}