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:
- Juste .net de la console de programmation
- - Je utiliser VSPE de http://www.eterlogic.com
- Mon ordinateur a ports COM1 et COM2 déjà.
- J'ai créé COM2 et COM4 en utilisant VSPE.
- - 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.
- Enfin, j'ai créé 2 console de projets.
- Premier projet est la classe que j'ai posté une question hier.
- 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?
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
Vous devez vous connecter pour publier un commentaire.
Le problème n'est pas que le DataReceived événement ne se déclenche pas, le problème est que le port série n'est pas la réception des données. Il y a très, très peu de série des appareils qui n'utilisent pas de serrer la main à tous. Si vous le réglez à rien, puis le pilote ne s'allume pas, le DTR (Terminal de Données Prêt) et RTS (Request to Send) des signaux. Qui un port série de l'appareil interprète comme "la machine est hors tension (DTR)" ou "la machine n'est pas prête à recevoir des données (RTS)". Afin de ne pas envoyer quoi que ce soit et votre DataReceived événement ne se déclenche pas.
Si vous vraiment veux rien, puis l'ensemble de la DTREnable et RTSEnable propriétés de vrai. Mais il est probable que vous voulez poignée de main.RequestToSend depuis le périphérique semble être en accordant une attention à la poignée de main des signaux.
Si vous avez encore des problèmes, puis utiliser un autre programme du port série comme du Mastic ou HyperTerminal pour assurer la connexion et les paramètres de communication sont bonnes et que l'appareil est réactif. SysInternals' PortMon utilitaire donne un faible niveau de vue de l'interaction de pilote de sorte que vous pouvez comparer les bonnes vs mauvaises.
Désolé, la seconde aurait dû être ici: serialport-datareceived-event-does-not-fire
Réglage DTREnable et RTSEnable les deux à vrai travaillé dans mon cas
OriginalL'auteur Hans Passant
Je n'ai jamais travaillé avec VSPE donc je ne sais pas si l'origine du problème. J'ai travaillé avec un port COM avant et j'ai regardé mon code. La seule différence est dans la façon dont vous déclarer l'événement. Vous avez:
J'ai comme ceci:
OnSerialDataReceived est votre gestionnaire d'événements. Je ne sais pas si cela fera toute la différence, mais vous pouvez l'essayer. J'espère que cela aide!
Comme par cette réponse cela ne fait aucune différence, le haut de l'échantillon est prise de l'utilisation de la méthode implicite de conversion de groupe, ce qui entraîne dans le même code compilé comme le fond de code.
OriginalL'auteur Carlito
J'avais un problème similaire. Dans une application graphique (C# win forme) j'avais une classe qui encapsule l'appel à un
SerialPort
composant. LeDataReceived
événement a tir une seule fois, mais ensuite, tout en suivant les données reçues n'ont pas le feu à tout événement. J'ai résolu le problème en appelant leClose
méthode dans ma principale formeClosed
fonction d'événement.Aucune idée de pourquoi cela change quoi que ce soit, mais maintenant ça fonctionne.
OriginalL'auteur Freak