[求助]SPCOMM 开发多线程 上位机程序 ( 积分: 200 )

  • 主题发起人 主题发起人 citydawn
  • 开始时间 开始时间
我从PC下发命令:O2O0x0d
下位机返回信息应该为:U200801FD0C6
可是却返回:%倐聜?罜6
慧_200801FD0C6
颻200801FD0C6
颻200801FD0C6
颻200801FD0C6
?200801FD0C6
他总是头一位出错,这是为什么?一般是什么原因呢?
 
将一个字节按高低位 转换为2个ASCII码
是什么意思?
如果转换出来的是不可显示字符,那么怎么作为校验位呢?
 
问题基本解决了但还是有两点疑惑:
1。命令中的 0x0d 是结束符,0x是十六进制的标志符是C语言的写法。
我发送命令:O1O00x0d 也可以通讯,这里不用把0x0d转换为#13吧?
2。协议中“8字节卡号指4字节16进制卡号转换为ASCII码”,这句话我不知道该怎么理解
一般我们说ASCII码是说一个字符对应的十进制或十六进制的数值对么?
 
8线程也只需放一个SPCOMM,其他的动态生成就可以了
2.字符'1'的十六进制是31H,转换成ASC方式显示就是两字节字符串'31'
 
procedure Tmythead.Execute;
var
Comm: array [1..8] of TComm;
i:integer;
begin
...
for I := 1 to 8 do
begin
//属性设置
Comm := TComm.Create(nil);
Comm.CommName := 'COM' + IntToStr(I);
Comm.BaudRate :=19200;
//事件设置
Comm.OnReceiveDate :=CommReceiveData;//CommReceiveData是我定义的接收过程

end;
end;

以上是我在线程模板的主执行过程 procedure Tmythead.Execute中的代码;
这样的话就不用放SPCOMM控件了。
另外,TComm.Create(nil);这里创建SPCOMM时他的属性是默认的值,还是全都为空?
我这里只设置了几个属性。
 
至少得放一个SPCOMM吧,一个都不放能行?
属性设那几个就可以了,不会是全空的。
 
我又有了新问题:
当8个下位机都向PC返回信息时,我要将返回的数据写入数据库中,有个问题是我在SPCOMM的ONRECEIVEDATE事件中,加入写数据到数据库的代码,但是他们都通过同一个TQUERY数据集控件将数据写入数据库中,这样会造成数据丢失。该怎么解决 ?
maxim88 您能告诉我您的QQ和信箱么?我把我的程序发给您,帮我看看好么?
 
maxim88@tom.com
不过我对数据库一窍不通。
你是否是无法区分数据是由哪一个下位机发送的?
动态生成时设置comm.tag:=i;
接收事件中由Tcomm(sender).Tag判断数据来源
 
to maxim88

我好象有点明白了,SPCOMM是多线程的意思是:ONRECEIVEDATE事件是独立的线程,他是在打开控件的时候创建的,并一直处于监控状态。
那么这里,我是直接放八个SPCOMM控件,建立一个线程摸板,循环创建8线程向下位机发送数据。
当接收的时候,因为ONRECEIVEDATE事件是独立的线程,那么我直接在ONRECEIVEDATE的事件代码里,动态创建ADOQUERY控件,就可以解决数据返回后,8个ONRECEIVEDATE事件同时共用一个ADOQUERY控件向数据库写数据的问题,对么?
我已经把我的程序发给你了,请多指教,谢谢!
 
我的意思是放一个SPCOMM,然后由此动态生成8个SPCOMM,这8个SPCOMM共享同一个ONRECEIVEDATA事件,就是说不论哪一个串口收到数据都会触发唯一的ONRECEIVEDATA处理过程。
在处理过程中通过Tcomm(sender).Tag来判断是哪一个串口接收的数据,如果Tcomm(sender).Tag=1那就是COM1的接收事件,=2就是COM2的接收事件
 
"我的意思是放一个SPCOMM,然后由此动态生成8个SPCOMM"
是说:放一个SPCOMM,然后在每个线程里给SPCOMM的commname属性不同的值如:COM1,COM2,。。。COM8,然后,每个线程各自对应的COM口,并发送数据。
“共享同一个ONRECEIVEDATA事件”
是说:8线程发送数据后返回的信息由一个SPCOMM的ONRECEIVEDATA事件来处理,这样
等于是8线程发1线程收,这样会丢数据吧?

我说的意思是创建8个SPCOMM他们都有独立的发送和接收线程,不过他们共享同一个ONRECEIVEDATA事件的“处理代码”,而不是共享同一个“事件”。
 
以前写过一个,你可以用一个SPCOMM来控制的,但是做好你的同步和线程的控制.如果可以的话你发一个给我吧,我帮你看看.还有你是用Delphi几的,如果你用Delphi5以上的版本和XP系统也会出现数据丢失这些问题的.
Gfansenhua@163.com
 
我是在XP上用DELPHI7开发的
 
fsh8205-1为何到处叫人给你发代码?????????
 
哦,这个问题可以大家讨论一下的,我开个群一起研究吧.QQ群号:2000202
 
我觉得放8个和生成8个在本质上是一样的,只是放8个的代码编写要麻烦很多
 
帮你看看。。。
yangh999@163.com
 
不论创建的方式怎样,8个控件就有8个ONRECEIVEDATE事件(他是独立的线程),那么就是说有8个线程同时在监听自己的接收BUFFER,有数据来的话马上执行ONRECEIVEDATE中的代码,我在ONRECEIVEDATE中的代码中,将收到的数据INSERT到数据库中,那么有个问题8个事件都触发的话他们都要向数据库写数据,这样回数据丢失么?速度呢?
 
按我的方法8个接收事件是依次触发的,所以事件处理代码不会被同时使用,应该不会丢数据,速度不清楚,我没有数据库操作经验。
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
752
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
658
DelphiTeacher的专栏
D
后退
顶部