该程序发短信不是很稳定,有时发短信正确,有时又没反应,有时把AT指令一起发了! 不知道什么原因!
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.IO.Ports;namespace MultiLangTest
{
    public partial class SerialPortTest : Form
    {
        private SerialPort sp;
        public SerialPortTest()
        {
            InitializeComponent();
        }        private void button1_Click(object sender, EventArgs e)
        {
            Parity p = Parity.None;
            switch (comboBox5.Text.ToLower())
            {
                case "none":
                    p = Parity.None;
                    break;
                case "odd":
                    p = Parity.Odd;
                    break;
                case "even":
                    p = Parity.Even;
                    break;
                case "":
                    p = Parity.Mark;
                    break;
                case "space":
                    p = Parity.Space;
                    break;
                default:
                    break;
            }
            StopBits sb = StopBits.None;
            switch (comboBox4.Text.ToLower())
            {
                case "1":
                    sb = StopBits.One;
                    break;
                case "1.5":
                    sb = StopBits.OnePointFive;
                    break;
                case "2":
                    sb = StopBits.Two;
                    break;
                default:
                    break;
            }            sp = new SerialPort(comboBox1.Text, Convert.ToInt32(comboBox2.Text),
                               p, Convert.ToInt32(comboBox3.Text), sb);            //sp.DataReceived += new SerialDataReceivedEventHandler(this.ReadSMSData);            if (sp.IsOpen)
            {
                //MessageBox.Show(string.Format("{0} 串口已经打开", comboBox1.Text));
                sp.Close();
                sp.Open();
            }
            try
            {
                sp.Open();
            }
            catch (UnauthorizedAccessException ex)
            {
                MessageBox.Show("错误:" + ex.Message);
                return;
            }
        }
        private void button2_Click(object sender, EventArgs e)
        {
    
            sp.Write("AT+CMGF=1\r"); 
            sp.Write("AT+CMGs=\"13316979816\"\r"); 
            sp.Write(this.textBox1.Text + "\x01a");//发送短信息,使用Ctrl+Z结束
        }        private void groupBox1_Enter(object sender, EventArgs e)
        {        }        private void label8_Click(object sender, EventArgs e)
        {        }        private void textBox3_TextChanged(object sender, EventArgs e)
        {        }        private void comboBox3_SelectedIndexChanged(object sender, EventArgs e)
        {        }        private void comboBox6_SelectedIndexChanged(object sender, EventArgs e)
        {        }        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {        }        private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
        {        }        private void comboBox5_SelectedIndexChanged(object sender, EventArgs e)
        {        }        private void groupBox1_Enter_1(object sender, EventArgs e)
        {        }        private void textBox1_TextChanged(object sender, EventArgs e)
        {        }        private void textBox2_TextChanged(object sender, EventArgs e)
        {        }         private void comboBox1_SelectedIndexChanged_1(object sender, EventArgs e)
        {        }        private void button4_Click_1(object sender, EventArgs e)
        {
            sp.Close();
            Application.Exit();
        }    }
}

解决方案 »

  1.   

    主要代码:            sp = new SerialPort(comboBox1.Text, Convert.ToInt32(comboBox2.Text),
                                   p, Convert.ToInt32(comboBox3.Text), sb);
             //初始化串口if (sp.IsOpen)
                {
                    //MessageBox.Show(string.Format("{0} 串口已经打开", comboBox1.Text));
                    sp.Close();
                    sp.Open();
                }
                try
                {
                    sp.Open();
                }
                catch (UnauthorizedAccessException ex)
                {
                    MessageBox.Show("错误:" + ex.Message);
                    return;
                }
            }
            //打开串口private void button2_Click(object sender, EventArgs e)//点击发送按钮向串口写AT指令发送短信
            {
        
                sp.Write("AT+CMGF=1\r"); 
                sp.Write("AT+CMGs=\"13316979816\"\r"); 
                sp.Write(this.textBox1.Text + "\x01a");//发送短信息,使用Ctrl+Z结束
               
            }
      

  2.   

    sp.Write(...)
    Threading.Thread.Sleep(50)
    .....
      

  3.   

    soaringbird说的对
    一定要判断返回值,貌似有些指令是等返回值读取以后才继续执行的
    而且实际使用的时候,由于网络问题,指令执行情况也千奇百怪的
    很久没弄了,之前也没彻底弄明白过,仅供参考~
      

  4.   

    你们这里说的返回值是 Write函数的返回值吧。那是不是应该这样写。
    private   void   button2_Click(object   sender,   EventArgs   e)//点击发送按钮向串口写AT指令发送短信 
                    { 
            
                          int n=  sp.Write( "AT+CMGF=1\r ");   
                     if n>0
                         int b=sp.Write( "AT+CMGs=\ "13316979816\ "\r ");  
                     if b>0 
                            sp.Write(this.textBox1.Text   +   "\x01a ");//发送短信息,使用Ctrl+Z结束 
                       
                          
                    }
      

  5.   

    不是Write的,而是AT指令的返回值,比如AT+CMGF=1要返回一个OK,你得处理这个OK之后才去做别的
      

  6.   

    using System;
    using System.IO.Ports;
    using System.Threading;public class PortChat
    {
        static bool _continue;
        static SerialPort _serialPort;    public static void Main()
        {
            try
            {
                string name;
                string message;
                StringComparer stringComparer = StringComparer.OrdinalIgnoreCase;
                Thread readThread = new Thread( Read );            // Create a new SerialPort object with default settings.
                _serialPort = new SerialPort();            // Allow the user to set the appropriate properties.
                //_serialPort.PortName = SetPortName( _serialPort.PortName );
                //_serialPort.BaudRate = SetPortBaudRate( _serialPort.BaudRate );
                //_serialPort.Parity = SetPortParity( _serialPort.Parity );
                //_serialPort.DataBits = SetPortDataBits( _serialPort.DataBits );
                //_serialPort.StopBits = SetPortStopBits( _serialPort.StopBits );
                //_serialPort.Handshake = SetPortHandshake( _serialPort.Handshake );            // Set the read/write timeouts
                _serialPort.ReadTimeout = 5000;
                _serialPort.WriteTimeout = 500;            _serialPort.Open();
                _continue = true;
                readThread.Start();            Console.Write( "Name: " );
                name = Console.ReadLine();            Console.WriteLine( "Type QUIT to exit" );            while( _continue )
                {
                    message = Console.ReadLine();                if( stringComparer.Equals( "quit", message ) )
                    {
                        _continue = false;
                    }
                    else
                    {
                        _serialPort.WriteLine(
                            String.Format( "<{0}>: {1}", name, message ) );
                    }
                }            readThread.Join();
                _serialPort.Close();
            }
            catch( Exception ex )
            {
                Console.WriteLine( ex.Message );
            }
        }    public static void Read()
        {
            while( _continue )
            {
                try
                {
                    string message = _serialPort.ReadLine();
                    Console.WriteLine( message );
                }
                catch( TimeoutException )
                {
                }
            }
        }    public static string SetPortName( string defaultPortName )
        {
            string portName;        Console.WriteLine( "Available Ports:" );
            foreach( string s in SerialPort.GetPortNames() )
            {
                Console.WriteLine( "   {0}", s );
            }        Console.Write( "COM port({0}): ", defaultPortName );
            portName = Console.ReadLine();        if( portName == "" )
            {
                portName = defaultPortName;
            }
            return portName;
        }    public static int SetPortBaudRate( int defaultPortBaudRate )
        {
            string baudRate;        Console.Write( "Baud Rate({0}): ", defaultPortBaudRate );
            baudRate = Console.ReadLine();        if( baudRate == "" )
            {
                baudRate = defaultPortBaudRate.ToString();
            }        return int.Parse( baudRate );
        }    public static Parity SetPortParity( Parity defaultPortParity )
        {
            string parity;        Console.WriteLine( "Available Parity options:" );
            foreach( string s in Enum.GetNames( typeof( Parity ) ) )
            {
                Console.WriteLine( "   {0}", s );
            }        Console.Write( "Parity({0}):", defaultPortParity.ToString() );
            parity = Console.ReadLine();        if( parity == "" )
            {
                parity = defaultPortParity.ToString();
            }        return ( Parity )Enum.Parse( typeof( Parity ), parity );
        }    public static int SetPortDataBits( int defaultPortDataBits )
        {
            string dataBits;        Console.Write( "Data Bits({0}): ", defaultPortDataBits );
            dataBits = Console.ReadLine();        if( dataBits == "" )
            {
                dataBits = defaultPortDataBits.ToString();
            }        return int.Parse( dataBits );
        }    public static StopBits SetPortStopBits( StopBits defaultPortStopBits )
        {
            string stopBits;        Console.WriteLine( "Available Stop Bits options:" );
            foreach( string s in Enum.GetNames( typeof( StopBits ) ) )
            {
                Console.WriteLine( "   {0}", s );
            }        Console.Write( "Stop Bits({0}):", defaultPortStopBits.ToString() );
            stopBits = Console.ReadLine();        if( stopBits == "" )
            {
                stopBits = defaultPortStopBits.ToString();
            }        return ( StopBits )Enum.Parse( typeof( StopBits ), stopBits );
        }    public static Handshake SetPortHandshake( Handshake defaultPortHandshake )
        {
            string handshake;        Console.WriteLine( "Available Handshake options:" );
            foreach( string s in Enum.GetNames( typeof( Handshake ) ) )
            {
                Console.WriteLine( "   {0}", s );
            }        Console.Write( "Stop Bits({0}):", defaultPortHandshake.ToString() );
            handshake = Console.ReadLine();        if( handshake == "" )
            {
                handshake = defaultPortHandshake.ToString();
            }        return ( Handshake )Enum.Parse( typeof( Handshake ), handshake );
        }
    }找了个例子,看看哦
      

  7.   

    这个应该看你串口通讯用的是什么协议,比如modbus协议她就需要接受返回值。
    我觉得造成有时好用又是不好用的主要原因应该是指令发送间隔不够。把时间调长一点试一试
      

  8.   

    编程要有好习惯,要加注释!!
    之前有实现过用 Delphi 开发短信程序!!
      

  9.   

    同意以上说法,以前用DELPHI做过短信发送程序。
    是要有延时的,AT命令发送后会有返回值。
      

  10.   

    http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=140018
    看看这个吧,我也遇到了。
      

  11.   

    必须在收到返回之后再发才行,根据返回值判断是否可以发,一般如果返回ATOK即可发下面的包。
    还是好好看看短信模块的sdk吧,一般都提供测试程序或者demo的。