一个串口通讯的问题,求高手帮忙解决(300分)

  • 主题发起人 主题发起人 whory
  • 开始时间 开始时间
W

whory

Unregistered / Unconfirmed
GUEST, unregistred user!
最近在弄一个考勤设备的串口通讯,需要用MSCOM写程序发送命令包到设备,但我怎么也不成功,命令包的信息格式如下:
序号 1 2 3 4 5 6 7
字节数 1 1 1 3 1 LENID 1
格式 SOI COMMAND ADDR PSW LEN COMD DATA CHK
起始码: SOI=7EH
COMMAND:命令码(就04H吧) ADDR:返回码(01H)
PSW:系统密码(123456) LEN:数据长度(COMD DATA的数据长度)
COMD DATA:命令数据(就用00CFBA80吧)
CHK数据格式:除SOI和CHKSUM外,其他数据的“异或”值
除了SOI是16进制外其他数据都是BCD码

请问各位高手我该怎么用MSCOM写命令包发送到设备去?
 
为什么一定要用MSCOM呢?用API函数CreateFile或者用DELPHI嵌入汇编直接写口也可以,
我只在VB中用过MSCOM,好像要用一个Variant类型的变量作为参数传递,在DELPHI中我没
有用过,而且我觉得用ACTIVEX控件不是很好,DELPHI对其支持也不是很好。
对于你说的BCD码,我想不用我说你也查得到吧!:)
 
因为我对API一点都不熟啊............
 
就是把你的数据组和好,然后以二进制格式发送
input()方法
output()方法
 
可以用TCOMPORT控件,比较好用
ComPort1.WriteStr(s:string)
 
用别的组件吧,别的比较好用
 
定义字节数组变量将数据按格式放进去,设定mscomm属性。如:BYTE:array of byte;
setlength(BYTE,x);
byte[0]:=$01H;
……
设定MSCOMM你总会把。
我才做过串口,需要给我email.
 
去这里http://www.ararat.cz/synapse/
下载这个http://www.ararat.cz/synapse/files/synaser.zip
有帮助
 
我现在用API做了,但是这个设备有点特别,需要首先发送地址码过去呼叫设备,呼叫成功后再发命令包过去,现在问题是我呼叫成功了,但是缓冲区返回来的数据不知道是什么,当我把接收长度设为2时,接收到的是“!”,但设为4时,接收到的是“[”。。。。设为6又不同,设为8又不同,但10以后就没有数据了,请问我该怎么判断缓冲区的内容呢?
 
winapi就是让我不明白,你是如何来发帧数据呢?
 
用writefile,代码如下
var
pStr:string;
uFact:Uint;

pStr:=char($01);
//发送
if not WriteFile(Form1.hCommDev,pStr[1],length(pStr),uFact,nil) then begin
ShowMessage('成功');
end else begin
ShowMessage('失败');
end;
//接收
if not ReadFile(form1.hCommDev,pstr,8,uFact,nil) then
showmessage('null')
else
showmessage(pstr[8]);

就是接收的时候pstr得到的东西不同
 
我一直用mscomm发送字符串,二进制数,还没用过,
不过mscomm用的还很顺,
波特率,停止位等参数设对了吧?
 
设置对了,不然通讯是不能成功的,现在算是通讯成功了,问题是怎么判别缓冲区有多少内容和啥内容,我要根据缓冲区的内容发送后续数据包才能完成一次发送命令包的过程
 
如果我在打开串口后要改校验位,要先关闭串口再重新打开么?
 
如果想简单,用 http://sourceforge.net/projects/tpapro/
如果想自己控制,可能比较麻烦。其中需要一个线程监视 Com 的接收缓冲,然后组帧。
另外一个线程判断超时。Com 通讯不难,困难的是上层的通讯协议以及实时控制。
 
现在厂商就是给了上层的通讯协议要我自己写函数,所以要用API了。。。。。
 
用spcomm控件,经典串口控件,我也刚做了一个考勤软件,用的就是SPCOMM
非常简单!!
 
下载一个串行通信调试器:
www.hensel-hk.com/yyh/software.asp
 
后退
顶部