zoukankan      html  css  js  c++  java
  • 短信猫软件的实现(C#)<一>熟悉串口

    GSM Modem俗称“短信猫”,PC可通过串口与其通信,通过向其所连接的串口发送AT指令控制我们的“猫”发送短信

    写这样一个软件,首先要了解串口通信,.NET已经为我们封装了SerialPort类,方便串口通信。为了熟悉此串口类,我简单实现了一个串口调试器。

    运行效果:

    image

    主要源代码:

    简单串口调试器代码。
    1. using System;
    2. using System.Drawing;
    3. using System.IO.Ports;
    4. using System.Runtime.InteropServices;
    5. using System.Text;
    6. using System.Windows.Forms;
    7. namespace 串口调试器
    8. {
    9.     public partial class Form1 : Form
    10.     {
    11.         //hotkeyWinapi声明:
    12.         [DllImport("user32.dll")]
    13.         [return: MarshalAs(UnmanagedType.Bool)]
    14.         public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk);
    15.         [DllImport("user32.dll")]
    16.         [return: MarshalAs(UnmanagedType.Bool)]
    17.         public static extern bool UnregisterHotKey(IntPtr hWnd, int id);
    18.         
    19.         SerialPort sp = new SerialPort();       //声明串口类
    20.         bool stoptb2 = false;
    21.         //发送字节计数
    22.         int fscout = 0;
    23.         //接收字节计数
    24.         int jscout = 0;
    25.         //十六进制显示标志
    26.         bool ishex = false;
    27.         //委托
    28.         delegate void HandleInterfaceUpdateDelegate(string text);  //委托,此为重点
    29.         HandleInterfaceUpdateDelegate interfaceUpdateHandle = null;
    30.         public Form1()
    31.         {
    32.             InitializeComponent();
    33.         }
    34.         //重载函数
    35.         protected override void WndProc(ref Message m)
    36.         {
    37.             //
    38.             const int WM_HOTKEY = 0x0312;
    39.             if (m.Msg == WM_HOTKEY)
    40.             {
    41.                 int id = m.WParam.ToInt32();
    42.                 //Ctrl+Z
    43.                 Byte[] byte1 = new Byte[1];
    44.                 byte1[0] = 0x1A;
    45.                 if (id == 100)
    46.                 {
    47.                     if (sp.IsOpen == true)
    48.                     {
    49.                         sp.Write(byte1, 0, 1);
    50.                     }
    51.                 }
    52.             }
    53.             base.WndProc(ref m);
    54.         }
    55.         private void Form1_Load(object sender, EventArgs e)
    56.         {
    57.             //初始化状态栏
    58.             toolStripStatusLabel1.Text = "串口调试器正在初始化    ";
    59.             //热键注册Ctrl+Alt+Z
    60.             RegisterHotKey(this.Handle, 100, 6, Convert.ToUInt32(Keys.Z));
    61.             //初始化combox1
    62.             foreach (string s in SerialPort.GetPortNames())
    63.             {
    64.                 comboBox1.Items.Add(s);
    65.             }
    66.             //初始化combox2
    67.             comboBox2.Items.Add("300");
    68.             comboBox2.Items.Add("600");
    69.             comboBox2.Items.Add("1200");
    70.             comboBox2.Items.Add("2400");
    71.             comboBox2.Items.Add("4800");
    72.             comboBox2.Items.Add("9600");
    73.             comboBox2.Items.Add("19200");
    74.             comboBox2.Items.Add("38400");
    75.             comboBox2.Items.Add("76800");
    76.             comboBox2.Items.Add("115200");
    77.             comboBox2.SelectedIndex = 5;
    78.             //初始化combox3
    79.             comboBox3.Items.Add("None");
    80.             comboBox3.Items.Add("Odd");
    81.             comboBox3.Items.Add("Even");
    82.             comboBox3.SelectedIndex = 0;
    83.             //初始化combox4
    84.             comboBox4.Items.Add("8");
    85.             comboBox4.Items.Add("7");
    86.             comboBox4.Items.Add("6");
    87.             comboBox4.SelectedIndex = 0;
    88.             //初始化combox5
    89.             comboBox5.Items.Add("1");
    90.             comboBox5.Items.Add("2");
    91.             comboBox5.SelectedIndex = 0;
    92.             //textbox1初始化
    93.             textBox1.Text = "1000";
    94.             //有串口
    95.             if (comboBox1.Items.Count > 0)
    96.             {
    97.                 comboBox1.SelectedIndex = 0;
    98.             
    99.                 //串口变量初始化
    100.                 sp.PortName = comboBox1.SelectedItem.ToString();
    101.                 sp.BaudRate = Convert.ToInt32(comboBox2.SelectedItem.ToString());
    102.                 sp.Parity = (Parity)Enum.Parse(typeof(Parity), comboBox3.SelectedItem.ToString());
    103.                 sp.DataBits = int.Parse(comboBox4.SelectedItem.ToString());
    104.                 sp.StopBits = (StopBits)Enum.Parse(typeof(StopBits), comboBox5.SelectedItem.ToString());
    105.                 sp.RtsEnable = true;
    106.                 sp.ReceivedBytesThreshold = 1;//设置 DataReceived 事件发生前内部输入缓冲区中的字节数
    107.                 sp.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.sp_DataReceived);    //DataReceived事件委托
    108.  
    109.             }
    110.             else
    111.             {
    112.                 label9.Text = "未检测到串口";
    113.                 label9.ForeColor = Color.Red;
    114.             }
    115.             //委托实例化
    116.             interfaceUpdateHandle = new HandleInterfaceUpdateDelegate(UpdateTextBox);  //实例化委托对象 
    117. 
      
    118.             //初始化状态栏
    119.             toolStripStatusLabel1.Text = "串口调试器初始化成功    ";
    120.         }
    121.         //委托的函数
    122.         private void UpdateTextBox(string text)
    123.         {
    124.             if (stoptb2 == false)
    125.             {
    126.                 textBox3.Text += text;
    127.             }
    128.             //更新接收显示
    129.             toolStripStatusLabel3.Text = String.Format(" 接收:{0} 字节    ", jscout);
    130.         }
    131.         //DataReceived事件委托方法
    132.         private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
    133.         {
    134.             int readlen = sp.BytesToRead;
    135.             //接收计数
    136.             jscout += readlen;
    137.             byte[] readBuffer = new byte[sp.ReadBufferSize];
    138.             sp.Read(readBuffer, 0, readBuffer.Length);
    139.             if (ishex)
    140.             {
    141.                 string readbuf = null;
    142.                 //十六进制格式化数据
    143.                 for(int i=0;i<readlen;i++)
    144.                 {
    145.                     string s = String.Format("{0:X}", Convert.ToInt32(readBuffer[i]));
    146.                     if (s.Length > 1)
    147.                     {
    148.                         readbuf += s+" ";
    149.                     }
    150.                     else
    151.                     {
    152.                         readbuf += "0" + s + " ";
    153.                     }
    154.                 }
    155.                 
    156.                 this.Invoke(interfaceUpdateHandle, readbuf);
    157.                     
    158.             }
    159.             else
    160.             {
    161.             
    162.                 
    163.                 this.Invoke(interfaceUpdateHandle, new string[] { Encoding.UTF8.GetString(readBuffer) });
    164.                 
    165.             }
    166.             
    167.         }
    168.         private void button1_Click(object sender, EventArgs e)
    169.         {
    170.             if (sp.IsOpen == false)
    171.             {
    172.                 try
    173.                 {
    174.                     sp.Open();
    175.                     //清空缓冲区
    176.                     sp.DiscardInBuffer();
    177.                     sp.DiscardOutBuffer();
    178.                 }
    179.                 catch (Exception)
    180.                 {
    181.                     label9.Text = "串口无法连接";
    182.                     return;
    183.                 }
    184.                     button1.Text = "断开串口";
    185.                     label6.Text = "已连接";
    186.                     label6.ForeColor = Color.Green;
    187.                     label9.Text = sp.PortName + "," + sp.BaudRate + "," + sp.Parity + "," + sp.DataBits + "," + sp.StopBits;
    188.                     //改变状态栏
    189.                     toolStripStatusLabel1.Text = "  " + label9.Text + "   ";
    190.                 
    191.             }
    192.             else
    193.             {
    194.                 if (checkBox2.Checked)
    195.                 {
    196.                     MessageBox.Show("正在发送,请先停止自动发送");
    197.                     return;
    198.                 }
    199.                 sp.Close();
    200.                 label6.Text = "已断开";
    201.                 label6.ForeColor = Color.Red;
    202.                 label9.Text = " 串口关闭状态";
    203.                 button1.Text = "连接串口";
    204.                 //改变状态栏
    205.                 toolStripStatusLabel1.Text = "串口关闭状态 不能操作串口";
    206.             }
    207.         }
    208.         private void button2_Click(object sender, EventArgs e)
    209.         {
    210.             if (stoptb2 == false)       //停止显示标志置位
    211.             {
    212.                 stoptb2 = true;
    213.                 button2.Text = "继续显示";
    214.             }
    215.             else
    216.             {
    217.                 stoptb2 = false;                    //停止显示标志复位
    218.                 button2.Text = "停止显示";
    219.             }
    220.         }
    221.         private void button3_Click(object sender, EventArgs e)
    222.         {
    223.             textBox3.Text = "";
    224.         }
    225.         private void button4_Click(object sender, EventArgs e)
    226.         {
    227.             if (sp.IsOpen == true)
    228.             {
    229.                 fscout += textBox2.Text.Length;
    230.                 sp.Write(textBox2.Text);
    231.                 toolStripStatusLabel2.Text = String.Format("  发送:{0} 字节    ", fscout);
    232.             }
    233.             else
    234.             {
    235.                 MessageBox.Show("串口未打开");
    236.             }
    237.         }
    238.         private void button5_Click(object sender, EventArgs e)
    239.         {
    240.             fscout = 0;
    241.             toolStripStatusLabel2.Text = "  发送:0 字节    ";
    242.         }
    243.         private void button6_Click(object sender, EventArgs e)
    244.         {
    245.             jscout = 0;
    246.             toolStripStatusLabel3.Text = " 接收:0 字节    ";
    247.         }
    248.         private void button7_Click(object sender, EventArgs e)
    249.         {
    250.             About abFrm = new About();
    251.             abFrm.Owner = this;
    252.             abFrm.ShowDialog();
    253.         }
    254.         //程序退出
    255.         private void button8_Click(object sender, EventArgs e)
    256.         {
    257.             UnregisterHotKey(this.Handle, 100);
    258.             sp.Close();
    259.             this.Close();
    260.         }
    261.         //combox1改变
    262.         private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    263.         {
    264.             if (sp.IsOpen == false)
    265.             {
    266.                 sp.PortName = comboBox1.SelectedItem.ToString();
    267.             }
    268.         }
    269.         //combox2改变
    270.         private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
    271.         {
    272.             sp.BaudRate = Convert.ToInt32(comboBox2.SelectedItem.ToString());
    273.         }
    274.         //combox3改变
    275.         private void comboBox3_SelectedIndexChanged(object sender, EventArgs e)
    276.         {
    277.             sp.Parity = (Parity)Enum.Parse(typeof(Parity), comboBox3.SelectedItem.ToString());
    278.         }
    279.         //combox4改变
    280.         private void comboBox4_SelectedIndexChanged(object sender, EventArgs e)
    281.         {
    282.             sp.DataBits = int.Parse(comboBox4.SelectedItem.ToString());
    283.         }
    284.         //combox5改变
    285.         private void comboBox5_SelectedIndexChanged(object sender, EventArgs e)
    286.         {
    287.             sp.StopBits = (StopBits)Enum.Parse(typeof(StopBits), comboBox5.SelectedItem.ToString());
    288.         }
    289.         private void checkBox1_CheckedChanged(object sender, EventArgs e)
    290.         {
    291.             if (checkBox1.Checked)
    292.             {
    293.                 ishex = true;
    294.             }
    295.             else
    296.             {
    297.                 ishex = false;
    298.             }
    299.         }
    300.         private void timer1_Tick(object sender, EventArgs e)
    301.         {
    302.             if (sp.IsOpen == true)
    303.             {
    304.                 fscout += textBox2.Text.Length;
    305.                 sp.Write(textBox2.Text);
    306.                 toolStripStatusLabel2.Text = String.Format("  发送:{0} 字节    ", fscout);
    307.             }
    308.             else
    309.             {
    310.                 MessageBox.Show("串口未打开");
    311.             }
    312.         }
    313.         private void checkBox2_CheckedChanged(object sender, EventArgs e)
    314.         {
    315.             if (sp.IsOpen == false)
    316.             {
    317.                 checkBox2.Checked = false;
    318.             }
    319.             else
    320.             {
    321.                 timer1.Enabled = checkBox2.Checked;
    322.             }
    323.             
    324.         }
    325.         private void textBox1_TextChanged(object sender, EventArgs e)
    326.         {
    327.             if (textBox1.Text == null||textBox1.Text=="")
    328.             {
    329.                 timer1.Interval = 1000;
    330.             }
    331.             else
    332.             {
    333.                 timer1.Interval = Convert.ToInt32(textBox1.Text);
    334.             }
    335.         }
    336.         private void checkBox2_Click(object sender, EventArgs e)
    337.         {
    338.             if (sp.IsOpen == false)
    339.             {
    340.                 MessageBox.Show("串口未连接");
    341.             }
    342.         }
    343.     }
    344. }

    作为C#新手的我第一次完成一个比较完整的程序

    不足之处欢迎大家拍砖

    附件:工程项目文件

  • 相关阅读:
    SD卡测试
    测试人员可能会遇到的问题
    HDU 1024 Max Sum Plus Plus
    HDU 1176 免费馅饼
    HDU 1257 最少拦截系统
    HDU 1087 Super Jumping! Jumping! Jumping!
    poj 1328 Radar Installation
    poj 1753 Flip Game
    HDU 1003 Max Sum
    HDU 5592 ZYB's Premutation(BestCoder Round #65 C)
  • 原文地址:https://www.cnblogs.com/Engin/p/1868365.html
Copyright © 2011-2022 走看看