Tôi đang phát triển chương trình cần tương tác với các cổng COM.SerialPort không nhận được bất kỳ dữ liệu
Bằng cách học từ Q & A: .NET SerialPort DataReceived event not firing, tôi tạo mã như thế.
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;
}
}
}
}
Sự cố của tôi là sự kiện DataReceived không bao giờ bị kích hoạt.
thông số kỹ thuật chương trình của tôi là:
- Chỉ cần .net console lập trình
- tôi sử dụng VSPE từ http://www.eterlogic.com
- Máy tính của tôi có COM1 và COM2 cổng rồi.
- Tôi đã tạo COM2 và COM4 bằng cách sử dụng VSPE.
- tôi nhận được kết quả đầu ra từ mystring mảng (COM1, COM2, COM3, COM4)
Nhưng tôi vẫn không biết tại sao DataReceived
sự kiện không được sa thải.
Cập nhật
Thật không may, tôi vẫn không thể thực hiện để bắn DataReceived
sự kiện trong bất kỳ cách nào.
Vì vậy, tôi đã tạo dự án mới bằng cách hy vọng rằng tôi sẽ đối mặt với một cách để giải quyết.
Lúc đó dự án mới [chỉ an ủi ứng dụng], tôi đã tạo ra một lớp ...
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;
}
}
Tôi không chắc chắn mà tôi phải đối mặt với may mắn hay xui xẻo vì lớp mới này có thể làm cho đám cháy sự kiện DataReceived
mà từ ứng dụng bảng điều khiển cũ hơn vẫn đang chạy. Điều kỳ diệu đối với tôi là tôi không biết chuyện này xảy ra như thế nào.
Hãy để tôi cho bạn biết thêm chi tiết để bạn có thể đưa ra đề xuất cho cách tốt hơn.
- Cuối cùng tôi đã tạo 2 dự án bảng điều khiển.
- Dự án đầu tiên là lớp mà tôi đã đăng là câu hỏi ngày hôm qua.
- Dự án thứ hai là lớp được gọi là MyTest có thể gây ra sự kiện cháy
DataReceived
từ Dự án đầu tiên, đồng thời khi hai dự án đang chạy.
Có ai cho tôi đề xuất về cách tôi có thể kết hợp hai dự án này thành một dự án không?
IIRC 'DataReceived' được kích hoạt sau khi nhận được dấu tách dòng. Bạn có thể xác nhận rằng thiết bị thực sự đang gửi nhiều dòng? – leppie
@leppie: IIRC, nó sẽ kích hoạt sau khi nhận được nhiều hơn (hoặc ít nhất) byte 'ReceivedBytesThreshold'. Vì vậy, các câu hỏi là: 1. bạn nhận được bao nhiêu byte? 2. Bạn có thành công trong việc đọc dữ liệu này bằng cách sử dụng một ứng dụng thiết bị đầu cuối khác không? – Groo
@Groo: Cảm ơn, điều đó có vẻ trực quan hơn :) – leppie