Перед этим вопросом я отправляю аналогичный вопрос на Событие SerialPort DataReceived .
Итак, прежде всего, позвольте мне сначала извиниться за создание дублирующего вопроса.
Но если вы увидите ниже кодирование меня, вы обнаружите, что я пытаюсь несколькими способами (я имею в виду, немного другой подход), чтобы получить лучшее решение, которое должно взаимодействовать с последовательными портами.
Итак, допустим, у меня есть один проект консольного приложения.
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
MyTest obj = new MyTest();
}
}
}
Затем два класса, называемые MyTest и MyTest2 ...
MyTest
namespace ConsoleApplication2
{
public class MyTest
{
public SerialPort SPCOM4;
public MyTest()
{
SPCOM4 = new SerialPort();
SPCOM4.DataReceived += new SerialDataReceivedEventHandler(SPCOM4_DataReceived);
if(this.SerialPortOpen(SPCOM4, "4"))
{
this.SendToPort(SPCOM4, "[Class Name]MyTest1...");
MyTest2 objMyTest2 = new MyTest2();
Console.ReadLine();
}
}
void SPCOM4_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string data = SPCOM4.ReadExisting();
Console.Write(data.Replace("\r", "\n"));
}
private bool SerialPortOpen(System.IO.Ports.SerialPort objCom, string portName)
{
bool blnOpenStatus = false;
try
{
objCom.PortName = "COM" + portName;
objCom.BaudRate = 9600;
objCom.DataBits = 8;
int SerParity = 2;
int SerStop = 0;
switch (SerParity)
{
case 0:
objCom.Parity = System.IO.Ports.Parity.Even;
break;
case 1:
objCom.Parity = System.IO.Ports.Parity.Odd;
break;
case 2:
objCom.Parity = System.IO.Ports.Parity.None;
break;
case 3:
objCom.Parity = System.IO.Ports.Parity.Mark;
break;
}
switch (SerStop)
{
case 0:
objCom.StopBits = System.IO.Ports.StopBits.One;
break;
case 1:
objCom.StopBits = System.IO.Ports.StopBits.Two;
break;
}
objCom.RtsEnable = false;
objCom.DtrEnable = false;
objCom.Handshake = System.IO.Ports.Handshake.XOnXOff;
objCom.Open();
blnOpenStatus = true;
}
catch (Exception ex)
{
throw ex;
}
return blnOpenStatus;
}
private bool SendToPort(System.IO.Ports.SerialPort objCom, string strText)
{
try
{
int STX = 0x2;
int ETX = 0x3;
if (objCom.IsOpen && strText != "")
{
objCom.Write(Char.ConvertFromUtf32(STX) + strText + Char.ConvertFromUtf32(ETX));
}
}
catch (Exception ex)
{
throw ex;
}
return true;
}
}
}
MyTest2
namespace ConsoleApplication2
{
public class MyTest2
{
public SerialPort SPCOM4;
public MyTest2()
{
SPCOM4 = new SerialPort();
SPCOM4.DataReceived += new SerialDataReceivedEventHandler(SPCOM4_DataReceived);
if(this.SerialPortOpen(SPCOM4, "4"))
{
this.SendToPort(SPCOM4, "[Class Name]MyTest2...");
Console.ReadLine();
}
}
void SPCOM4_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string data = SPCOM4.ReadExisting();
Console.Write(data.Replace("\r", "\n"));
}
private bool SerialPortOpen(System.IO.Ports.SerialPort objCom, string portName)
{
bool blnOpenStatus = false;
try
{
objCom.PortName = "COM" + portName;
objCom.BaudRate = 9600;
objCom.DataBits = 8;
int SerParity = 2;
int SerStop = 0;
switch (SerParity)
{
case 0:
objCom.Parity = System.IO.Ports.Parity.Even;
break;
case 1:
objCom.Parity = System.IO.Ports.Parity.Odd;
break;
case 2:
objCom.Parity = System.IO.Ports.Parity.None;
break;
case 3:
objCom.Parity = System.IO.Ports.Parity.Mark;
break;
}
switch (SerStop)
{
case 0:
objCom.StopBits = System.IO.Ports.StopBits.One;
break;
case 1:
objCom.StopBits = System.IO.Ports.StopBits.Two;
break;
}
objCom.RtsEnable = false;
objCom.DtrEnable = false;
objCom.Handshake = System.IO.Ports.Handshake.XOnXOff;
objCom.Open();
blnOpenStatus = true;
}
catch (Exception ex)
{
throw ex;
}
return blnOpenStatus;
}
private bool SendToPort(System.IO.Ports.SerialPort objCom, string strText)
{
try
{
int STX = 0x2;
int ETX = 0x3;
if (objCom.IsOpen && strText != "")
{
objCom.Write(Char.ConvertFromUtf32(STX) + strText + Char.ConvertFromUtf32(ETX));
}
}
catch (Exception ex)
{
throw ex;
}
return true;
}
}
}
После того, как я запустил свое приложение, я обнаружил, что выводимое сообщение отличается от ожидаемого.
"[Class Name]MyTest2..."
выходит только это сообщение.
Мой вопрос: почему приведенный ниже код работает неправильно?
Почему DataReceived Event не запускается для первого метода.
this.SendToPort(SPCOM4, "[Class Name]MyTest1...");
Пожалуйста, дайте мне предложение.