📄 form1.cs
字号:
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;
namespace MobileTools
{
public delegate void phoneMessageHandler(string message);
public delegate void signalStrengthHandler(string message);
public delegate void callerIdHandler(string message);
public delegate void modeHandler(string message);
public delegate void batteryStatusHandler(string message);
public delegate void volumeHandler(string message);
public partial class Form1 : Form
{
SerialPort port;
public event phoneMessageHandler message;
private int _mode;
public Form1()
{
InitializeComponent();
//add the list of port names to select from
cbPorts.Items.AddRange(SerialPort.GetPortNames());
//event to handle messages recieved from the phone
message += new phoneMessageHandler(Form1_message);
}
void Form1_volume(string message)
{
//decode caller id
string[] sep = {","};
string[] volume = message.Remove(0, 6).Split(sep, StringSplitOptions.None);
//if it is the ringer
if (volume[0].Trim() == "1")
volumeLevel.Value = int.Parse(volume[1]);
}
void Form1_battery(string message)
{
//decode caller id
string[] sep = {"," };
string[] battery = message.Remove(0, 5).Split(sep, StringSplitOptions.None);
//txtPhoneNumber.Text = caller[0];
pPowerLevel.Value = int.Parse(battery[1]);
}
void Form1_mode(string message)
{
switch (message)
{
case "+MODE: 0":
lbMode.Text = "Mode: 0";
_mode = 0;
break;
case "+MODE: 2":
lbMode.Text = "Mode: 2";
_mode = 2;
break;
default:
lbMode.Text = "Error: Unknown Mode";
_mode = -1;
break;
}
}
void Form1_callerId(string message)
{
//decode caller id
string[] sep = {","};
string[] caller = message.Remove(0, 6).Split(sep, StringSplitOptions.None);
txtPhoneNumber.Text = caller[0].Remove(0,1);
if (caller.Length > 4)
txtName.Text = caller[4];
}
void Form1_signal(string message)
{
//decode signal strength
switch (message)
{
case "+MSSI: 0":
signalStrength.Value = 0;
MessageBox.Show("No signal found");
break;
case "+MSSI: 1":
signalStrength.Value = 1;
break;
case "+MSSI: 25":
signalStrength.Value = 2;
break;
case "+MSSI: 56":
signalStrength.Value = 3;
break;
case "+MSSI: 75":
signalStrength.Value = 4;
break;
case "+MSSI: 90":
signalStrength.Value = 5;
break;
default:
MessageBox.Show("Signal strenght not recognized: " + message);
break;
}
}
private void button1_Click(object sender, EventArgs e)
{
if (cbPorts.SelectedIndex == -1)
{
MessageBox.Show("You must select a port first");
return;
}
port = new SerialPort(cbPorts.SelectedItem.ToString());
port.Open();
port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
btnConnect.Enabled = false;
cbPorts.Enabled = false;
listBox1.Items.Add("Connection successful.");
setMode(2);
//get the signal strength
setField("AT+MSSI?");
System.Threading.Thread.Sleep(1000);
//get the battery level
setField("AT+CBC");
System.Threading.Thread.Sleep(1000);
//get the ring volumne level
setField("AT+MAVL?");
System.Threading.Thread.Sleep(1000);
//set the calling line identification to enabled
setField("AT+CLIP=1");
System.Threading.Thread.Sleep(1000);
}
void Form1_message(string message)
{
if (message.Length > 0)
{
//signal strength
if (message.StartsWith("+MSSI"))
{
signalStrengthHandler s = new signalStrengthHandler(Form1_signal);
this.Invoke(s, new object[] { message });
return;
}
//Caller ID
if (message.StartsWith("+CLIP"))
{
callerIdHandler c = new callerIdHandler(Form1_callerId);
this.Invoke(c, new object[] { message });
return;
}
//mode
if (message.StartsWith("+MODE"))
{
modeHandler m = new modeHandler(Form1_mode);
this.Invoke(m, new object[] { message });
return;
}
//battery status
if (message.StartsWith("+CBC"))
{
batteryStatusHandler b = new batteryStatusHandler(Form1_battery);
this.Invoke(b, new object[] { message });
return;
}
//volume level
if (message.StartsWith("+MAVL"))
{
volumeHandler v = new volumeHandler(Form1_volume);
this.Invoke(v, new object[] { message });
//return;
}
//other message from phone
if (this.listBox1.InvokeRequired)
{
phoneMessageHandler d = new phoneMessageHandler(Form1_message);
this.Invoke(d, new object[] { message });
}
else
{
listBox1.Items.Add(message);
if (message == "RING")
{
//incoming call
//set it to the top most form
bntEndCall.Enabled = true;
this.WindowState = FormWindowState.Normal;
this.TopMost = true;
this.TopMost = false;
}
}
}
}
void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
//data is received so read it off of the buffer
readbuffer();
}
private void btnSendAT_Click(object sender, EventArgs e)
{
//send attention command
//phone should respond with and OK
setField("AT");
}
private void button2_Click(object sender, EventArgs e)
{
//read anything on the buffer
readbuffer();
}
private void button3_Click(object sender, EventArgs e)
{
//send whatever command is in the text box
//to the phone
setField(textBox1.Text);
}
private void readbuffer()
{
int buffersize = port.BytesToRead;
StringBuilder line = new StringBuilder();
int Bval;
for (int i = 0; i < buffersize; i++)
{
//data is received read the message
Bval = port.ReadByte();
switch(Bval)
{
case 10: //new line
message(line.ToString());
line = new StringBuilder();
break;
case 13: //carriage return - ignore
break;
default: //build string message
line.Append(char.ConvertFromUtf32(Bval));
break;
}
}
//send string message for processing.
message(line.ToString());
}
private void setField(string value)
{
//convert the string data to
//byte values to send to the phone
StringBuilder sb = new StringBuilder(value);
int size = sb.Length;
byte[] data = new byte[size+1];
for (int i = 0; i < sb.Length; i++)
{
data[i] = (byte)sb[i];
}
data[size] = (byte)Convert.ToChar(13);
//send the data
if (port.IsOpen)
port.Write(data, 0, size+1);
else
{
timer1.Enabled = false;
message("Port not opened");
}
}
private void btnClear_Click(object sender, EventArgs e)
{
listBox1.Items.Clear();
}
private void btnMode2_Click(object sender, EventArgs e)
{
//change the mode to 2
//advanced AT commands
setMode(2);
}
private void setMode(int val)
{
if (_mode == val)
return;
switch (val)
{
case 0:
//set the mode to 0
setField("AT+MODE=0");
break;
case 2:
//set the mode to 2
setField("AT+MODE=2");
break;
default:
MessageBox.Show("Mode: " + val.ToString() + " not recognized.");
break;
}
System.Threading.Thread.Sleep(1000);
setField("AT+MODE?");
}
private void btnMode0_Click(object sender, EventArgs e)
{
//change the mode to 0
setMode(0);
}
private void btnClose_Click(object sender, EventArgs e)
{
timer1.Enabled = false;
port.Close();
message("Closed connection");
btnConnect.Enabled = true;
cbPorts.Enabled = true;
}
private void Form1_Resize(object sender, EventArgs e)
{
//check if the form is being minimize
//if so minimize to the system tray
if (FormWindowState.Minimized == WindowState)
this.Hide();
}
private void notifyIcon1_DoubleClick(object sender, EventArgs e)
{
//icon in system tray has been
//double clicked
this.Show();
WindowState = FormWindowState.Normal;
}
private void bntEndCall_Click(object sender, EventArgs e)
{
//send end call command
setField("AT+CHUP");
}
private void timer1_Tick(object sender, EventArgs e)
{
//request cellular signal strength
setField("AT+MSSI?");
}
private void button4_Click(object sender, EventArgs e)
{
//answer the call.
setField("ATA");
}
private void button5_Click(object sender, EventArgs e)
{
//enable the timer which checks
//the signal strength every two minutes.
//timer1.Enabled = true;
//set the mode to 2
setMode(2);
//get the signal strength
setField("AT+MSSI?");
System.Threading.Thread.Sleep(1000);
//get the battery level
setField("AT+CBC");
System.Threading.Thread.Sleep(1000);
//get the ring volumne level
setField("AT+MAVL?");
}
private void volumeLevel_Scroll(object sender, EventArgs e)
{
setMode(2);
setField("AT+MAVL=1," + volumeLevel.Value.ToString());
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -