串口操作与线程的应用(涘,没有分了。)(0分)

从来没见过你这么笨的蛋!
谁的串口通讯不是这样的?
先是握手,然后收发一个帧,从帧中读数??
我只是要对1个串口操作。
但是我的操作有很多步。(我无法对单片机做出改变)
先握手成功,如成功就认为串口没有问题
比如第一步我从串口读出用户号。第二步要读出小区号,第三步读出年龄。
第二步要在确保第一步成功读出方可进行。
第三步要在确保第二步成功读出方可进行。
......
分一步发出,
如帧头,帧长,功能码,数据,功能码,数据,。。。。。,校检码
校验码需要自己算出!如采用海明码则可以判断第几位出错,等 等
功能码01,代表用户号,
功能码02,代表小区号,
。。。
第一步为什么不能成功??(
1,没有串口?不可能
2,读错了,你怎么知道?
这几步为什么要一步一步地来?真是弄不懂
我无法在后一步知道前一步的成功与否(我只能在接收完毕后,置一个变量来标识),
也就是在后一步的操作时,我要先检查一下这个变量。
(我只能这么做)
为什么不能这么做呀,
要不要我给你发一个串口通讯协议呀,
用什么都成,我们公司就用MSCOMM,
 
可能你说的是用户可以发出命令帧的
如,改变量程,改变地区,不过这时候你还再用一个串口 ??
你们公司有点。。。。。
你的协议要做一下,如
在单片机中,令命令21-99为上位机命令
收发协议如,
对不起,这里得用图说明
总之,就第一步握手时要互发几次,如上位机发01,10,下位收到,发位反码,并在码后加发OK
上位机收到正确时可确认,握手可以用奇偶校验,如收发成功,但位错
1.线太长(可能性很小,RS232要在几十米以外,虽然书上说15米)
2,附近干扰太大,(自己看看哟)
3,线接的有问题,(很可能哟)
用万用表量一下,电阻是0才行,2,3对换(有时焊不好有点电阻)
其余都用校验码来判断收发正与否
 
另外,你还是用MSCOMM吧,
1,你熟一些,
2,速度比SPCOMM快,
3,你的要求不复杂
你的要求是通讯,不是操作串口 ,用SPCOMM有点浪费了
 
对不起,我不可能改了。
继续我的问题。
 
请大家对基于我的思路给出相关方法。
我不可能改变了。
在我既有情况下我该如何办?对我表述不清的,你可以问我。不要改变我了,好不好,各位大侠。
我是做读电表的软件。我要读总电量,停电时间,电表用户号等。你们知道了吗
我想一次性把这些参数全读出来。而不是由用户点击一次做一次。而是点一次,程序自动全部做完。
-----------------------------
我只是要对1个串口操作。
但是我的操作有很多步。(我无法对单片机做出改变)
比如第一步我从串口读出用户号。第二步要读出小区号,第三步读出年龄。
第二步要在确保第一步成功读出方可进行。
第三步要在确保第二步成功读出方可进行。
......
我无法在后一步知道前一步的成功与否(我只能在接收完毕后,置一个变量来标识),
也就是在后一步的操作时,我要先检查一下这个变量。
(我只能这么做)
但我无法成功检测到它的变更。
这样你知道我的意思 了吗?
 
你这程序怎么做,很大程度上取决于你的单片机端的发送方式,它是怎么发送的
是接受到你的对于某乙用户的请求后开始这个用户号的数据的发送,还是从头到尾
把所有用户的数据给你发过来?
在发送某个用户的数据试,是先发送完用户号,再等待计算机端的回应还是不管4728
依次发送所有数据?/
 
你们总是试图帮我解释如何与单片机联系。但我的问题不是在这里,
我的问题是如何等候第一步完成后进行第二步。
而且 看第一步成功与否是由我的一个变更来确定
(我在spcomm接收函数中改变此变量的值来表示接收成功与否)(这是无法改变的)。
但我在button_click事件中无法检测到此变量的变化。
我的问题是这样的,大家知道了吗?!!!!!!!
 
自己在button的click事件中创建一个线程,在线程里可以监测到该变量的变化,例子
我上面好像已经举了。由于spcomm的接受事件和线程中都要用到这个变量,并对这个变量
赋值,最好加入同步函数。
 
请告诉我详细步聚。我刚起步学delphi.请您带我一下。
 
在工程里添加一个线程,只要点new -->Thread ..就可以了,然后把它加入到你当前窗口
的uses里,再在button事件中调用
var
myThread1:MyThread;//MyThread是你为它取得名字

myThread1:=MyThread.Create(false);
....
详细情况清看帮助。
当然,你用api函数CreateProgress等几个联用也可以
 
我是不是要在线程中检测变量的改变?
但我在第二步如何得知变更是否改变?
所以我估计你是不是要我在接受函数中建一个线程用来改变变量的值???
另同步函数如何处理??
对线程的使用,能否给我一个简单示例??

 
在何处改变该值要看你自己了,一般情况而言,需要在你的接受事件里改变,同时,在
你的线程里检测到它变化时又得把它改回来,也就是说,一个地方由10--〉11 而另一个
则由11---〉10。
定义一个全程变量比如:
public:
COMLOCK:THandle;
....
在开始时创建一个互斥体,使用CreateMutex比如
ComLock:=CreateMutex('COM1LOCK',......) ;
在你要更改(如果有必要,也可以在读取时加上)使用WaitForSingleObject锁住该句柄
dword_Return:=WaitForSignleObject( ....) (包括在线程里)
最后在修改完后使用ReleaseHandle释放句柄
 
lvxq现在讲的应该讲到我心里去了。
但我对线程从未用过。所以不太明白具体如何操作。
可以请你写一个比较完整的小程序吗?给我示范一下。
 
我也很久不用它了,自己想想办法把,实在不行再说,我只用过delphi3,听说现在都到6了
 
你现在做什么呀?我也有同学在日本东京。叫林涛。
 
这个这么久了还没有结束!
其实我上面给你的两个例子已经很完全了
第一:采用api,这里就是利用一个threads,
通过执行excute,来调用其他函数,我原来做的
首先弹出一个就象安装文件时的滚动条,一点一点的发送,如果错误
就重新发送这个包,最多3次。
threadsendfile = class(TThread)
private
fname:string;
hwriteEvent:THandle;
hcomfile: THandle;
protected
procedure Execute;
override;
public
constructor create(sendfilename:string);
function initcom: integer;//初始化
function sendbuffer(buffer: Pchar;
count: integer): boolean;//发送字符
function sendfl: integer;//发送文件
function closecomfile: integer;
--------------------------------------------------------
这个很明显通过全局变量来处理的
全局变量为 start:integer;
比如第一个包完成设为1,第二完成设为2……,请仔细看代码,你有很多收获!!!!这些是我在产品当中代码,绝对测试通过,很严格的!!
procedure TForm1.Comm2ReceiveData(Sender: TObject;
Buffer: Pointer;
BufferLength: Word);
var
sendchar:pchar;
fnamelen,i,sumchar,size,j,divint,fileeof:integer;
fsize:array[1..4] of integer;
sendbuf:array[1..254] of char;
recchar,NumRead:integer;
begin
Move(Buffer^,PChar(@rbuf)^,BufferLength);
fileeof:=0;
if sendfilecoun=sendfile.Count then
begin
//结束文件的发送
comm2.StopComm;
form2.close;
end;

if (start=1) then
start:=2;
recchar:=rbuf[1];

if ((recchar=11) and (start=2) or (recchar=10) and (start=3)) then
 
谢谢,我先消化一下。
 
我就是林涛啊,你是谁啊?我什么时候的同学?
 
spcomm已经写得很全了,你可以看一下spcomm的源码
spcomm分了两个线程去处理串口一个写线程,一个读线程
并用了线程同步
 
涛涛,你就是林涛?????
太高兴了。太高兴了。。。。。。。。
太高兴了。。。。。。。。。。。。。。。
我无意中的一句话,竟然找到了老同学。
你现在主要用什么工具,做什么项目????
 
顶部