如何写条形码读取程序(100分)

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

waterfish

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在要写一个读取条码机的程序,这个条码机是用串口通讯的,而且有缓冲区,我应该怎么写呢,是否有人能帮帮我?如果有哪一位高手写过类似的程序,请提供部分代码以供参考,谢谢大家
 
你的问题实际上应该是串口通讯程序,跟是什么机器
关系不会太大吧!

关于串口通讯的问题我们这里讨论的不少了,你可以
看看有关的问题.无非是Commdrv32和spcomm这两个构件,
下载下来看看例子就差不多了.

没有的话,我可以e-mail给你.
 
如果方便的话,请dwwang兄将上面所说的email给我,spcomm我已经有了,就email
commdrv32和那些例子吧,谢谢
我的email是:sim@163.net
 
OK,信已寄出。
 
还有个问题想请教一下:
在delphi里是如何打开一个端口的,就类似vb里的open command.
 
不要问类似VB如何如何,什么端口?想怎么打开?
 
不知您用什么条码机,有一个叫COM2KEY 的程序(for Dos,WIN,WIN95...),可将
串行读入的数据转成标准键盘输入,届时你只要用一个Edit 框,就立刻搞掂,
程序可以mail 给你。
 
请shenxinaz将这个程序email给我,谢谢!!
 
dwwang,比如说打开一个串行口,向它送一些数据,再从它哪里读出一些数据。
 
请shenxinaz将这个程序email给我,谢谢!!
我的email地址是:sim@163.net
 
原理是把它当作一个文件打开,关键是
那个Commdrv32构件你收到没有?例子难道不能用?
 
文件已经发出;其实问各大条码机(扫描机)供应商都可以要到。
 
用VB里面的COMM32直接控端口!
我有例程
 
dwwang,您的控件我已经收到,现在可以用该控件读取条形码机的日期和数据。但是
同时我碰到另一个头疼的问题。首先我先说说在看例子时碰到的不明之处
commportdriver有一个OnReceiveData的事件,这个事件据我理解就是当串口接到数
据时就应该有触发。触发时同时可以得到串口数据的地址和长度。我看过例子,但不
明白在例子的这个事件中写入的commportdriver.readdata(@s[1],5)是什么意思。
而我在写条形码机程序时碰到的问题是,因为条形码机是根据指令收发数据的,所以
常常会有个发命令和检测执行结果的过程。举个例子吧,象设时间则要经过以下过
程:
1。向条形码机发设置时间指令
2。条形码机发出应答信号,表明已经准备完毕
3。向条形码机发设置的时间数据
4。条形友机发出应答信号表时是否接收
5。如果接收完毕向条形码机发送确认指令,以使时间有效
我真的不知道应该在onrecevicedata事件中如何写这种指令序列,请dwwang真的要
指点一下啊!!
 
HaHa,正好碰上了,我们有一个程序就是这样的逻辑!

首先说第一个问题,@s[1]显然是s的地址,因为readdata
接收pchar型的参数。而5是一次读入的字节数,这只是程
序例子的做法。你想改成其它数也可以,我们一般设置为
对方发来指令的最大长度。

对于你的程序设计,我们的办法是把所有接受指令并判断
下一步动作的程序都写在这里:

ReadData
if 准备接收时间 then 发送时间
if 接收时间OK then 发送确认指令
...

一句话,OnReceviceData事件的处理是一个一对一
的指令处理过程,而不是一个指令序列。

因此它是可"重入"的。当然,为了与程序其它部分结合,
一定的全局变量是不可避免的。
 
onReceviceData里一定要加入readdata函数吗?为什么要有readData,不是
在onrecevicedata事件的参数中已经有了从外设传回的数据了吗?
 
这倒是我有点忽略的,看来那个readdata没什么实际用处,
大概是在CommPortDriver.PausePolling之后防止缓冲区内
有残存数据而作的。

很长时间没回头看这些程序了,有点忘了,不好意思。
不过其它部分没问题,即:针对每一个接收到的数据来
判断所应作出的反应,从而解决异步通讯中的"重入"问题。
 
但是有很多种命令的序列,例如设时间和设参数的命令序列中很类似只是中间将向外
用来表示时间的那部分字符串换上了表示参数的字符串,这怎么处理呢,是不是要有
个变量来标识各种命令吗?
您说您以前做过类似的程序,能否将代码传给我参考一下,我将不胜感激,谢谢!!
 
不好意思,我们的程序是有版权的,为这个事情还差点跟德国人
打起来,我可不敢随便给人,这次真的对不住了 :(

但我还是有足够耐心来讨论问题的 :-)

>>"例如设时间和设参数的命令序列中很类似只是中间将向外
用来表示时间的那部分字符串换上了表示参数的字符串"

这句话没太看懂,可否举例或再明示?
 
首先谢谢你,dwwang.
我现在举个例子:
设时间的序列是这样的:master是主机,slave是条码机
1.master:ENQ+#id+'s' //ENQ是查询指令,ascii码是05,#id是条码机号
2.slave:Ack or No Answer //Ack是应答信号
3.master:STX+YhYl+MhMl+DhDl+HhHl+mhml+ShSl+ETX+BCC
//STX是数据块开始,ETX是数据结束,BCC是校验字符
4.slave:Ack or NAck
5.Master:EOT or resend //EOT是终结字符命令,
对于设操作参数的序列与上列基本相同只是第三步传送的数据块不同而已,在程序里
我应该如何判断呢?
其次,我现在发现有个很怪的事情,有些条码机在95下不接收我的命令,但在dos下
却可以,真的搞到一头雾水
 
后退
顶部