2014-11-25 2 views
0

Я пишу код C# для использования с Unity3D, чтобы читать из последовательного порта. Это делается с помощью другого потока. Поток чтения зависает при вызове метода SerialPort.Read. Класс чтения поток выглядит следующим образом:Тема не читается

public class Serial_Port_Reader { 
    private SerialPort port; 
    private byte[] data; 
    private int bytes; 

    public Serial_Port_Reader(SerialPort in_port, int in_bytes) { 
     port = in_port; 
     bytes = in_bytes; 
     data = new byte[bytes]; 
    } 
    public void read() { 
     try { 
      while(true) { 
       IO.log.Add("A"); 
       data = new byte[bytes]; 
       IO.log.Add("C"); 
       port.Read(data, 0, 1); 
       IO.log.Add("Data Received: "+DateTime.Now.ToString()); 
       Data.parse(data); 
       IO.log.Add("D"); 
       port.DiscardInBuffer(); 
      } 
     } 
     catch(ThreadAbortException e) {IO.log.Add("Abort:"+e.Message);} 
     catch(IOException e) {IO.log.Add("IO:"+e.Message);} 
     catch(Exception e) {IO.log.Add(e.Message);} 
     finally {if(port.IsOpen) port.Close();} 
    } 
} 

Это называется так:

workaround = new Serial_Port_Reader(input, Data.bytes); 
reader = new Thread(new ThreadStart(workaround.read)); 
reader.Start(); 

Если нить уже активна она останавливается на «C» и остается там, даже когда я отправить данные. Если я начну поток в середине приема данных, он будет работать так, как должен (то есть будет читать один символ), а затем остановиться на «C» в следующем цикле.

Я пытаюсь заставить его непрерывно читать данные. Почему он останавливается на «С» и не продолжается при обычных обстоятельствах?

+0

Под 'C' вы подразумеваете в строке:' IO.log.Add («C»); '? –

+0

Вызывает ли это исключение? –

+0

Да, 'C' Я имею в виду' IO.Log.Add («C»); 'Никакое исключение не выбрасывается. –

ответ

0

Вызывает ли это исключение? Вы отправили достаточно бит? read() может блокироваться до тех пор, пока вы не прочтете count бит.

msdn:

Поскольку данные буферов класса SerialPort и поток, содержащиеся в собственности BaseStream нет, то два может противоречить о том, сколько байт доступны для чтения. Свойство BytesToRead может указывать на то, что есть байты для чтения, но эти байты могут быть недоступны для потока, содержащегося в свойстве BaseStream, потому что они были буферизованы для класса SerialPort.

Метод Read не блокирует другие операции, когда количество прочитанных байтов равно количеству, но на последовательном порту все еще есть непрочитанные байты.

+0

Определенно достаточно бит. Когда я ввожу 'picocom/devttyUSB0' в терминал, он будет получать данные каждые несколько секунд. –