mscomm怎样能接收到完整的数据

franny4611 2006-07-26 05:55:46
这几天一直被这个问题困扰着
我设置mscomm.RThreshold为16,即缓冲区达到16个字节的时候触发oncomm事件进行接收数据。
但是如果字长不是16的整数倍,如果发送66个字节,那么最后两个字节将收不到,我试了一下,在清空显示的时候将mscomm.inbuffercount显示在memo中,显示的数值正好是没有接收到的字节数,多次试验都是这样的。
有什么办法能够接收到全部的数据呢?望高手指点!
另外我试着将mscomm.RThreshold设为1,但是这样的话当数据多的时候速度会很慢,而且试验的结果是每8个字节只能收到一个,不知何故。
可能我说的比较罗嗦,但是为了把问题说清楚,只能这样了,真的希望能得到大家的指点!
...全文
383 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
franny4611 2006-08-25
  • 打赏
  • 举报
回复
上面的,你是不是没接硬件啊
youmenking 2006-08-19
  • 打赏
  • 举报
回复
怎么我把你上面的代码全拷到我机子上,怎么memo1的文本没有显示呀,怎么回事呀,
franny4611 2006-08-01
  • 打赏
  • 举报
回复
算了,没人给出好办法,只能在最后加几个无用的字符了.
谢谢各位的帮助!结帖了.
franny4611 2006-07-29
  • 打赏
  • 举报
回复
继续等高人!
franny4611 2006-07-28
  • 打赏
  • 举报
回复
66只是我举例子,实际肯定不只这么多数据.
改成text不行的
gyf 2006-07-28
  • 打赏
  • 举报
回复
建议你把comInputModeBinary改成InputModeText类型的再显示到Memo中试试
gyf 2006-07-28
  • 打赏
  • 举报
回复
把RThreshold设置比66大试试
franny4611 2006-07-28
  • 打赏
  • 举报
回复
是的,我知道这是正常的,就是不知道有什么办法能够解决?
还有就是设置RThreshold为1为什么会出现每8个字节只能收到一个呢?
gyf 2006-07-28
  • 打赏
  • 举报
回复
mscomm.inbuffercount显示在memo中,显示的数值正好是没有接收到的字节数: 这个时正常的
将mscomm.RThreshold设为1,但是这样的话当数据多的时候速度会很慢,而且试验的结果是每8个字节只能收到一个,不知何故。:RThreshold:=1是说收到一个字节就发送
还有我算了一下66个字节是16*4+2,你的RThreshold值为16最后两个肯定接受不到
franny4611 2006-07-28
  • 打赏
  • 举报
回复
procedure TForm1.FormCreate(Sender: TObject);
begin
if MSComm1.PortOpen then
mscomm1.PortOpen:=false;

MSComm1.CommPort := 1;
MSComm1.Settings := '9600,n,8,1';
mscomm1.InBufferSize:=1024;
MSComm1.InputLen := 0;
MSComm1.InBufferCount := 0;
MSComm1.RThreshold :=32;
MSComm1.InputMode := comInputModeBinary;

mscomm1.PortOpen:=true;
mscomm1.DTREnable:=true;
mscomm1.RTSEnable:=true;
memo1.Clear;
end;


procedure TForm1.MSComm1Comm(Sender: TObject);
var
recstr:Olevariant;
str:string;
i:integer;
begin
str:='';
if mscomm1.CommEvent=ComEvReceive then
recstr:=mscomm1.Input;
for i:=0 to mscomm1.RThreshold-1 do
str:=str+inttohex(recstr[i],2)+' ';
memo1.Text:=memo1.Text+str;
end;
主要就是这样的,请指点
在线等
gyf 2006-07-28
  • 打赏
  • 举报
回复
把你初始化Com口的代码和MSComm时间的处理代码贴出来
franny4611 2006-07-28
  • 打赏
  • 举报
回复
谢谢啦,呵呵
郁闷几天了
rock8283 2006-07-28
  • 打赏
  • 举报
回复
帮顶
franny4611 2006-07-28
  • 打赏
  • 举报
回复

没人碰到过类似的情况吗?
高手现身吧!!
franny4611 2006-07-28
  • 打赏
  • 举报
回复
我设置RThreshold:=1的时候,显示的结果并不完全,每8个字节才显示一个,这又是为什么呢?
由于最后用的时候数据长度不是固定的,所以不好检查数据长度
iasp 2006-07-28
  • 打赏
  • 举报
回复
发送是检查数据长度 不是16的整数倍用字符填充
SmallMaker 2006-07-28
  • 打赏
  • 举报
回复
最好是设置成RThreshold:=1,没有你想象的那么慢
franny4611 2006-07-27
  • 打赏
  • 举报
回复

怎么没人愿意帮忙吗?

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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