SerialPort pas recevoir de données

Je suis l'élaboration du programme qui ont besoin d'interagir avec les ports COM.

Par apprentissage à partir de ce Q&A: .NET SerialPort DataReceived cas, pas de tir, je fais mon code comme ça.

namespace ConsoleApplication1
{
class Program
{
static SerialPort ComPort;        
public static void OnSerialDataReceived(object sender, SerialDataReceivedEventArgs args)
{
string data = ComPort.ReadExisting();
Console.Write(data.Replace("\r", "\n"));
}
static void Main(string[] args)
{
string port = "COM4";
int baud = 9600;
if (args.Length >= 1)
{
port = args[0];
}
if (args.Length >= 2)
{
baud = int.Parse(args[1]);
}
InitializeComPort(port, baud);
string text;
do
{
String[] mystring = System.IO.Ports.SerialPort.GetPortNames();
text = Console.ReadLine();
int STX = 0x2;
int ETX = 0x3;
ComPort.Write(Char.ConvertFromUtf32(STX) + text + Char.ConvertFromUtf32(ETX));
} while (text.ToLower() != "q");
}
private static void InitializeComPort(string port, int baud)
{
ComPort = new SerialPort(port, baud);
ComPort.PortName = port;
ComPort.BaudRate = baud;
ComPort.Parity = Parity.None;
ComPort.StopBits = StopBits.One;
ComPort.DataBits = 8;
ComPort.ReceivedBytesThreshold = 9;
ComPort.RtsEnable = true;
ComPort.DtrEnable = true;
ComPort.Handshake = System.IO.Ports.Handshake.XOnXOff;
ComPort.DataReceived += OnSerialDataReceived;            
OpenPort(ComPort);            
}
public static void OpenPort(SerialPort ComPort)
{   
try
{   
if (!ComPort.IsOpen)
{
ComPort.Open();                    
}
}
catch (Exception e)
{
throw e;
}
}
}
}

Mon problème est DataReceived événement n'est jamais déclenché.

Mon programme spécifications sont:

  1. Juste .net de la console de programmation
  2. - Je utiliser VSPE de http://www.eterlogic.com
  3. Mon ordinateur a ports COM1 et COM2 déjà.
  4. J'ai créé COM2 et COM4 en utilisant VSPE.
  5. - Je obtenir résultat de sortie de mystring array (COM1, COM2, COM3, COM4)

Mais je ne sais toujours pas pourquoi DataReceived événement n'est pas déclenché.


Mis à jour

Malheureusement, je ne pouvais toujours pas faire de feu DataReceived événement.

Donc, j'ai créé un nouveau projet en espérant que je ferai face à une façon de résoudre.

À ce nouveau projet [juste application de console], j'ai créé une classe...

public class MyTest
{
public SerialPort SPCOM4;
public MyTest()
{
SPCOM4 = new SerialPort();
if(this.SerialPortOpen(SPCOM4, "4"))
{
this.SendToPort(SPCOM4, "com test...");
}
}
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;
}
}

Je ne suis pas sûr que j'ai face à de la chance ou de la malchance, parce que cette nouvelle classe pourrait faire du feu DataReceived événement qui est à partir d'anciens application de console est toujours en cours d'exécution. C'est miracle pour moi que je n'ai aucune idée de comment cela se passerait.

Laissez-moi vous raconter plus en détail, de sorte que vous pourriez me donner des suggestions pour une meilleure façon.

  1. Enfin, j'ai créé 2 console de projets.
  2. Premier projet est la classe que j'ai posté une question hier.
  3. Second projet est la classe appelée MyTest qui pourrait faire du feu DataReceived cas du Premier projet, à la même époque où les deux du projet est en cours d'exécution.

Quelqu'un pourrait-il me donner des suggestions sur comment ai-je pu combiner ces deux projets comme un projet unique?

IIRC DataReceived est déclenché après la réception d'un séparateur de ligne. Pouvez-vous confirmer que l'appareil est en effet l'envoi de plusieurs lignes?
Autant que je me souvienne, il se déclenche après avoir reçu plus de (ou tout au moins) ReceivedBytesThreshold octets. Donc les questions sont: 1. combien d'octets recevez-vous? 2. Avez-vous réussir dans la lecture de ces données à l'aide d'un autre terminal (application?
Merci, cela semble plus intuitif 🙂
ComPort.DataReceived +=new SerialDataReceivedEventHandler(OnSerialDataReceived);
Quel est l'intérêt de ton commentaire?

OriginalL'auteur Frank Myat Thu | 2012-01-18