2015-11-07 4 views
-1

Я использую следующий код для получения данных из последовательного порта, но данные, которые я получил некоторое время, пропускают значения som, например, когда я отправляю ascii «123456» программой Realterm на последовательный порт, он должен всегда давать мне:C#, mssing некоторые данные из последовательного порта?

buffer[0]:49 
buffer[1]:50 
buffer[2]:51 
buffer[3]:52 
buffer[4]:53 
buffer[5]:54 

Но некоторое время я получаю:

buffer[0]:51 
buffer[1]:52 
buffer[2]:53 
buffer[3]:54 

или:

buffer[0]:50 

Это случается даже тогда, когда я отправить данные в очень медленной последовательности?

public Form1() 
    { 
     InitializeComponent(); 
     cmdClose.Enabled = false; 
     foreach (String s in System.IO.Ports.SerialPort.GetPortNames()) 
     { 
      txtPort.Items.Add(s); 
     } 
     txtPort.SelectedItem = "COM5"; 
     cmbbaudrate.SelectedItem = "115200"; 
     cmbparity.SelectedItem = "None"; 
     cmbdatabits.SelectedItem = "8"; 
     cmbstopbits.SelectedItem = "One"; 
    } 

    public System.IO.Ports.SerialPort SP; 
    public void serialport_connect(String port, int baudrate, Parity parity, int databits, StopBits stopbits) 
    { 
     DateTime dt = DateTime.Now; 
     SP = new System.IO.Ports.SerialPort(port, baudrate, parity, databits, stopbits); 

     try 
     { 
      SP.Open(); 
      SP.DataReceived += new SerialDataReceivedEventHandler(sport_DataReceived); 
     } 
     catch (Exception ex) { MessageBox.Show(ex.ToString(), "Error"); } 
    } 


    private void sport_DataReceived(object sender, SerialDataReceivedEventArgs e) 
    { 
     TextBox.CheckForIllegalCrossThreadCalls = false; 
     byte[] buffer = new byte[SP.BytesToRead]; 
     SP.Read(buffer, 0, buffer.Length); 

     for (int i = 0; i < buffer.Length; i++) 
     { 
      Console.WriteLine("buffer[" +i +"]:" +buffer[i]); 
      txtReceive.AppendText("buffer[" + i + "]:" + buffer[i] +"\n"); 
     } 

    } 

ответ

0

Возможно, вы захотите взглянуть на метод ReadExisting.

«SerialPort класс буферов данных, но потоковый объект, содержащийся в свойство SerialPort.BaseStream не. Таким образом, объект SerialPort и потоковый объект может отличаться от количества байтов, которые доступны для . Когда прочитать байты в буфер для объекта SerialPort , свойство BytesToRead включает эти байты в его стоимости; однако, эти байты не могут быть доступными для потока, содержащиеся в свойстве BaseStream»

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

Надеюсь, это помогло немного! :)

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