Я пишу программу последовательной связи, использующую класс SerialPort в C # для взаимодействия с стриптизером, подключенным через кабель RS232.Когда я посылаю команду на машину, она отвечает несколькими байтами в зависимости от команды.Как и при отправке команды «\ D», я ожидаю загрузки данных машинной программы размером 180 байт в виде непрерывной строки.Согласно руководству для машины, в качестве лучшей практики рекомендуется отправлять нераспознанные символы, такие как запятая (,), чтобы убедиться, что машина инициализируется перед отправкой первой команды в цикле.Мой код последовательной связи выглядит следующим образом:
public class SerialHelper
{
SerialPort commPort = null;
string currentReceived = string.Empty;
string receivedStr = string.Empty;
private bool CommInitialized()
{
try
{
commPort = new SerialPort();
commPort.PortName = "COM1";
if (!commPort.IsOpen)
commPort.Open();
commPort.BaudRate = 9600;
commPort.Parity = System.IO.Ports.Parity.None;
commPort.StopBits = StopBits.One;
commPort.DataBits = 8;
commPort.RtsEnable = true;
commPort.DtrEnable = true;
commPort.DataReceived += new SerialDataReceivedEventHandler(commPort_DataReceived);
return true;
}
catch (Exception ex)
{
return false;
}
}
void commPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort currentPort = (SerialPort)sender;
currentReceived = currentPort.ReadExisting();
receivedStr += currentReceived;
}
internal int CommIO(string outString, int outLen, ref string inBuffer, int inLen)
{
receivedStr = string.Empty;
inBuffer = string.Empty;
if (CommInitialized())
{
commPort.Write(outString);
}
System.Threading.Thread.Sleep(1500);
int i = 0;
while ((receivedStr.Length < inLen) && i < 10)
{
System.Threading.Thread.Sleep(500);
i += 1;
}
if (!string.IsNullOrEmpty(receivedStr))
{
inBuffer = receivedStr;
}
commPort.Close();
return inBuffer.Length;
}
}
Я вызываю этот код из окна формы следующим образом:
len = SerialHelperObj.CommIO(",",1,ref inBuffer, 4)
len = SerialHelperObj.CommIO(",",1,ref inBuffer, 4)
If(inBuffer == "!?*O")
{
len = SerialHelperObj.CommIO("\D",2,ref inBuffer, 180)
}
Действительное возвращаемое значение из последовательного порта выглядит следующим образом:\ D00000010000000000010 550 3250 0000256000 и т. Д. ...
Я получаю нечто вроде этого: \ D00000010D ,, 000 550 D ,, и т. Д. *
Я чувствую, что мойЗвонки комм мешают тому, когда я посылаю команды.Но я пытаюсь убедиться, что результат команды запятой затем инициирует фактическую команду.но полученный поток вставляет байты из предыдущего цикла связи.
Кто-нибудь может пролить немного света на это ...?Я потерял немного волос, просто пытаясь получить эту работу.Я не уверен, где я делаю неправильно