вопрос по порту - PullRequest
       15

вопрос по порту

0 голосов
/ 19 февраля 2010

у меня проблема я пишу код на C # я хочу получить байт от последовательного порта но когда я хочу получить данные из порта, который звучит, моя программа зависает и больше не работает

 SerialPort port = new SerialPort("COM3");
 port.Open();
 byte[] b = new byte[10];
 port.Read(b, 0, 1);
 port.Close();

пожалуйста, помогите мне

Ответы [ 3 ]

1 голос
/ 19 февраля 2010

Это потому, что SerialPort читает данные синхронно и блокирует текущий поток, пока данные не будут доступны.

Вы можете использовать отдельную тему для этого:

public class SerialPort : IDisposable
{
    public SerialPort(byte comNum, int baudRate)
    {
        this.comNum = comNum;
        serialPort = new System.IO.Ports.SerialPort("COM" + comNum.ToString(), baudRate);
        serialPort.Open();
        thread = new System.Threading.Thread(ThreadFn);
        thread.Start();
    }
    public void Dispose()
    {
        if (thread != null)
           thread.Abort();
        if (serialPort != null)
           serialPort.Dispose();
    }

    private void OnReceiveByte(byte b)
    {
        //handle received byte
    }

    private void ThreadFn(object obj)
    {
        Byte[] inputBuffer = new Byte[inputBufferSize];
        while (true)
        {

            try
            {
                int availibleBytes = serialPort.BytesToRead;
                if (availibleBytes > 0)
                {
                    int bytesToRead = availibleBytes < inputBufferSize ? availibleBytes : inputBufferSize;
                    int readedBytes = serialPort.Read(inputBuffer, 0, bytesToRead);
                    for (int i = 0; i < readedBytes; i++)
                        OnReceiveByte(inputBuffer[i]);
                }
                System.Threading.Thread.Sleep(1);
            }
            catch (System.Threading.ThreadAbortException)
            {
                break;
            }
            catch (Exception e)
            {
                System.Diagnostics.Debug.Assert(false, e.Message);
            }
        }
    }
    private Byte comNum;
    private System.IO.Ports.SerialPort serialPort;
    private System.Threading.Thread thread;
    private const int inputBufferSize = 1024;
}
0 голосов
/ 19 февраля 2010

Также убедитесь, что вы правильно установили последовательную скорость (если вы читаете слишком быстро, вы пропустите некоторые данные и т. Д.)

0 голосов
/ 19 февраля 2010

Есть ли какие-либо данные, отправляемые через последовательный порт? Возможно, вызов Read ожидает ожидания получения данных, прежде чем вернуться. Убедитесь, что вы установили значение для свойства ReadTimeout. Это приведет к вызову Read, создающему исключение TimeoutException, если данные не были прочитаны из порта.

Ссылка: http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.readtimeout.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...