none
並未將物件參考設定為物件的執行個體與其他問題。 RRS feed

  • 問題

  • 又提問這種問題,深感抱歉,但是,我已經翻過許多舊文,還是不了解如何修改。

    (粗體的是錯誤的是顯示 con.close_port(); )

    版本是C#2010Express,使用windows Form寫的。

    主要是利用讀取器抓取TAG後的卡號,顯示在maskedTextBox上面。

    讀取器是使用HF段的(非手拿式),TAG是使用Mifare S50(ISO14443A)。

    用USB接頭接到電腦 再利用C#撰寫來抓取COM Port。

    他有附範例的程式  可以在TAG上作加減值,有試過可以抓取到COM port與卡號也可以加減值。

    我是利用範例的程式改一改,先寫出可以抓出卡號的程式碼。

    但是找不到哪裡是null,所以在苦惱中。(第一次接觸C#)

    我有使用到Button,Label,comboBox,maskeTextdBox並且將這些放進groupBox裡面。

    (groupBox的Text我命名為connect)

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;
    using System.IO.Ports;
    using System.Timers;
    using System.Data.OleDb;
    using System.Text.RegularExpressions;
    namespace test001
    {
        public partial class Form1 : Form
        {
            private connect con;
            private static DateTime dtTime;
            private System.Timers.Timer timerClock1 = new System.Timers.Timer();
            private String TAG_UID;
            public Form1()
            {
                InitializeComponent();
                dtTime = DateTime.Now;
                timerClock1.Elapsed += new ElapsedEventHandler(OnTimer1);
                timerClock1.Interval = 2000;
                foreach (string c in SerialPort.GetPortNames())
                    comboBox1.Items.Add(c);
                comboBox1.Text = "Select Port";
                maskedTextBox1.Mask = "aa aa aa aa aa aa aa";
            }
            private void button1_Click(object sender, EventArgs e)
            {
                if (button1.Text.Equals("Srart"))
                {
                    con = new connect(serialPort1, (comboBox1.SelectedItem).ToString());
                    con.open_port();
                    button1.Text = "Stop";
                    timerClock1.Enabled = true;
                    label3.Text = "connected";
                }
                else
                {
                    con.close_port();
                    button1.Text = "Start";
                    timerClock1.Enabled = false;
                    label3.Text = "Not Connected";
                }
            }
            public void OnTimer1(Object source, ElapsedEventArgs e)
            {
                if (serialPort1.IsOpen)
                {
                    TAG_UID = con.read_UID();
                }
                
            }
            private void UpdateUI1()
            {
                maskedTextBox1.Text = TAG_UID;
            }
        }
    }

    這下面是connect的程式碼,我不知道會不會用到,所以也放上來。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.IO.Ports;
    using System.IO;
    namespace test001
    {
        public class connect
        {
             public System.IO.Ports.SerialPort serialPort1;
            //MicroRWD RFID指令
            private byte RWD_CMD_READ_TAG_UID = 0x55;
            public connect() { }
            //設定COMO PORT初始值
            public connect(System.IO.Ports.SerialPort sp, String port_number)
            {
                sp.PortName = port_number;
                sp.BaudRate = 9600;
                sp.DataBits = 8;
                sp.StopBits = StopBits.One;
                sp.Handshake = Handshake.RequestToSend;
                serialPort1 = sp;
            }
            //開啟COM PORT
            public void open_port()
            {
                try
                {
                    if (!serialPort1.IsOpen)
                        serialPort1.Open();
                }
                catch (IOException)
                {
                    MessageBox.Show("Port error", "");
                }
            }
            //關閉COM PORT
            public void close_port()
            {
                try
                {
                    if (serialPort1.IsOpen)
                        serialPort1.Close();
                }
                catch (IOException)
                {
                    MessageBox.Show("Port error", "");
                }
            }
            
            //讀取卡片的UID
            public String read_UID()
            {
                //傳送指令來讀取卡片UID
                byte[] send = new byte[1];
                send[0] = RWD_CMD_READ_TAG_UID;
                serialPort1.Write(send, 0, 1);
                //延遲接收資料,避免未接收到回傳資料
                System.Threading.Thread.Sleep(200);
                //接收回傳資料
                int bytes = serialPort1.BytesToRead;
                byte[] buffer = new byte[bytes];
                serialPort1.Read(buffer, 0, bytes);
                String temp2 = "", data = "", TAG_UID = "";
                for (int i = 0; i < bytes; i++) //將資料轉成16進位
                {
                    temp2 = buffer[i].ToString("x").ToUpper();
                    if (temp2.Length == 1)
                        data += "0" + temp2;
                    else
                        data += temp2;
                }
                //判斷接收資料長度是否正確,若正確就回傳
                if (data.StartsWith("86") && data.Length == 16)
                {
                    //判斷卡片編號為7個位元組或4個位元組
                    if (data.Substring(10, 2).Equals("00") & data.Substring(12, 2).Equals("00") & data.Substring(14, 2).Equals("00"))
                        TAG_UID = data.Substring(2, 8);
                    else
                        TAG_UID = data.Substring(2, 14);
                }
                if (data.StartsWith("80"))
                    TAG_UID = "";
                return TAG_UID;
            }
        }
    }




    • 已編輯 繁星 2013年6月16日 上午 11:04
    2013年6月16日 上午 10:52

解答

  • 你 button 1 的text是什麼?

    button1.Text.Equals("Srart")

    程式點擊以後就近來這裡判斷

    結果con是null阿


    Frank

    • 已標示為解答 繁星 2013年6月16日 下午 04:16
    2013年6月16日 下午 12:30

所有回覆

  • 你 button 1 的text是什麼?

    button1.Text.Equals("Srart")

    程式點擊以後就近來這裡判斷

    結果con是null阿


    Frank

    • 已標示為解答 繁星 2013年6月16日 下午 04:16
    2013年6月16日 下午 12:30
  • 寫程式時,請注意自己有沒有打錯字....

    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2013年6月16日 下午 12:40
    版主
  •         private void button1_Click(object sender, EventArgs e)
            {
                if (button1.Text.Equals("Srart"))
                {
                    con = new connect(serialPort1, (comboBox1.SelectedItem).ToString());
                    con.open_port();
                    button1.Text = "Stop";
                    timerClock1.Enabled = true;
                    label3.Text = "connected";
                }
                else
                {
                    con.close_port();
                    button1.Text = "Start";
                    timerClock1.Enabled = false;
                    label3.Text = "Not Connected";
                }
            }
     

    你 con 是在 if 成立時才 new 指定的,那麼,不成立時, null 參照不是很正常嗎?

    2013年6月16日 下午 01:16
  • Dear 小朱

    有,我有看到了,下次我會認真檢查程式碼,謝謝提醒。

    • 已編輯 繁星 2013年6月16日 下午 04:19
    2013年6月16日 下午 04:08
  • Dear 心冷熱情熄

    恩,我之後有翻Visual C#的相關書籍看,才了解if..else的用法。

    謝謝你用分解的方式引導,有相關的錯誤時,我會仔細程式碼。



    • 已編輯 繁星 2013年6月16日 下午 04:20
    2013年6月16日 下午 04:14
  • Dear JHShen

    我button1的Text是"Start"。

    而我程式碼那邊卻打成"Srart",真是慚愧..。

    原來只是一個小小的錯誤,讓我徹底上了一課,謝謝。


    • 已編輯 繁星 2013年6月16日 下午 04:21
    2013年6月16日 下午 04:21