close

(1) RJ45轉RS232

image

(2) RS232轉USB

image

(3) 電子鐘<->RJ45轉RS232轉換器接線 如下

image

(4)電子鐘電源接上後, 預設0:00.00

image

系統接線圖如下

image

新增一個Windows Form應用程式

image

GUI介面設計如下

image

電子鐘RS232通訊協定

   1: Byte0  Byte1  Byte2  Byte3  Byte4  Byte5  Byte6  Byte7  Byte8  Byte9
   2: --------------------------------------------------------------------
   3: 0xFF   0xFF   0xFF   0x00   0x00   <--倒數剩餘秒數--->  0xFE   0xFE
   4:  
   5: 倒數剩餘秒數=Byte5*65536 + Byte6*256 + Byte7
   6:  
   7: 例如  1小時10分10秒(倒數剩餘秒數=4210秒)===>Byte5=0x00, Byte6=0x10, Byte7=0x72

 

使用命名空間

   1: using System.Threading;
   2: using System.IO.Ports;

變數宣告

   1: enum ProcStatus { Running, Pause, Stop };
   2:     
   3: // 變數宣告
   4: Thread gProcThread;                        // 通訊執行緒
   5: ProcStatus gProcThreadStatus;              
   6: SerialPort comport;                        // 串列通訊物件
   7: bool _shouldStop = false;                  // 是否停止執行


開始按鈕

   1: private void InputProcControlStartBtn_Click(object sender, EventArgs e)
   2:        {
   3:            ProcControlPauseBtn.Enabled = true;
   4:            ProcControlStopBtn.Enabled = true;
   5:  
   6:            string com = comboBox1.Text;
   7:            int baudrate = int.Parse(comboBox2.Text);
   8:            int parity = comboBox3.SelectedIndex;
   9:            int databits = int.Parse(comboBox4.Text);
  10:            int stopbits = int.Parse(comboBox5.Text);
  11:            comport = new SerialPort(com, baudrate, (Parity)parity, databits, (StopBits)stopbits); 
  12:            try
  13:            {
  14:                if (!comport.IsOpen)
  15:                    comport.Open();
  16:                _shouldStop = false;
  17:                gProcThread = new Thread(new ThreadStart(ProcControl));   
  18:                gProcThread.Start();
  19:            }
  20:            catch
  21:            {
  22:                serialPort1.Close();
  23:            }
  24:        }

其中ProcControl定義如下:

   1: private void ProcControl()
   2:         {
   3:             uint Start = 3600;
   4:             uint i=Start;
   5:             uint hour;
   6:             uint min;
   7:             uint sec;
   8:             gProcThreadStatus = ProcStatus.Running;
   9:             byte[] data = new byte[10]{ 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe };
  10:             while(!_shouldStop){
  11:                 hour = i/65536;
  12:                 min = i/256;
  13:                 sec = i - hour*65536 - min*256;
  14:                 data[5] = (byte) hour;
  15:                 data[6] = (byte) min;
  16:                 data[7] = (byte) sec;
  17:                 comport.Write(data, 0, data.Length);
  18:                 Thread.Sleep(1000);
  19:                 i--;
  20:                 if(i<=0) i=Start;
  21:             }
  22:         }

暫停按鈕

   1: private void InputProcControlPauseBtn_Click(object sender, EventArgs e)
   2:        {
   3:            if (ProcControlPauseBtn.Text == "暫停")
   4:            {
   5:                ProcControlPauseBtn.Text = "繼續";
   6:                gProcThread.Suspend();
   7:                gProcThreadStatus = ProcStatus.Pause;          // 更新執行狀態: 暫停   
   8:                ProcControlStopBtn.Enabled = false;
   9:            }
  10:            else
  11:            {
  12:                ProcControlPauseBtn.Text = "暫停";
  13:                gProcThreadStatus = ProcStatus.Running;        // 更新執行狀態: 繼續Running
  14:                gProcThread.Resume();
  15:                ProcControlStopBtn.Enabled = true;
  16:            }
  17:        }

停止按鈕

   1: private void InputProcControlStopBtn_Click(object sender, EventArgs e)
   2:        {
   3:            if (gProcThread.IsAlive)
   4:            {
   5:                try
   6:                {
   7:                    gProcThread.Abort();
   8:                    comport.Close();
   9:                    _shouldStop = true;
  10:                    gProcThread = null;
  11:                    //gProcThread.Join();
  12:                    gProcThreadStatus = ProcStatus.Stop;
  13:                }
  14:                catch (ThreadStateException)
  15:                {
  16:                    //gProcThread.Resume();
  17:                }
  18:                ProcControlStartBtn.Enabled = true;
  19:                ProcControlPauseBtn.Enabled = false;
  20:                ProcControlStopBtn.Enabled = false;
  21:            }
  22:        }

測試結果

arrow
arrow
    全站熱搜

    me1237guy 發表在 痞客邦 留言(0) 人氣()