串口通讯时,所发字节为何有断节现象?(100分)

  • 主题发起人 主题发起人 ausable
  • 开始时间 开始时间
A

ausable

Unregistered / Unconfirmed
GUEST, unregistred user!
我开始用mscomm控件的oncomm事件触发接收,当用于MODEM与下位机单片机通讯时出现所发字节串断断续续;
后来改用打开句柄方式:
hComm:=createfile(pchar(temp),Generic_read or Generic_write,0,nil,
open_existing,0,0);
...
writefile(hcomm,pDataToWrite^,length(s),len,0);//发命令
...
ReadFile(HComm,InputBuffer,CommState.cbInQue,dwNumberOfBytesRead,0))
现象依旧
后来采用句柄的异步通讯方式:
hComm:=createfile(pchar(temp),Generic_read or Generic_write,0,nil,
open_existing,FILE_FLAG_OVERLAPPED,0);
...
writefile(hcomm,pstr^,sflen,len,@Write_Os); //发送
...
ReadFile(aHComm,InputBuffer,CommState.cbInQue,dwNumberOfBytesRead,@Read_Os));
现象依旧
采用异步方式后,直接用串口发送命令,不会出现断断续续,而用步方式则会
如何解决连续发送不断续???
HELP ME.
 
你的问题我也遇到了.你接受的数据的发送速度是不是比较快啊!我现在就是拿这个没办法.我用的是spcomm控件.那个控件中有个属性是readintervaltime用这个来判断接受到的两个字节之间的时间,以此来判断它们是不是同一帧。这个时间要根据发送数据原来定。如果你没有设置这个的话可以尝试这个。但是我的问题就比较麻烦了。我接受的数据速度很快两帧之间的间隔时间不到一毫秒。这让我很难搞。以至于我会一次收到很多帧的数。
 
自己分帧,所有通讯都可能会遇到这个问题。
 
我不知道楼上说得自己分帧是什么意思?你是说对数据发送源进行操作还是在数据结束程序里面进行设置?
 
看看是不是波特率设置的问题
 
在我刚刚完全的上位机与下位机通信的时候我也碰到类似的问题,我用的是SPCOMM控件,
对接受很快的数据帧按照顺序放入一个临时空间里面,用算法对这些数据进行判断。因为对数据还得进行验证等等,比如出错啦,出错处理等~~~~~~
 
TO:all
GetCommState(Hcomm,cc.dcb); //得知目前通讯端口的状态
cc.dcb.BaudRate:=CBR_2400; //设置波特律为2400
CC.dcb.ByteSize:=8; // 字节为8位
CC.dcb.Parity:=Noparity; // parity为none;
CC.dcb.StopBits:=Onestopbit; // 一个停止位
if not SetcommState(hcomm,cc.dcb) then//设置通信端口的状态
begin
closehandle(hcomm);
Messagebox(0,'设置端口失败!!','',MB_OK);
exit;
end;
对串口进行了设置.
我手头上有一个别人用TAPI写的,对MODEM操作OK,可惜没有原代码,在网上找TAPI的例子,又毫无建树,求求那位高手给个TAPI的例子参考参考.
 
没人回答,怎么把问题取消(嘿嘿,当然还想保留我的分呀)
 
哎,这年头呀,唯利是图呀!
 
计算机和单片机的指令周期差距很大,即使单片机的指令周期能赶上计算机也会因为计算机的操作系统,和单片机接收数据的方式(轮训/中断)方式而受到影响。所以,真正意义上的同步是不可能存在的。
一般发数据是一个独立的线程,而收数据是另外一个独立的串口监测线程,你看看别人写的串口控件代码就知道了。
所谓同步,是在给单片机发送命令后发送线程Suspended,监测线程接收到一侦数据返回才Resume发送线程。
 
to ausable:
var
hComm2:THandle;
hEventForComm2:THandle;
OverLappedForComm2:TOverLapped;
初始化参数时:
......
hEventForComm2:=CreateEvent(nil,True,True,nil);
OverLappedForComm2.hEvent:=hEventForComm2;
GetCommTimeouts(hComm2,CommTimeOut);
CommTimeOut.ReadIntervalTimeout:=100;
SetCommTimeouts(hComm2,CommTimeOut);
CreateThread(nil,
0,
@CommMontior,
nil,
0,
ThreadId);

procedure CommMontior;//通讯监视线程
var
ReadCount:DWORD;
begin
While True do
begin
if hComm2=INVALID_HANDLE_VALUE then
Exit;
ReadFile(hComm2,buf,4096,ReadCount,@OverLappedForComm2);
WaitForSingleObject(OverLappedForComm2.hEvent,Infinite);
ResetEvent(OverLappedForComm2.hEvent);
PostMessage(Form1.Handle,WM_COMM,0,0); //WM_COMM是自定义的windows消息
end;
end;
 
原来是串口线的问题,哎,搞死人呀。分数大家分了吧。
 
串口线不好造成的,TMD苦呀。把分派了。
 

Similar threads

I
回复
0
查看
633
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部