2015-07-20 3 views
0

Я говорю о программировании на C# и общении с последовательным портом и различных результатах в Windows 7 и XP. мой код:Простой последовательный порт хорошо работает в Windows XP, но перестает работать и замедляется в окнах 7

int count = 0; 
    float data1; 
    float data2; 
    private void button1_Click(object sender, EventArgs e) 
    { 
     serialPort1.PortName = textBox1.Text; 
     serialPort1.BaudRate = Convert.ToInt32(textBox2.Text); 

     serialPort1.Open(); 
     serialPort1.Write("?"); 

    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     serialPort1.Close(); 

    } 

    private void button3_Click(object sender, EventArgs e) 
    { 
     //string pathfile = @"C:\Documents and Settings\Dlab\Desktop\"; 
     //string filename = "data1.txt"; 
     //System.IO.File.WriteAllText(pathfile + filename, chart1.SaveImage(); 
     // this.chart1.SaveImage(@"C:\Documents and Settings\Dlab\Desktop\data1p.png", System.Drawing.Imaging.ImageFormat.Gif); 

     //Bitmap bmp1 = new Bitmap(500, 500); 
     //chart1.DrawToBitmap(bmp1, new Rectangle(0, 0, 500, 500)); 
     //bmp1.Save(@"C:\Documents and Settings\Dlab\Desktop\data1b.png"); 

     //chart1.Serializer.Save(@"C:\Documents and Settings\Dlab\Desktop\data1t.text"); 



     //this.chart2.SaveImage(@"C:\Documents and Settings\Dlab\Desktop\data2p.png", System.Drawing.Imaging.ImageFormat.Gif); 

     //Bitmap bmp2 = new Bitmap(500, 500); 
     //chart2.DrawToBitmap(bmp2, new Rectangle(0, 0, 500, 500)); 
     //bmp2.Save(@"C:\Documents and Settings\Dlab\Desktop\data2b.png"); 

     //chart2.Serializer.Save(@"C:\Documents and Settings\Dlab\Desktop\data12.text"); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     // string[] ports = SerialPort.GetPortNames(); 
     //foreach (string port in ports) 
     //{ 
     // comboBox1.Items.Add(port); 

     // } 

    } 

    byte[] rs = new byte[53]; 


    int rscnt = 0; 
    // DateTime then = DateTime.Now; 
    // float dt; 
    private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) 
    { 





     if (e.EventType != SerialData.Chars) return; 
     rscnt += serialPort1.Read(rs, rscnt, 53 - rscnt); 
     if (rscnt == 53) 
     { 
      this.BeginInvoke(new Action(() => type(rs))); 
      rs = new byte[53]; 
      rscnt = 0; 
     } 

    } 
    private void type(byte[] data) 
    { 
     //if (rs[0] == 65) 
     //{ 
     // } 
     //DateTime now = DateTime.Now; 
     //dt = ((now.Second - then.Second)); 
     //label8.Text = dt.ToString(); 
     //textBox3.Text = dt.ToString(); 


     data1 = ((rs[1] * 65536) + (rs[2] * 256) + (rs[3])-10000000)/100; 
     data2 = ((rs[4] * 16777216) + (rs[5] * 65536) + (rs[6] * 256) + (rs[7])-1000000000)/2136; 

     count++; 
     label5.Text = count.ToString(); 
     label3.Text = data1.ToString(); 
     label4.Text = data2.ToString(); 

     //chart1.Series[0].Points.AddXY(count, data1); 
     //chart2.Series[0].Points.AddXY(count, data2); 

     //list1.Add(count, rs[1]); 
     //zedGraphControl1.GraphPane.AddCurve("", list1, Color.Red); 

     //zedGraphControl1.AxisChange(); 
     // zedGraphControl1.Refresh(); 
     serialPort1.DiscardInBuffer(); 



    } 
    // PointPairList list1 = new PointPairList(); 
} 
} 

эта программа работы хорошо в Windows XP, но когда я пытаюсь его в Windows 7, это медленно, получить неверные данные и после небольшой остановки работы.

Я снова написал эту программу в окнах 7 и xp, и я протестировал ее с визуальной студией 2008 и 2012 годов, но получил те же результаты.

+0

Вы используете встроенный последовательный порт на своем компьютере или используете адаптер для последовательного порта? – Tintenfiisch

+0

Что вы подразумеваете под «неправильными данными»? Вы получаете сообщения об ошибках? – Cleb

+0

я использую USB в RS 458 конвертера , и я не получаю сообщение об ошибке при первом, но после того, как немного я получаю ошибку Stop работает и неправильно данные означают значение data1 и data2, что я получил это неправильно –

ответ

0
private void type(byte[] data) 
{ 
    ... 
    serialPort1.DiscardInBuffer(); 
} 

Это одна чертовски неприятная ошибка. Вы выбрасываете байты в буфере приема, которые никогда не должны отбрасываться. Точный момент времени, когда вы делаете это, очень непредсказуем, это зависит от того, когда начнет работать type(). Что работает в потоке пользовательского интерфейса, это время очень непредсказуемо и, безусловно, зависит от того, на какой ОС вы запускаете это. То, что это вообще работает на XP, - это просто слепая удача.

Использование DiscardInBuffer() почти никогда не является правильным, его следует использовать только после вызова SerialPort.Open() для очистки старых данных из буфера приема. Или для восстановления после ошибки протокола, попытки повторной синхронизации передатчика и приемника. Но у вас нет протокола, отбрасывая байты, подобные этому, просто выдает данные мусора с отсутствием случайного набора байтов. Производя задержки, вы можете получить только буфер, заполненный приблизительно байт от следующей передачи. И сбои, что бы вы ни делали с поврежденными данными, могут сильно упасть.

Вы должны удалить это заявление.

+0

спасибо, я сделал это, теперь я не получаю стоп-рабочую ошибку, но я все еще медленный (но не такой, как прошлый) ... , Я отправляю данные каждые 9 мс, и я могу читать и правильно их строить в Windows XP, но теперь я получаю данные каждые 25 мс в Windows 7 !! .... и иногда (меньше, чем в прошлом) я перескакиваю в своих данных –

+0

и еще когда я использую код в http://stackoverflow.com/questions/31155232/read-22-byte-from-ftdi-serial-port-in-c-sharp-is-too-slow У меня тот же результат с сейчас ... У меня нет последней проблемы в Windows 7 –

+0

Обновление диаграммы каждые 9 миллисекунд совершенно бессмысленно, ни один человек не может это увидеть. И это дорого, вы легко пожаротусите поток пользовательского интерфейса, когда он не сможет идти в ногу с ним. Собирайте данные и не обновляйте диаграмму, пока не пройдет не менее 50 мс. И держите серию маленькой, выбросив старые данные. –