【发布时间】:2014-09-08 01:50:32
【问题描述】:
我一直在尝试使用已使用此代码配置的串行端口 COM4 发送和读取命令,它连接到票据接受器设备
每当设备发送答案时,我都会使用一个事件来订阅,但是在调试时我发现它从未真正到达该事件也没有订阅它,我整整一周都在阅读如何解决这个问题,但没有运气,
即使我碰巧将“读端口”行放在“写端口行”之后,程序也会到达
ptSerial.Read(RxMensaje, 0, 5);
程序只是卡住了,我必须停止它,希望这里有人可以帮助我输出
public partial class Form1 : Form
{
public SerialDataReceivedEventHandler DataReceivedDelegate;
public Form1()
{
InitializeComponent();
}
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
DataReceivedDelegate = new SerialDataReceivedEventHandler(DataReceivedHandler);
//SerialPort sp = (SerialPort)sender;
//string indata = sp.ReadExisting();
byte[] RxMensaje = new byte[5];
ptSerial.Read(RxMensaje, 0, 5);
rtbDevice.Text = Encoding.ASCII.GetString(RxMensaje, 0, 5);
// rtbDevice.Text = indata;
}
private void btnOpen_Click(object sender, EventArgs e)
{
try
{
Open(sender, e);
}
catch (Exception ex)
{
lblSalida.Text = ex.Message;
}
}
private void Open(object sender, EventArgs e)
{
ptSerial.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
ptSerial.Open();
lblSalida.Text = "Puerto COM4 Abierto";
}
private void btnSend_Click(object sender, EventArgs e)
{
if (ptSerial.IsOpen)
{
byte[] TxMensaje = new byte[5] { 0x02, 0x00, 0x01, 0xFE, 0xFF }; //CCtalk
ptSerial.Write(TxMensaje, 0, 5);
rtbHost.Text = "2 0 1 254 255 Enviado";
//byte[] RxMensaje = new byte[5];
//ptSerial.Read(RxMensaje, 0, 5);
//rtbDevice.Text = Encoding.ASCII.GetString(RxMensaje, 0, 5);
ptSerial.Close();
lblSalida.Text = "Bytes Enviados Pto Cerrado";
}
else
{
lblSalida.Text = "Puerto Cerrado";
}
}
private void btnCerrar_Click(object sender, EventArgs e)
{
if (ptSerial.IsOpen)
{
ptSerial.Close();
lblSalida.Text = "Puerto COM4 Cerrado";
}
else
{
lblSalida.Text = "No ocurrio nada :(";
}
}
}
【问题讨论】:
-
我强烈建议您使用重叠读取而不是
DataReceived事件。更多信息请访问sparxeng.com/blog/software/… -
它应该挂起。直接使用 Read() 或 使用 DataReceived 事件。你不能同时使用它们。这段代码有很多错误,花一些时间阅读这个主题并查看现有的工作代码是明智的。
标签: c# serial-port cctalk