串口(spcomm)问题.高手的观注一下. ( 积分: 200 )

  • 主题发起人 主题发起人 shameboy
  • 开始时间 开始时间
S

shameboy

Unregistered / Unconfirmed
GUEST, unregistred user!
我用spcomm写了一个串口通讯系统.
当我设置ReadInterval=1时.在我的机子运行得很顺畅.但在别人的机子上却收不到任何数据.
当我设置ReadInterval=50,在我的机子运行有点问题(在调试模式下提示内存报错),不过还是能接收数据.运行久一点就会这样.而在别人机子上也是如此.
当我设置ReadInterval=100,在我机子上运行.马上提示内存报错.在别人机子上运行也是不行,一样报错.
可是也有别的系统,一样设置100却在我或别人的机子上运行得很好.为什么.我把代码贴出来.高手们请指教一下.
我发数据是这样:发C000000000000000,下位机则发连续10个类似"50123456789EF123"这样的数据包给我.我等到判断10个收完.才继续发C000000000000000.
这是我的接收数据过程=======================================================
procedure TServer_Form.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
rcv_s: string;
i: integer;
rbuf: array[0..7] of byte;
r_ms: p_ms_command;
begin
iBegin :=GetTickCount;
rcv_s := '';
fillchar(rbuf, 8, 0);
move(buffer^, rbuf, bufferlength);
if BufferLength <> 8 then
begin
Comm1.StopComm;
sleep(100);
Comm1.StartComm; //再次重发数据.
if not canwriteData then
SendMessage(Server_Form.Handle,WM_MYRESENDORWRITEDATAMS, 1,0);
end
else
begin
for i := 0 to 7 do
rcv_s := rcv_s + inttohex(rbuf, 2);

if ErrorRectData(rcv_s) then{手动,定时}
begin
if (not CanWriteData) then
SendMessage(Server_Form.Handle,WM_MYRESENDORWRITEDATAMS, 1,0);
end
else
begin
new(r_ms);
r_ms^.p1 := rcv_s;
if canwritedata then//读状态时
r_ms^.p2 :=1;
SendMessage(Server_Form.Handle, WM_MYCHECKRECEIVEDATAMS, Integer(r_ms), 0);
end;
end;
end;
 
Project Project1.exe raised exception class EAccessviolation with message 'Access violation at address 004042EC in module 'Project1.exe'. Read of address 22000248'.内存报错的提示
 
如果你想花最少的钱学习流行的计算机技术,本人低价提供
计算机专业高清晰 视 频 教 程,所有教程由业内名家讲解,物超所值,
所有光盘4元/张,特快专递全国三天内到货.
联系方式:手 机:1 3 5 76145612(手机联系佳) Q Q:108410943
E-mail:ncncldjjg@126.com
1、Oracle9iOCP(Oracle认证专家DBA)视频教程(23CD)
2、SQL语言、数据挖掘、SQLServer2000视频教程(6CD)
3、计算机网络原理视频教程(4CD)
4、计算机实用组网技术视频教程(3CD)
5、MCSE(微软认证系统工程师)认证视频教程(11CD)
6、windows2003即学即会视频教程(6CD)
7、J2EE Web程序开发定向班/Java就业班视频教程
(java基础jsp核心技术UML设计)(13CD)
8、J2EE基础高级案例分析视频教程(9CD)
9、马士兵J2SE入门与精通(含坦克大战、BBS实例)视频教程(6CD)
10、java语言深入详解视频教程(12CD)
11、java技术从入门到精通视频教程(21CD)
12、javascript全接触视频教程(13CD)
13、各类网站源程序(9CD)
14、unix原理视频教程(3CD)
15、Linux软件开发工程师(C语言)视频教程(4CD)
16、Linux配置、管理、优化实战工程师视频教程(8CD)
17、Linux内核编程视频教程(11CD)
18、C语言详解视频教程(2CD)
19、VC++6.0(MFC)开发技术术详解视频教程(6CD)
20、ASP.NET中文视频教程(3CD)
21、洪恩C#入门多媒体教程(1CD)
22、XML技术视频教程(2CD)
23、操作系统视频教程(3CD)
24、网络技术基础视频教程(2CD)
25、数据结构视频教程(5CD)
26、清华大学计算机专业多媒体教程(数据结构、汇编、编译原理等)(13CD)
27、大学数学[离散数学线性代数概率与数理统计微积分]视频教程(22CD)
28、LearnKey Asp.Net (老外用英语讲课)(13CD)
29、LearnKey Asp.Net Webservice(老外用英语讲课)(5CD)
30、AppDev Asp.Net2.0 UsingC# (老外用英语讲课)(1CD)
31、APPDev .Net Framework(老外用英语讲课)(2CD)
32、林清安pro/e2001(野火版)视频教程(18CD)
33、深圳大学3D设计视频教程(4CD)
34、3DMAX建模视频教程(老外用英语讲课)(6CD)
35、3DMAX纹理与贴图材质灯光视频教程(老外用英语讲课)(5CD)
36、3DMAX格式500个常用模型库(4CD)
37、lightscape基础入门视频教程(2CD)
38、聚光制造(lightscape3.2入门与精通视频教程)(4CD)
39、coreldraw12中文版入门与精通swf格式视频教程(2CD)
 
move(buffer^, rbuf, bufferlength);

这里BufferLength有可能大于8,缓冲区溢出,先判断长度,再访问数据
 
首先出错的原因很可能就是缓冲区溢出
var
rbuf: array[0..512] of byte;
另外move(buffer^,pchar(@rbuf)^,bufferlength)
 
可能就是接收的数据大于你的rbuf数组了
 
我用DELPHI做的一个程序,里面用到了MAPX控件用于地图显示的,但当我把程序复制到另一台机器进行测试的时候就报类似的错误,具体的提示我没记,大约就带'Project1.exe'. Read of address 22000248'这个字样的,因为测试机上没有注册MAPX,我安装了一下就好了,
你这里是不是也可能是这个问题啊?
 
同意楼上的,应该是缓冲区溢出,先判断一下bufferlength再接收,另,把rbuf设大一点.
 
OK.那我先试一下..谢谢各位了
 
GSM短信远程抄表系统管理端源代码(pc控制手机模块收发GSM短信)
http://www.pgz8.cn/Software/Catalog93/4151.html

串口操作等,都是自己写的代码.不用现成控件的.你可以下载来看看,还有实现了pc控制手机模块收发gsm短信,函数都是自己写的。线程方式操作,提高效率。

可能对你有帮助.

下面是他的说明:

系统说明:GSM短信远程抄表系统管理端(原理:pc控制手机模块收发GSM短信)
作者:Cooling
QQ: 21156410
Email: 21156410@qq.com
主页:http://www.pgz8.cn
可以任意传播,但请保留以上信息,有任何问题,欢迎交流。谢谢
这是一个商业软件的demo部分,收发短信的部分函数,全部是站长2002年写的,不用现成控件,线程操作.或许对短信系统开发有帮助.当时没有实现中文短信的收发,这个系统中也不需要.所以如果哪位朋友有兴趣,可以完善下,如果你写好了,也希望能给我发来一个哦.谢谢

用户名密码都是admin,在界面上右键操作.
 
后退
顶部