***********串口通讯问题***************

时间:2021-03-11 17:58:10
我在做串口通讯的一个小程序,用的是SPCOM控件。
发现一个小麻烦,随机生成的模拟数据当其中的某一位是字符“0”即ASCII值48时,在发送时用一个也是用SPCOM控件做的测试程序查看接收到的数据,发现此位丢失(但是在调试器中发现此位正确)。
问题的关键是:这种现象导致了接收程序只能接收数据而不能发送数据了。
不知道是不是SPCOM控件需要设置哪些属性?
请各位大哥指教,十分感谢!

19 个解决方案

#1


1 "但是在调试器中发现此位正确"  这句话啥意思?
2 "这种现象导致了接收程序只能接收数据而不能发送数据了" 
  你所指的现象是: 当发送串中含有"0"时,接收端则会丢弃该字符. 如"abc0dfa", 接方时为:"abcdfa". 你上面的话何意?
3 另外直接用"超级终端"测试如何?

#2


freelybird(阿愚) :
1、比如,测试程序发数据:$BB,$01,$30,$02,$11,$13,$CC
   其中$30即十进制48即ASCII字符“0”,我的程序在调试器中发现$30被接收到
2、当你发了一串数据其中包括$30的话,导致测试程序只能接收数据而不能发送数据,除非你关闭串口从新打开。

继续研究中。。。

谢谢关注!

#3


我这里什么数据都能收、发啊,奇怪!?

#4


你把发送和接收的代码贴上来看看
奇怪?!

#5


1 "比如,测试程序发数据:$BB,$01,$30,$02,$11,$13,$CC
   其中$30即十进制48即ASCII字符“0”,我的程序在调试器中发现$30被接收到"

这说明你已经正确收到并读取数据. 我想是否由于你对接收后的数据处理不正确所导致 字符"0"丢失. 建议仔细查查.

2 电话线是一种不可靠的物理链路. 所有由此所导致的数据丢失或出错概率是比较大的. 因此你所定义的数据帧格式应该能够提供校验. 并且你的通信程序也应该提供重传续传功能.
  至于字符"0"是否能导致调制解调器不正常. 建议用"超级终端"测试. 此外, 建议你的modem的速率配制低一些,如8000band.

3 留下你的mail, 我这有一串口封装类. 发给你参考一下.

#6


我现在在自己的机器上做测试的,是把COM1和COM2对接来做测试的,误码应该很少,而且发生误码的话我都有协议检查和错误处理的。

v_lucky@163.com

谢谢

#7


up

#8


I already sent email to you. check your in-box.

#9


Thank you !

#10


请各位继续关注!

问题还没有解决啊!

#11


你不多留点信息,很难帮

#12


不会出现这种情况的。
我以前用过这个组件,很好用到,有源码,不过我自己修改了一下。

如下试试:
var TempStr: String;
begin
  TempStr :=  #$BB#$01#$30#$02#$11#$13#$CC;
  if FComm.Handle <> 0 then
    FComm.WriteCommData(PChar(TempStr),Length(TempStr));
end;

#13


www.torry.net 上有N多的控件,还有原码可以参考,基本可以拿到任何版本的delphi/bcb 用,何必用什么 spcomm?

#14


设置 replacedchar=#0

#15


我试试

#16


TO : lsys() 

果然与  replacedchar 属性设置有关,问题解决,谢谢!

#17


up

#18


果然是replacedchar属性的设置问题

搞定,谢谢!

#19


谁能将spcomm控件的属性详细解释一下,比如replacedchar就不知道是什么?

#1


1 "但是在调试器中发现此位正确"  这句话啥意思?
2 "这种现象导致了接收程序只能接收数据而不能发送数据了" 
  你所指的现象是: 当发送串中含有"0"时,接收端则会丢弃该字符. 如"abc0dfa", 接方时为:"abcdfa". 你上面的话何意?
3 另外直接用"超级终端"测试如何?

#2


freelybird(阿愚) :
1、比如,测试程序发数据:$BB,$01,$30,$02,$11,$13,$CC
   其中$30即十进制48即ASCII字符“0”,我的程序在调试器中发现$30被接收到
2、当你发了一串数据其中包括$30的话,导致测试程序只能接收数据而不能发送数据,除非你关闭串口从新打开。

继续研究中。。。

谢谢关注!

#3


我这里什么数据都能收、发啊,奇怪!?

#4


你把发送和接收的代码贴上来看看
奇怪?!

#5


1 "比如,测试程序发数据:$BB,$01,$30,$02,$11,$13,$CC
   其中$30即十进制48即ASCII字符“0”,我的程序在调试器中发现$30被接收到"

这说明你已经正确收到并读取数据. 我想是否由于你对接收后的数据处理不正确所导致 字符"0"丢失. 建议仔细查查.

2 电话线是一种不可靠的物理链路. 所有由此所导致的数据丢失或出错概率是比较大的. 因此你所定义的数据帧格式应该能够提供校验. 并且你的通信程序也应该提供重传续传功能.
  至于字符"0"是否能导致调制解调器不正常. 建议用"超级终端"测试. 此外, 建议你的modem的速率配制低一些,如8000band.

3 留下你的mail, 我这有一串口封装类. 发给你参考一下.

#6


我现在在自己的机器上做测试的,是把COM1和COM2对接来做测试的,误码应该很少,而且发生误码的话我都有协议检查和错误处理的。

v_lucky@163.com

谢谢

#7


up

#8


I already sent email to you. check your in-box.

#9


Thank you !

#10


请各位继续关注!

问题还没有解决啊!

#11


你不多留点信息,很难帮

#12


不会出现这种情况的。
我以前用过这个组件,很好用到,有源码,不过我自己修改了一下。

如下试试:
var TempStr: String;
begin
  TempStr :=  #$BB#$01#$30#$02#$11#$13#$CC;
  if FComm.Handle <> 0 then
    FComm.WriteCommData(PChar(TempStr),Length(TempStr));
end;

#13


www.torry.net 上有N多的控件,还有原码可以参考,基本可以拿到任何版本的delphi/bcb 用,何必用什么 spcomm?

#14


设置 replacedchar=#0

#15


我试试

#16


TO : lsys() 

果然与  replacedchar 属性设置有关,问题解决,谢谢!

#17


up

#18


果然是replacedchar属性的设置问题

搞定,谢谢!

#19


谁能将spcomm控件的属性详细解释一下,比如replacedchar就不知道是什么?

#20