2014-09-08 6 views
1

Я пытался отправлять и читать команды с помощью последовательного порта COM4, ​​который уже сконфигурирован с помощью этого кода, он подключен к купюроприемник устройстваПоследовательный порт для записи и чтения событие не подписавшись/не читает последовательный порт

im, используя событие, чтобы подписать каждый раз, когда устройство отправляет ответ, однако при дебюнге я узнал, что он никогда не достигает события или не подписывается на него, я читал всю неделю, как решить эту проблему, не повезло,

Even если я случайно поставил строки «читать порт» сразу после «строк порт записи», и программа попадает на

ptSerial.Read(RxMensaje, 0, 5); 

линия программа просто frezzes и я должен остановить его, надеюсь, кто-то здесь может помочь мне Oput

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 :("; 
     } 
    } 
} 
+0

Я настоятельно рекомендую вам использовать перекрывающий читать вместо 'DataReceived' события. Более подробную информацию можно найти по адресу: http://www.sparxeng.com/blog/software/must-use-net-system-io-ports-serialport –

+0

Он должен висеть. Либо используйте Read() напрямую, либо * используйте событие DataReceived. Вы не можете использовать их обоих. В этом коде есть много ошибок, затрачивая некоторое время на чтение по этому вопросу, и поиск существующего рабочего кода будет разумным. –

ответ

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); 

 Смежные вопросы

  • Нет связанных вопросов^_^