Новая строка для каждой строки, а не для каждого символа?
Данные, полученные из последовательного порта в переменной 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 ответа
Предполагая, что введенные вами данные содержат символы новой строки, используйте 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;
}
}
}
Попробуйте.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
Я хотел бы предложить, чтобы вы сначала проверили через Wireshark, что данные действительно отправляются в том формате, который вы предполагаете, так что вы можете быть уверены, что это не проблема кодирования.
Эта программа позволяет вам записывать данные, чтобы вы могли проверить их в Wireshark.