关于Delphi中MSComm控件的使用问题

qidaiyou7690 2018-02-05 10:22:37
关于MSComm控件,使用过的大神来解决一下问题
本人使用MSComm串口控件用来发送长度超过500字节的数组,但是这个控件貌似一次只能发送500个字节,剩下的字节都没有发送出去,不知道怎么回事,希望知道的大神帮忙回答一下,感激不尽
网上查资料MSComm1.OutBufferSize:=600;可以设置发送缓冲区大小,也这样设置了,还是没用
...全文
1590 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
qidaiyou7690 2018-02-28
  • 打赏
  • 举报
回复
我明白了,这个控件是可以发送超过500字节的数据的,按照11楼的那些设置就可以,是我在监控发送的时候监控的不对,只看到500字节的数据,实际上超过500字节的数据已经发送出去了,只是我看到的只有500字节,不是这个控件的问题,谢谢大家,此处结贴!
qidaiyou7690 2018-02-27
  • 打赏
  • 举报
回复
引用 15 楼 yqbaby 的回复:
你看了接收端的设置没?不要光看发送端,即使发送了再多字节的信息,你接收端只接500,多余的截断,那肯定是不行的.
接收端???我的发送只能发送500字节,跟接收有什么关系呢??接收端的字节数也设置大于500???
DelphixpeFan 2018-02-11
  • 打赏
  • 举报
回复
你看了接收端的设置没?不要光看发送端,即使发送了再多字节的信息,你接收端只接500,多余的截断,那肯定是不行的.
leeky 2018-02-09
  • 打赏
  • 举报
回复
熟练的话,换组件只是半小时一小时的事,比你纠结几天解决不了问题好。 不熟练,研究一下也不难,可以为你以后节省很多的开发与维护时间。
七羽Y 2018-02-09
  • 打赏
  • 举报
回复
我也试了一下,好像不行
qidaiyou7690 2018-02-09
  • 打赏
  • 举报
回复
引用 11 楼 yqbaby 的回复:
3:MSCOMM的设置: MSCOMM以设置成二进制方式 comm1.CommPort :=Form_Comsele.RadioGroup1.ItemIndex+1 ; ; comm1.DTREnable :=true; comm1.RTSEnable :=true; comm1.Settings :=Form_Comsele.RadioGroup3.Items.Strings[Form_Comsele.RadioGroup3.ItemIndex]+',N,8,1'; comm1.InBufferSize :=2048; comm1.OutBufferSize :=4096; comm1.InBufferCount :=0; //清除缓冲区 comm1.OutBufferCount :=0; //清除缓冲区 //comm1.SThreshold :=1; //发送缓冲区数据全部发送完时,触发 //comm1.InputLen :=1; //每次接受一个字符 comm1.InputLen :=0; //每次读空缓冲区 comm1.SThreshold :=0; //发送缓冲区数据全部发送完时,禁止触发 comm1.RThreshold :=1; //收到一个字符,触发一次 comm1.PortOpen:=true; comm1.Output:='ATQ0E0V1W0S0=1&C1&D2&K3'+chr(13)+chr(10); // 缓冲区貌似要设置成2的倍数?
上面的设置基本都有,另外,comm1.OutBufferSize :=600;这是我设置的,但是无论怎样设置,一次发送的都只有500字节,整500,不知道为什么,波特率也改过了,还是同样,一次发送只有500字节,不多不少
DelphixpeFan 2018-02-08
  • 打赏
  • 举报
回复
3:MSCOMM的设置: MSCOMM以设置成二进制方式 comm1.CommPort :=Form_Comsele.RadioGroup1.ItemIndex+1 ; ; comm1.DTREnable :=true; comm1.RTSEnable :=true; comm1.Settings :=Form_Comsele.RadioGroup3.Items.Strings[Form_Comsele.RadioGroup3.ItemIndex]+',N,8,1'; comm1.InBufferSize :=2048; comm1.OutBufferSize :=4096; comm1.InBufferCount :=0; //清除缓冲区 comm1.OutBufferCount :=0; //清除缓冲区 //comm1.SThreshold :=1; //发送缓冲区数据全部发送完时,触发 //comm1.InputLen :=1; //每次接受一个字符 comm1.InputLen :=0; //每次读空缓冲区 comm1.SThreshold :=0; //发送缓冲区数据全部发送完时,禁止触发 comm1.RThreshold :=1; //收到一个字符,触发一次 comm1.PortOpen:=true; comm1.Output:='ATQ0E0V1W0S0=1&C1&D2&K3'+chr(13)+chr(10); // 缓冲区貌似要设置成2的倍数?
七羽Y 2018-02-08
  • 打赏
  • 举报
回复
引用 5 楼 xxfly 的回复:
是不是与波特率的设置有关(MSComm.Settings)
试过了,不是波特率问题,9600和115200都一样
qidaiyou7690 2018-02-08
  • 打赏
  • 举报
回复
引用 6 楼 yqbaby 的回复:
[quote=引用 4 楼 leeky 的回复:] 再有,你的数组不能分成多组发么? 再,建议:对于较长的串口数据,接收端可能会发生多次事件,每次只是一部分,应做缓冲机制,把多次的数据组合在一起。
,分包的话,还要把分包信息加进去,接收端才能正确接收;现在的问题就是担心接收端是做死的硬件,不让更改,那就杯具了[/quote] 对,这也是个问题,不过我的这个项目暂且不存在这个问题,但不意味着以后不会出现啊,所以还是个纠结的问题
qidaiyou7690 2018-02-08
  • 打赏
  • 举报
回复
引用 4 楼 leeky 的回复:
再有,你的数组不能分成多组发么? 再,建议:对于较长的串口数据,接收端可能会发生多次事件,每次只是一部分,应做缓冲机制,把多次的数据组合在一起。
分成多组发送的话,每两组之间会有5毫秒的时间间隔,一包两包没事,发几百KB的字节就会多好几秒的时差,这还是一次的,几百次几千次的话时间越多就会浪费越多的财力,所以要尽量节省,能发一包的绝不发两包
qidaiyou7690 2018-02-08
  • 打赏
  • 举报
回复
引用 3 楼 leeky 的回复:
换组件吧,这组件我在十多年前用过,不好用。 可以换SPComm,或者CnPack中的Comm控件,强多了。
已经使用这个组件做了很多项目了,目前还不能修改,做完这个项目再换组件吧,没办法
DelphixpeFan 2018-02-07
  • 打赏
  • 举报
回复
引用 4 楼 leeky 的回复:
再有,你的数组不能分成多组发么? 再,建议:对于较长的串口数据,接收端可能会发生多次事件,每次只是一部分,应做缓冲机制,把多次的数据组合在一起。
,分包的话,还要把分包信息加进去,接收端才能正确接收;现在的问题就是担心接收端是做死的硬件,不让更改,那就杯具了
xxfly 2018-02-07
  • 打赏
  • 举报
回复
是不是与波特率的设置有关(MSComm.Settings)
leeky 2018-02-06
  • 打赏
  • 举报
回复
再有,你的数组不能分成多组发么? 再,建议:对于较长的串口数据,接收端可能会发生多次事件,每次只是一部分,应做缓冲机制,把多次的数据组合在一起。
leeky 2018-02-06
  • 打赏
  • 举报
回复
换组件吧,这组件我在十多年前用过,不好用。 可以换SPComm,或者CnPack中的Comm控件,强多了。
qidaiyou7690 2018-02-05
  • 打赏
  • 举报
回复
没有人顶一下吗

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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