串口通信问题,送100分 ( 积分: 100 )

  • 主题发起人 主题发起人 lhmpya
  • 开始时间 开始时间
L

lhmpya

Unregistered / Unconfirmed
GUEST, unregistred user!
我用的是上海耀华xk3190-A1+称重显示器,所有数据都以ASCII码,每组数据有10位组成,第1位为起始位,第10位为停止位,中间8位为数据位。
我采用连续方式通信:每帧数据由12组数据组成。格式如下:
第X字节 内容及注解
1 02(XON) 开始
2 +或- 符号位
3 称量数据 高位
。 称量数据
。 称量数据
8 称量数据 低位
9 小数位数 从右到左(0--4)
10 异或校验 高四位
11 异或校验 低四位
12 03(X OFF) 结束

我第一次写串口通信程序,想知道帧是什么,组是什么。明明说每组数据由10组成,为什么还说每帧由12组数据组成。哪位老师帮我解释?还有为什么我接不到02(XON)和03(OFF)?怎么写程序,哪位有源代码帮帮我
我用的是spcomm控件
 
我用的是上海耀华xk3190-A1+称重显示器,所有数据都以ASCII码,每组数据有10位组成,第1位为起始位,第10位为停止位,中间8位为数据位。
我采用连续方式通信:每帧数据由12组数据组成。格式如下:
第X字节 内容及注解
1 02(XON) 开始
2 +或- 符号位
3 称量数据 高位
。 称量数据
。 称量数据
8 称量数据 低位
9 小数位数 从右到左(0--4)
10 异或校验 高四位
11 异或校验 低四位
12 03(X OFF) 结束

我第一次写串口通信程序,想知道帧是什么,组是什么。明明说每组数据由10组成,为什么还说每帧由12组数据组成。哪位老师帮我解释?还有为什么我接不到02(XON)和03(OFF)?怎么写程序,哪位有源代码帮帮我
我用的是spcomm控件
 
帧和组都是数据传输过程中的单位,只是所处的通讯层不同。帧是工作在数据链路层的数据传输单位,组是工作在网络层的,它是在数量链路层之上的使用数据链路层服务的,其正确叫法应当为“报文分组”。
 
晕死,你都放了多少分了,晚上帮你看
 
简单地说帧就是一组报文信息
 
你放一组原始报文上来看看,帧和网络传输哪个一样理解就可以了,串口是一帧一帧发的,

最近经典的例子就是在界面上放一个SPCOMM控件,然后方一个Memo1控件,设置好各个属性,然后在Spcomm的OnReceiveData里面写东西
procedure TSPCOMM1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word);
var
s: string;
begin
SetLength(S, BufferLength); //接收RS232的数据并显示Memo1上。
Move(Buffer^, PChar(S)^, BufferLength);
Memo1.Lines.Add(S);
Memo1.Invalidate;
end;

这个过程是接收输入,其实你要的还有解析数据,所以你要把Memo1里面的数据也放上来
 
上面的我也知道。在procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word); BufferLength应该是表示数据包长度的,也就是收了多少个word的数据。按我这个协议应该是12个BYTE,也就是6个WORD,可我这为什么每次都要收到2048个WORD的数据呢,我不明白
 
我还是觉得的ComPort这个组件比较好用
这里的组应当是规定通信格式的,如“4800,8,1”,起始位和停止位是最底层的位,平常说传一个字节8位,实际硬件上传输的至少10位。
02和03是数据,不是ASCII码,用字符肯定显示不了了。
没用过spcomm,那个bufferlength应当是缓冲区长度,不是接收数据的长度
 
spcomm是以帧间隔时间确定一帧数据的接收完成,如果你的数据帧间隔很短,SPCOMM就无法区分一帧数据,结果就是一直接收直到接收缓冲区满,所以你收到2048个字节。
SPCOMM的ReadIntervalTime属性是设定帧间隔时间的,缺省是100毫秒,你可以改为10或1试试
 
应该注意采集称重显示器的频率,正常的情况下,你发送一次命令后,要等待他的回应(或超时控制),然后才能发送下一次命令。要是已经按照这些规则收集数据了,那么,应该是串口线路有干扰信号,应该首先解决干扰问题。
 
至于02、03这两个包头、包尾,它采用的是16进制数据,而不是ASCII码,你是无法看到的,不过,你在跟踪的状态下,是可以看到这两个值,或者你可以使用函数转换成ASCII码显示。
 
jamcky你说的很有道理,可我改了ReadIntervalTime属性设置后每次还是接2048个字节,不知怎么回事
 
如果你确认ReadIntervalTime=1后还是无法按帧接收,那就有可能发送方的数据是持续发送的,要么换MSCOMM,要么收齐2048字节再处理。
或者把你的接收代码贴上来看看。
 
哦,那发送方可能是持续发送的。可那为什么协议中还定义每帧数据由12组数据组成?这不说明它是一帧一帧的发的吗
 
说一帧数据只代表这些数据之间有关联性,并不一定要保证有合适的发送间隔。
当然大多数设备的发送是有间隔的,你可以给厂家打电话问一下。
另外一个可能是你的程序在其它地方延迟太多时间,导致接收事件不能正常触发。
 
谢谢大家,取分来!
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
835
SUNSTONE的Delphi笔记
S
S
回复
0
查看
765
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部