【问题标题】:Serial port Write and read event not subscribing/ not reading serial port串口写入和读取事件未订阅/未读取串口
【发布时间】: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


【解决方案1】:

我没有看到串行端口的完整定义(例如,您在哪里绑定到“COM4”)。正确设置波特率非常重要,否则设备将无法与您的应用程序正确同步并且不会生成任何事件。

http://msdn.microsoft.com/en-us/library/system.io.ports.serialport(v=vs.110).aspx

_serialPort = new SerialPort(); // Allow the user to set the appropriate properties.
_serialPort.PortName = SetPortName(_serialPort.PortName);
_serialPort.BaudRate = SetPortBaudRate(_serialPort.BaudRate);
_serialPort.Parity = SetPortParity(_serialPort.Parity);
_serialPort.DataBits = SetPortDataBits(_serialPort.DataBits);
_serialPort.StopBits = SetPortStopBits(_serialPort.StopBits);
_serialPort.Handshake = SetPortHandshake(_serialPort.Handshake); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    相关资源
    最近更新 更多