Событие dataReceived в .net compact 2.0 для Windows CE 6.0 работает только один раз для последовательной связи. - PullRequest
1 голос
/ 09 сентября 2010

У меня есть простая программа последовательного порта, которая должна считывать последовательный порт и отображать набранные символы.Я могу заставить это работать нормально, опрашивая серийный номер, полученный с таймером, но я хотел бы вместо этого использовать событие dataReceived.По какой-то причине событие произойдет один раз, но никогда больше.

    SerialPort bsp;
    public Form1()
    {
        InitializeComponent();
        bsp = new SerialPort("COM2", 2400, Parity.None, 8, StopBits.One);
        bsp.DataReceived +=new SerialDataReceivedEventHandler(whasup);
        System.Threading.Thread.Sleep(1000);
        bsp.Open();
    }
    void whasup(object sender, SerialDataReceivedEventArgs e)
    {
        char[] text = new char[100];
        int temp = bsp.BytesToRead;
        string j = temp.ToString();
        bsp.Read(text, 0, temp);
        bsp.Write(text, 0, temp);
    }

Я пытался перенести это на ПК, и он прекрасно работает, но на этом устройстве Windows CE он действительно не хочет сотрудничать.Я знаю, что серийный объект все еще открыт, потому что у меня был таймер, запускающий выплевывание текста из устройства Win CE, даже после того, как он перестал отражать свои принимаемые данные.У меня также был выход таймера bsp.BytesToRead, и я мог видеть, как это значение увеличивается, когда я набрал на своем компьютере больше клавиш, которые последовательно общались с устройством Windows CE.Я что-то упустил?

1 Ответ

0 голосов
/ 26 мая 2011

Мы столкнулись с похожими проблемами с Read(), но вместо этого справились с ReadExisting(), чтобы всегда читать весь буфер. Это может быть тот факт, что позволяет поднять следующее событие.

Sleep(500) был включен, потому что событие возникает, как только первый байт записывается в буфер. Благодаря некоторым методам проб и ошибок, а также зная, что сообщения, которые мы читали, никогда не превышали определенной длины, мы знали, что они будут полностью написаны в пределах (и фактически задолго до) 500 мс события.

Немного попал в ловушку, и я был бы очень рад увидеть «правильное» решение от эксперта по серийным играм!

код:

private SerialPort port;
private object readLock = new object();

private SerialManager()
{
    port = new SerialPort(SerialPort, BaudRate, Parity.None, 8, StopBits.One);
    port.Handshake = Handshake.None;
    port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
    port.Open();
}

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    // Lock to subsequent DataReceived events
    lock (readLock)
    {
        Thread.Sleep(500);
        string data = port.ReadExisting();
    }
}
...