用spcomm在串口通信中奇怪的问题(凡是做过串口通信的人请进) ( 积分: 150 )

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

ShanNi

Unregistered / Unconfirmed
GUEST, unregistred user!
卡机采用UART通讯方式,RS-232标准传输接口,传输速率为9600.N.8.1
卡片为多页类型

我采用的是SPCOMM控件,
问题:从串口读数据可以读出(数据量在卡片支持的范围内),但是写的时候如果连续发多条写命令
就出现执行几条命令后就没有反应了(不触发spcomm的OnReceiveData事件了)
spcomm设置如下:
FSpcomm.CommName := 'Com4';
FSpcomm.BaudRate := 9600;
FSpcomm.ByteSize := _8;
FSpcomm.StopBits := _1;
FSpcomm.ReadIntervalTimeout := 300;
FSpcomm.OnReceiveData := CommandCallBack;
FSpcomm.RtsControl := RtsDisable;
FSpcomm.outx_xonxoffflow := false;
FSpcomm.inx_xonxoffflow := false;
FSpcomm.TxContinueOnXoff := false;
FSpcomm.DtrControl := DtrDisable;

在读或写的过程时,外部启动读写第一页命令,在spcomm的回调函数中判断如果写成功就发下一页
的读或者写命令,如此循环直到写完数据为止。


知道这是怎么回事的吗?是不是有那些属性没有设置正确?急呀!我是新手,请大家详细指教,
先谢过了!
 
怎么没人来啊,帮帮我啦
 
>从串口读数据可以读出(数据量在卡片支持的范围内),但是写的时候如果连续发
>多条写命令就出现执行几条命令后就没有反应了

你可以这样试,用一个串口调试器发命令,发送得快一点,如果现象是一样的,就
说明你的那个卡机有问题,类似的我碰见过,后来我分析了一下卡机片子里的代码,
是单片机程序定义的通信的缓冲区太小了,而且算法有问题,造成了缓冲区溢出
 
我也遇到过,频繁的发送,当收到有问题的数据时,接收就不起作用了,清除发送和接收缓冲区也不起作用,最后stopcom 和startcom,重启后又正常了.有哪位高手清楚是怎么回事?
 
to tseug:感谢你的回复!我按照你说的方法试了一下,用串口调试器发命令,发得很快时,卡机返回的信息大都不成功,这是不是卡机有问题呀
另外,卡机后面就是USB插头哪个地方有1,2,3,4个滑块,上面写有ON,DIP,现在只有4滑块在最上端,不知道会不会跟这个有关系呀,
 
这个要看他的说明书。另外,仔细看一下他的通信协议,看看里面对于指令的响应
时间是否说明。
 
数据的通讯格式为:
┏━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━┓
┃ HEADE ┃ DATA ┃CHECK ┃
┣━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━┨
SOH PT ID1 ID2 FC1 FC2 STX DATA ETX BCC
┗────┷────┷──────────┷──────┷───┷─────┷──────┷──────┛
01 识别 卡片阅读机ID 功能码 02 资料 03 检查码
┗────┷────┷──────────┷──────┷───┷─────┷──────┷──────┛
1。SOH、STX、ETX都是一个byte的控制字符,其定义为:
SOH=01H,STX = 02H,ETX=03H.
2.PT(Packet Type)用来识别讯息来源。若是控制主机传出的讯息则使用大写
"S",若为卡片阅读机传回的讯息使用小写"s".
3.ID1和ID2两个byte是卡片阅读机的ID指示码,固定为"01".
4.FC1和FC2是功能码(function code)和data有相关性,这些相关性数据请
参考下一页说明;
5。BCC乃为检查码,是从SOH到ETX每一个byte作xor(互斥)后,再or20H
例如:送出如下指令:
SOH "S" "01" "A1" STX "010" ETX BCC
BCC = 01H XOR 53H XOR 30H XOR 31H XOR 41H XOR 31H XOR 02H XOR 30H
XOR 31H XOR 30H XOR 03H OR 20H = 33H

××××××××××××××××××××××××××××××××××××××××读数据:


主机发送:
SOH "S" ID1 ID2 "K" "0" STX DATA ETX BCC
卡片机回应:
SOH "s" ID1 ID2 "K" "0" STX DATA ETX BCC
说明:
1。data为欲读取卡片型态(1bytes)+【页次(2bytes)】
2。卡片型态为:"M": Multi-page Type
3.卡片页次固定2Bytes,范围"00"~"3F"(HEX),共64页。
4。未读到卡片时,则传回的数据种data即为"N", STX + "N"(DATA) + ETX
5.读到的卡片不论是否为欲读取卡片型态或页次,皆回传读到的数据
6。读到Multi-page卡片data将传回卡片型态,状态(注二)、页次及数据。
注二:Multi-page状态为以下两项
"0":表示读取数据
"1":表示资料被锁住
××××××××××××××××××××××××××××××××××××××××
××××××××××××××××××××××××××××××××××××××××写数据:

主机发送:
SOH "S" ID1 ID2 "K" "1" STX DATA ETX BCC
卡片机回应:
SOH "s" ID1 ID2 "K" "1" STX data ETX BCC
说明:
1。DATA为欲写入卡片型态、页次及数据,
即卡片型态(1bytes)+页次(2bytes)+数据(16bytes)
2。卡片型态为:"M": Multi-page Type
3.卡片页次范围"00"~"3F"(HEX)。
4。data回传值为:
"Y": 表示写入成功。
"N":表示写入失败,没有读到卡片数据。
"卡片状态数据":表示写入失败,写入资料经比对后不符合。(注四)
5.读到的卡片不论是否为欲读取卡片型态或页次,皆回传读到的数据
"1":表示有读取,有写入
"2":表示数据被锁住,有读取,无写入
功能说明:
1。利用此功能可将数据写入Multi-page卡片的某页种
2。每次卡片阅读机传回data后,立即清楚data,并关闭读取功能
××××××××××××××××××××××××××××××××××××××××
 
to tseug:帮我再看一下,
他提供的文档里面并没有说指令响应时间
 
你可以直接用两个串口调试,其中1个模拟卡机。或直接用串口调试测试卡机的报文收发,当一切ok再用你的程序测试,这可避免由于你的程序发送错误的报文导致卡机不响应
 
建议在发送一条指令后,延时100~500ms,具体看处理情况
 
问题已解决!
 
后退
顶部