求救:PC串口连手机模块发送短信(用MSComm控件),消息总被截断!
我用PC串口COM1连接手机模块(BenQ M22),通过MSComm控件进行串口操作发AT命令来发送短信,发送的消息前面部分总被截断,百思不得其解,请各位大侠帮忙看看,下面是AT命令和程序代码:
文本模式的AT命令:
<-----------------------------
AT
AT+CSCA="+8613800280500" //设置短信中心号,成都
AT+CMGF=1
AT+CMGS="要发送的手机号" //双引号部分用真实手机号代替
>How are you
----------------------------->
手机上得到的结果:e you
PDU模式下的AT命令:
<-----------------------------
AT
AT+CSCA="+8613800280500" //设置短信中心号,成都
AT+CMGF=0
AT+CMGS=65
>0891683108200805F011000D91683106089259F7000800324F7F752800540065007800746A215F0F6536
53D177ED4FE14EE378017B805355FF0C5B9E73B08D776765534152065BB96613
----------------------------->
上面的代码放到超级终端执行则发送正确,在程序中运行完后,打开超级终端,看到如下结果:
<--------------------------------
AT+CMGS=65
>1000D91683106089259F7000800324F7F752800540065007800746A215F0F653653D177ED4FE14EE378
017B805355FF0C5B9E73B08D776765534152065BB96613
ERROR
-------------------------------->
显然数据头部的“0891683108200805F01”被截断了。奇怪的是下面附的程序代码如果在设置断
点调的状态则可以发送竟然成功,直接运行则被截断。是不是Delphi中变量运用的问题呀?我用的是Delphi7.
附:以下是PDU模式下的Delphi程序代码(文本模式仅是AT命令不同),麻烦那位高手帮忙指正一下,
在下先谢过:
<==============================================================>
procedure TManuGetInfoForm.btnSendClick(Sender: TObject);
var
sMsg: String;
begin
//-----------配置组件----------------------
MSComm1.CommPort := 1; //使用COM1
MSComm1.Settings := '115200,N,8,1'; //设置波特率
MSComm1.InputLen := 0; //设置该属性为0表示Input读取整个缓冲区的内容。
MSComm1.InBufferCount := 0; //清空接收缓冲区
MSComm1.OutBufferCount := 0; //清空发送缓冲区
try
MSComm1.PortOpen := true; //打开端口
except
MessageDlg('打开端口时发生错误,请确认端口是否被其它程序占用',mtError,[mbOk],0);
exit;
end;
//-----------发送 AT命令----------------------
MSComm1.Output := 'AT'+char(13); //发送 AT
sleep(100); //延时0.1秒
MSComm1.Output := 'AT+CSCA="+8613800280500"'+CHAR(13);//成都移动短信中心号:+8613800280500
sleep(100); //延时0.1秒
MSComm1.Output := 'AT+CMGF=0'+char(13); //发送'AT+CMGF=0'设置为PDU方式
sleep(500); //延时0.5秒
sMsg := '0891683108200805F011000D91683106089259F7000800324F7F752800540065007800746A215F0F
653653D177ED4FE14EE378017B805355FF0C5B9E73B08D776765534152065BB96613';
MSComm1.Output := 'AT+CMGS=65'+ char(13);//发送 AT+CMGS=消息长度
MSComm1.Output := sMsg+chr(26); //这里是发送的消息,char(26是Ctrl+Z)
sleep(1000); //延时1秒
//---------------------------------------
MSComm1.PortOpen := false; //关闭端口
end;
文本模式的AT命令:
<-----------------------------
AT
AT+CSCA="+8613800280500" //设置短信中心号,成都
AT+CMGF=1
AT+CMGS="要发送的手机号" //双引号部分用真实手机号代替
>How are you
----------------------------->
手机上得到的结果:e you
PDU模式下的AT命令:
<-----------------------------
AT
AT+CSCA="+8613800280500" //设置短信中心号,成都
AT+CMGF=0
AT+CMGS=65
>0891683108200805F011000D91683106089259F7000800324F7F752800540065007800746A215F0F6536
53D177ED4FE14EE378017B805355FF0C5B9E73B08D776765534152065BB96613
----------------------------->
上面的代码放到超级终端执行则发送正确,在程序中运行完后,打开超级终端,看到如下结果:
<--------------------------------
AT+CMGS=65
>1000D91683106089259F7000800324F7F752800540065007800746A215F0F653653D177ED4FE14EE378
017B805355FF0C5B9E73B08D776765534152065BB96613
ERROR
-------------------------------->
显然数据头部的“0891683108200805F01”被截断了。奇怪的是下面附的程序代码如果在设置断
点调的状态则可以发送竟然成功,直接运行则被截断。是不是Delphi中变量运用的问题呀?我用的是Delphi7.
附:以下是PDU模式下的Delphi程序代码(文本模式仅是AT命令不同),麻烦那位高手帮忙指正一下,
在下先谢过:
<==============================================================>
procedure TManuGetInfoForm.btnSendClick(Sender: TObject);
var
sMsg: String;
begin
//-----------配置组件----------------------
MSComm1.CommPort := 1; //使用COM1
MSComm1.Settings := '115200,N,8,1'; //设置波特率
MSComm1.InputLen := 0; //设置该属性为0表示Input读取整个缓冲区的内容。
MSComm1.InBufferCount := 0; //清空接收缓冲区
MSComm1.OutBufferCount := 0; //清空发送缓冲区
try
MSComm1.PortOpen := true; //打开端口
except
MessageDlg('打开端口时发生错误,请确认端口是否被其它程序占用',mtError,[mbOk],0);
exit;
end;
//-----------发送 AT命令----------------------
MSComm1.Output := 'AT'+char(13); //发送 AT
sleep(100); //延时0.1秒
MSComm1.Output := 'AT+CSCA="+8613800280500"'+CHAR(13);//成都移动短信中心号:+8613800280500
sleep(100); //延时0.1秒
MSComm1.Output := 'AT+CMGF=0'+char(13); //发送'AT+CMGF=0'设置为PDU方式
sleep(500); //延时0.5秒
sMsg := '0891683108200805F011000D91683106089259F7000800324F7F752800540065007800746A215F0F
653653D177ED4FE14EE378017B805355FF0C5B9E73B08D776765534152065BB96613';
MSComm1.Output := 'AT+CMGS=65'+ char(13);//发送 AT+CMGS=消息长度
MSComm1.Output := sMsg+chr(26); //这里是发送的消息,char(26是Ctrl+Z)
sleep(1000); //延时1秒
//---------------------------------------
MSComm1.PortOpen := false; //关闭端口
end;
...全文
相关推荐
利用C#.NET实现PC机与研华ADAM-4050模块数字量输入实例(MSComm控件)
总的来说,利用C#.NET实现PC机与研华ADAM-4050模块的数字量输入,主要涉及串口通信、MSComm控件的使用、数据的读取与解析以及异常处理等关键技术。
vb做的PC机与GSM短信模块串口通信源码
在VB中,我们可以使用MSComm控件或直接操作串口来实现串口通信。MSComm控件提供了一套简单的API,方便开发者处理串口的打开、关闭、设置波特率、数据位、校验位等操作。
visual c++上位机MSCOMM与GSM短信模块串口通信程序实例
通过学习这个实例,你可以掌握如何利用MSCOMM控件进行串口通信,为自己的项目开发提供基础。总之,Visual C++配合MSCOMM控件是实现GSM短信模块串口通信的有效途径。
利用C++ Builder MSComm控件实现PC机双串口互通信
综上所述,实现PC机双串口互通信的关键在于正确配置MSComm控件,管理串口状态,以及有效地处理数据的发送和接收。通过熟练掌握这些知识点,你可以构建稳定可靠的串行通信系统。
使用VB的MSCOMM控件
- **应用场景**:除了常见的PC与PC之间的串口通信外,还可以用于PC与单片机、PC与智能仪表、PC与PLC、PC与GSM短信模块等场景。#### 3.


网络通信/分布式开发
