COM口的读写 急急急!!(100分)

  • 主题发起人 主题发起人 xxk
  • 开始时间 开始时间
X

xxk

Unregistered / Unconfirmed
GUEST, unregistred user!
静态调用一个DLL程序,这个DLL程序是用C语言写的.提供有读写com口的接口函数.
INT __declspec(dllexport) PASCAL StWriteComm(HANDLE hPort, LPBYTE pBuf, UINT uWrite)
说明:写数据pBuf到打开的串口
hPort:上函数返回的句柄
pBuf:要写入到串口的数据
uWrite:要写入的数据长度
返回值:int型,写入了的数据长度
INT __declspec(dllexport) PASCAL StReadComm(HANDLE hPort, LPSTR pBuf, UINT uRead)
说明:读串口数据到pBuf缓冲中
hPort:上函数返回的句柄
pBuf:存放串口读到的数据缓冲
uRead:希望读入的长度
返回值:int型,实际读到的长度
写串口的时候只能一个个字符发出去,读串口总是有问题.
希望大家帮帮忙,我只有200分可以送出去了.再次谢谢了!
 
用 CPort 控件,很好用的。
 
在线等待.
 
关键是用终端登陆到服务器上面刷POS机,以前写的必须要用PC机.
 
CPort控件能用在终端机器登陆到服务器上吗?
 
用C还是Delphi?
你的代码贴出。。。
 
用Delphi调用C写的DLL
代码如下:
DLL的声明函数前面已经贴出,我也不知道我在Delphi里面声明错了没有,请指点.
function StOpenComm(com:string;i:Integer;o:Integer):LongInt;stdcall;
external 'ComDll.dll';
function StCloseComm(Port:LongInt):Boolean;stdcall;
external 'ComDll.dll';
function StSetComm(comPort:LongInt;LPSTR:string):Integer;stdcall;
external 'ComDll.dll';
function StWriteComm(hPort:LongInt;pBuf:widestring;uWrite:Integer):Integer;stdcall;
external 'ComDll.dll';
function StReadComm(hPort:LongInt;pBuf:pchar;uRead:Integer):Integer;stdcall;
external 'ComDll.dll';
implementation

{$R *.dfm}


procedure TForm1.btnOpenComClick(Sender: TObject);
begin
Port1 := StOpenComm('COM1',1024,1024);
end;

procedure TForm1.btnCloseComClick(Sender: TObject);
var
result :Boolean;
begin
result:=False;
result:=StCloseComm (Port1);
if result=True then
ShowMessage('已经关闭了COM1口.')
else
ShowMessage('关闭COM口1失败.');
end;

procedure TForm1.btnSetComPortClick(Sender: TObject);
begin
// StSetComm(Port,'baud=9600, parity=N ,data=8, stop=1');
end;

procedure TForm1.btnSendDataClick(Sender: TObject);
var
i:integer;
pBuf : array[0..1024] of byte;
begin
//StWriteComm(Port1,HexStrToStr('$02'),1);
//StWriteComm(Port1,HexStrToStr('$00'),1);
//StWriteComm(Port1,HexStrToStr('$02'),1);
//StWriteComm(Port1,HexStrToStr('$13'),1);
//StWriteComm(Port1,HexStrToStr('$03'),1);
//StWriteComm(Port1,HexStrToStr('$03'),1);
StWriteComm(Port1,'a',1);
StWriteComm(Port1,'b',1);
//pBuf[0] := ord('a');
//pBuf[1] := ord('b');
//StWriteComm(Port1,pBuf,2);
end;

procedure TForm1.btnReceiveDataClick(Sender: TObject);
var
//pBuf:pchar;
//pBuf:widestring;
pBuf : array[0..1024] of char;
sTemp : String;
i : Integer;
begin
pBuf :='';
i := StReadComm(Port2,pBuf,1024);
sTemp := pBuf;
RichEdit1.Lines.Add(sTemp);
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Port2 := StOpenComm('COM2',1024,1024);
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
var
result :Boolean;
begin
result:=StCloseComm (Port2);
if result=True then
ShowMessage('已经关闭了COM2口.')
else
ShowMessage('关闭COM2口失败.');
end;
 
你读数据那里写错了
i := StReadComm(Port2,pBuf,1024);中的1024是想要读的数据个数,串口没有那么多数据,所以每次出错,你改成1试一试,肯定可以读上来。
 
原来都都试过了
 
怎么都没有帮帮忙呢?真的很急!
 
真的没有人能帮帮忙吗?分不够就加到200
我只有这么多了.
 
CPort控件可以用的。
 
我用MSComm控件做了几个控制COM端口的程序了.为什么不试试呢?
 
[:D]应该多试试大家提的控件,说不定你能用上呢。
 
多試試大家提供的方法,說不定有用呢?
 
试试吧,本来想自己写的.看来还是水平有限.多谢大家了.
 
多人接受答案了。
 
后退
顶部