c#写的通过串口写AT指令发短信的程序,大家帮忙看看!

peichao168 2007-11-01 03:30:58
该程序发短信不是很稳定,有时发短信正确,有时又没反应,有时把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 "mark":
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();
}

}
}
...全文
2279 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
记录美好生活 2012-09-19
  • 打赏
  • 举报
回复
正在看这方面的东西,不知从哪下手
jackchang234987 2012-06-04
  • 打赏
  • 举报
回复
请问楼主找到解决问题的方法没有?加我QQ:729292171,可以交流一下。
angelsxw 2011-01-03
  • 打赏
  • 举报
回复
学习中。。。帮顶
jackeyabc 2010-12-03
  • 打赏
  • 举报
回复
TEASTASDFASD
mohugomohu 2010-11-01
  • 打赏
  • 举报
回复
你们说了那么多返回值,那究竟怎样才能获得返回值啊
slimfeng 2008-12-17
  • 打赏
  • 举报
回复
必须在收到返回之后再发才行,根据返回值判断是否可以发,一般如果返回ATOK即可发下面的包。
还是好好看看短信模块的sdk吧,一般都提供测试程序或者demo的。
hylovett 2008-12-17
  • 打赏
  • 举报
回复
顶一下
xiexuetao 2008-12-17
  • 打赏
  • 举报
回复
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=140018
看看这个吧,我也遇到了。
Sant11 2008-09-28
  • 打赏
  • 举报
回复
同意以上说法,以前用DELPHI做过短信发送程序。
是要有延时的,AT命令发送后会有返回值。
zhirom 2008-09-28
  • 打赏
  • 举报
回复
学习中。。。帮顶
lw7963842 2008-09-28
  • 打赏
  • 举报
回复
编程要有好习惯,要加注释!!
之前有实现过用 Delphi 开发短信程序!!
loading1024 2007-11-09
  • 打赏
  • 举报
回复
这个应该看你串口通讯用的是什么协议,比如modbus协议她就需要接受返回值。
我觉得造成有时好用又是不好用的主要原因应该是指令发送间隔不够。把时间调长一点试一试
  • 打赏
  • 举报
回复
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 );
}
}

找了个例子,看看哦
tongling15 2007-11-09
  • 打赏
  • 举报
回复
顶一下,正研究怎么发呢
danis 2007-11-09
  • 打赏
  • 举报
回复
顶,有人能解决吗?
toaboy 2007-11-08
  • 打赏
  • 举报
回复
支持下 正研究PPC呢
soaringbird 2007-11-08
  • 打赏
  • 举报
回复
不是Write的,而是AT指令的返回值,比如AT+CMGF=1要返回一个OK,你得处理这个OK之后才去做别的
peichao168 2007-11-08
  • 打赏
  • 举报
回复
你们这里说的返回值是 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结束


}
chinajuanbob 2007-11-05
  • 打赏
  • 举报
回复
soaringbird说的对
一定要判断返回值,貌似有些指令是等返回值读取以后才继续执行的
而且实际使用的时候,由于网络问题,指令执行情况也千奇百怪的
很久没弄了,之前也没彻底弄明白过,仅供参考~
soaringbird 2007-11-01
  • 打赏
  • 举报
回复
手头没有源码,只能给你说说思路。
你收发短信你得处理设备的一系列状态,根据不同的状态执行不同的操作,发送不同的AT命令,
再根据命令的返回设置下一个状态,这样你的程序就能转起来了
加载更多回复(8)

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧