帮忙看段程序啊,急啊(串口通信) (50分)

  • 主题发起人 主题发起人 Langrenxilin
  • 开始时间 开始时间
L

Langrenxilin

Unregistered / Unconfirmed
GUEST, unregistred user!
function getdata:integer;stdcall;
var
temp : integer;
nBytesRead, dwError:LongWORD ;
rbuf:array [0..11] of byte;
cs:TCOMSTAT;
begin
ClearCommError(hComm,dwError,@CS); //取得状态
ReadFile(hComm, pchar(@rbuf)^,cs.cbInQue,nBytesRead,nil); // 接收COM 的数据
temp:=rbuf[0];
result:=Temp;
end;
主程序中读取getdata的返回值
怎样一有数据到就触发接收的函数
 
估计和你返回String类型有关,换个别的类型试试,我一般习惯用
function GetData(var Buffer; Count: Integer): Integer; stdcall;
 
tseug
谢谢你,没有错误提示了,但是为什么在没有发数据时还可以收到数据啊
 
不会啊,你接的什么设备?有时候如果地没接好也会有问题...9针的5脚
 
设备应该没问题的,
怎么能够让一有数据就触发接收事件啊
 
我把程序改成这样了:
function getdata:integer;stdcall;
var
temp : integer;
nBytesRead, dwError:LongWORD ;
rbuf:array [0..11] of byte;
cs:TCOMSTAT;
begin
ClearCommError(hComm,dwError,@CS); //取得状态
ReadFile(hComm, pchar(@rbuf)^,cs.cbInQue,nBytesRead,nil); // 接收COM 的数据
temp:=rbuf[0];
result:=Temp;
end;
 
那你需要用一个线程来检测了, 你到晚上找找SPCOMM控件, 带源码的..
 
有一个监测函数可以完成你的要求,不过我不记得了,你可以查一下api帮助。
 
function getdata:integer;stdcall;
var
temp : integer;
nBytesRead, dwError:LongWORD ;
rbuf:array [0..11] of byte;
cs:TCOMSTAT;
begin
ClearCommError(hComm,dwError,@CS); //取得状态
ReadFile(hComm, pchar(@rbuf)^,cs.cbInQue,nBytesRead,nil); // 接收COM 的数据
if nBytesRead>0 then
begin
temp:=rbuf[0];
result:=Temp;
end;
end;
 
用turbopower吧,我现在就在用,这个控件有个Trigger事件,很轻松就能对数据进行触发
 
呵呵,看看Mscom吧,里面有个设置为1,就代表接受到1位就触发接受事件。。。

不过很少有人这么用
 
cbInQue干什么的
 
我API 写串行通讯必须写成多线程的。
用 WaitCommEvent 等待接收消息。如没有。程序就一直等。
所以必须写成多线程的。
要用的API 有
CreateFile
ReadFile
WriteFile
SetCommMask
WaitCommEvent
当用 WaitCommEvent 有数据接收到时
再用ClearCommError 得到输入的数据长度
再用一个动态数组来读取它。
在 Delphi 下写比较麻烦。
你还要考虑线程同步。
子线程不能直接操作 GUI 必须用 线程同步。
最简单的方法还是下一个 SPComm 来。
先用一下。再看它的源码对你有帮助的。
我写了一个串口调试器。通调类也是我自己写的
在 vip.6to23.com/coodba 在下载。
Good Luck!
 
多人接受答案了。
 
后退
顶部