c# - विंडोज़ एक्सपी में सीरियल बंदरगाह का काम अच्छा है, लेकिन विंडोज 7 में धीमी गति से काम करना बंद करो



visual-studio windows-7 (1)

मैं सी # प्रोग्रामिंग के बारे में बात कर रहा हूं और सीरियल पोर्ट और विंडोज 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();
}
}

यह प्रोग्राम विंडोज एक्सपी में अच्छा काम करता है, लेकिन जब मैं इसे विंडोज 7 में आज़माता हूँ, यह धीमा है, गलत डेटा प्राप्त करें और थोड़ी देर काम बंद करने के बाद।

मैंने इस कार्यक्रम को फिर से विंडोज 7 और एक्सपी में लिखा था और मैंने इसे विज़ुअल स्टूडियो 2008 और 2012 के साथ परीक्षण किया लेकिन मुझे एक ही परिणाम मिला।


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

यह एक गंदा बग के एक बिल्ली है आप प्राप्त बफर में बाइट्स निकाल रहे हैं जिन्हें कभी भी नहीं छोड़ा जाना चाहिए। उस समय पर सटीक पल जो आप ऐसा करते हैं वह अत्यधिक अप्रत्याशित है, यह उस पर निर्भर करता है जब प्रकार () चलना शुरू होता है जो UI थ्रेड पर चलता है, वह समय बहुत अप्रत्याशित है और निश्चित रूप से ओएस पर इसका क्या प्रभाव होता है। यह है कि यह XP पर बिल्कुल काम करता है, सिर्फ अंधे भाग्य है।

DiscardInBuffer () का उपयोग लगभग कभी भी सही नहीं है, केवल सीरियल पोर्ट को कॉल करने के बाद ही इसका इस्तेमाल किया जाना चाहिए। ओपन () प्राप्तकर्ता बफर से पुराने डेटा को शुद्ध करने के लिए। या एक प्रोटोकॉल त्रुटि से पुनर्प्राप्त करने के लिए, ट्रांसमीटर और रिसीवर को पुन: सिंक्रनाइज़ करने का प्रयास कर रहा है। लेकिन आपके पास कोई प्रोटोकॉल नहीं है, इस तरह से छोड़े गए बाइट्स को केवल बेतरतीब ढंग से छोड़े गए बाइट्स के साथ कचरा डेटा का उत्पादन होता है। उत्पादन देरी, आप केवल बफ़र को अगले प्रसारण से कुछ बाइट्स से भर सकते हैं। और दुर्घटनाओं, जो भी आप भ्रष्ट डेटा के साथ करते हैं वह बुरी तरह से गिरने के लिए उत्तरदायी है।

आपको उस कथन को हटाना होगा





windows-xp