c#中的串口数据和表单刷新

时间:2014-12-11 00:52:30

标签: c# serial-port

我想绘制矩形。它的宽度和高度来自串口。我想在获取数据时刷新页面以进行重新绘制。我的代码在这里;

public partial class Form1 : Form
{
    string RxString;
    static int x = 1;
    SerialPort serialPort1 = new SerialPort();
    public Form1()
    {
        InitializeComponent();


    }

    private void Form1_Load(object sender, EventArgs e)
    {

        serialPort1.PortName = "COM3";
        serialPort1.BaudRate = 9600;

        serialPort1.Open();
        RxString = serialPort1.ReadLine();

        x = Convert.ToInt32(RxString);
        Graphics g = this.CreateGraphics();
        Pen pen = new Pen(Color.Black, 2);

        g.DrawRectangle(pen, 100, 100, x, x);

   }

但是在(x = Convert.ToInt32(RxString);)

的行上有一个错误

mscorlib.dll

中出现'System.FormatException'类型的第一次机会异常

我该怎么办?之后如何刷新重绘图像的表单页面?

1 个答案:

答案 0 :(得分:0)

由于您的代码示例尚未完成,并且您没有说明失败的字符串值是什么,因此我无法回答有关您的例外的问题。但是,我可以告诉你如何正确处理这幅画。

您需要在班级中维护数据,以跟踪您想要绘制的内容。然后,您重写OnPaint()方法(因为在这里,您正在尝试声明类本身的对象...在其他情况下,您可能需要处理其他对象的Paint事件)根据您获得的数据绘制的地方。

如果数据发生变化,请致电Invalidate()表示需要重新绘制。

例如:

public partial class Form1 : Form
{
    string RxString;
    int x = 1;
    SerialPort serialPort1 = new SerialPort();

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {

        serialPort1.PortName = "COM3";
        serialPort1.BaudRate = 9600;

        serialPort1.Open();

        // The next three lines of code, you'll do wherever you want
        // to receive data and update the displayed graphics. Naturally,
        // the call to serialPort1.ReadLine() might vary, depending on
        // how you are managing the I/O on the serial port.
        RxString = serialPort1.ReadLine();

        x = Convert.ToInt32(RxString);
        Invalidate();
   }

   protected override void OnPaint(PaintEventArgs e)
   {
        e.Graphics.DrawRectangle(Pens.Black, 100, 100, x, x);
   }
}

我对您的代码进行了一些其他更改以改进它:

  1. x成员不应该是静态的,因为代码的其余部分也不是静态的,所以理论上你可以拥有这个表单的多个实例,所有实例都试图使用相同的x在同一时间。
  2. 使用stock Pens.Black对象,而不是自己创建一个。
  3. 另请注意,您的原始代码无法处置它创建的Graphics实例,这是一个严重的错误。它在上面变得毫无意义,因为你实际上并不需要创建一个Graphics实例。你只是画到传给你的那个(并且不要处理它......它是来电者的对象,不是你的对象)。