网上有阿 //串口初始化 procedure TForm1.BitBtn3Click(Sender: TObject); begin comm1.startcomm; end; //关闭串口 procedure TForm1.BitBtn4Click(Sender: TObject); begin comm1.StopComm; end; //发送数据 procedure TForm1.BitBtn1Click(Sender: TObject);{var str:string; ch1:char; begin comm1.WriteCommData(ch,1); end. //接收数据 procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer; BufferLength: Word); type ss=array[1..500]of char ; var str1:^ss; i:integer; s:array[0..15] of char ; n:integer; begin str1:=Buffer; //s[]=('0','1','2','3'...'E') for i:=0 to 9 do s[i]:=chr(48+i); for i:=10 to 15 do s[i]:=chr(55+i); for i:=1 to bufferlength do begin n:=ord(str1^[i]); listbox1.Items.add( inttostr(listbox1.Items.Count+1) +' - '+s[n div 16]+s[n mod 16]); end; listbox1.Refresh; if listbox1.Items.count > strtoint(form2.edit1.text) then listbox1.Items.Clear; end;
我以前写的与上海三思科技情报板通信的代码:(没用控件) function CommInitialize(CommName: string): THandle; var hComm: THandle; lpDCB: TDCB; begin result:=0; if Length(CommName)>4 then CommName:='\\.\'+CommName; hComm:=CreateFile(PChar(CommName),GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0); // or FILE_FLAG_OVERLAPPED if hComm=INVALID_HANDLE_VALUE then CloseHandle(hComm) else begin GetCommState(hComm,lpDCB); lpDCB.baudrate:=9600; lpDCB.StopBits:=ONESTOPBIT; lpDCB.ByteSize:=8; lpDCB.Parity:=NOPARITY; //无校验 SetCommState(hComm,lpDCB); SetupComm(hComm,2048,2048); //设置缓冲区 SetCommMask(hComm,EV_RXCHAR); //设置串口的可监控事件为接收到字符。 PurgeComm(hComm,PURGE_TXABORT+PURGE_RXABORT+PURGE_TXCLEAR+PURGE_RXCLEAR); result:=hComm; end; end;procedure FS; begin SendStr:='0010Play.lst+'+chr(0)+chr(0)+chr(0)+chr(0)+#13+#10+'[list]'+#13+#10+'Item_No='+IntToStr(Num)+#13+#10+SendStr; Crc:=ComputeCRC(SendStr,Length(SendStr)); //'0000' sCRC:=Chr(Crc div 256)+Chr(Crc mod 256); SendStr:=SendStr+sCRC; ZY_Str(SendStr); //要发送的字符是否转意。 SendStr:=Chr(STX)+SendStr+Chr(ETX); for i:=0 to CommCount-1 do if (DkXx[i].LX='XSB')and(DkXx[i].BH=Xsb) then begin if DkXx[i].DK=0 then begin MessageBox(Handle,'未能创建此限速标志板的串口,无法发送命令!','错误',MB_OK+MB_ICONERROR); Break; end else begin PurgeComm(DkXx[i].DK,PURGE_TXABORT+PURGE_RXABORT+PURGE_TXCLEAR+PURGE_RXCLEAR); WriteFile(DkXx[i].DK,Pointer(SendStr)^,Length(SendStr),Nbw,nil); Dm.CommADOQuery.Close; DM.CommADOQuery.SQL.Text:=Format('delete FSNR where LX=''XSB'' and BH=''%s''',[Xsb]); DM.CommADOQuery.ExecSQL; Dm.CommADOQuery.SQL.Text:='select * from FSNR where 1=2'; DM.CommADOQuery.Open; for j:=0 to Num-1 do begin Dm.CommADOQuery.Append; Dm.CommADOQuery.FieldByName('LX').AsString:='XSB'; Dm.CommADOQuery.FieldByName('BH').AsString:=Xsb; Dm.CommADOQuery.FieldByName('XH').AsString:=SendListView.Items[j].Caption; Ls1:=SendListView.Items[j].SubItems.Strings[0]; Ls2:=SendListView.Items[j].SubItems.Strings[0]; Ls1:=Ls1[2]+Ls1[3]; if Ls1='文' then Delete(Ls2,1,4) else Ls2:='图片'; Dm.CommADOQuery.FieldByName('NR').AsString:=Ls2; Dm.CommADOQuery.FieldByName('isReturn').AsString:='否'; Dm.CommADOQuery.Post; end; SendComm:=DkXx[i].DK; QbbBh:=Xsb; JS:=0; SetTimer(Handle,1,1000,nil); SetTimer(Handle,2,100,nil); Image1.Visible:=True; Image2.Visible:=True; animateJS:=0; SendListView.Clear; Xsb_XsBhComboBox.ItemIndex:=-1; EnableWindow(Handle,False); Break; end; end; end;
//串口初始化 procedure TForm1.BitBtn3Click(Sender: TObject);
begin
comm1.startcomm;
end;
//关闭串口
procedure TForm1.BitBtn4Click(Sender: TObject);
begin
comm1.StopComm;
end;
//发送数据
procedure TForm1.BitBtn1Click(Sender: TObject);{var str:string;
ch1:char;
begin
comm1.WriteCommData(ch,1);
end.
//接收数据
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
type ss=array[1..500]of char ;
var str1:^ss;
i:integer;
s:array[0..15] of char ;
n:integer;
begin
str1:=Buffer;
//s[]=('0','1','2','3'...'E')
for i:=0 to 9 do
s[i]:=chr(48+i);
for i:=10 to 15 do
s[i]:=chr(55+i);
for i:=1 to bufferlength do
begin
n:=ord(str1^[i]);
listbox1.Items.add(
inttostr(listbox1.Items.Count+1)
+' - '+s[n div 16]+s[n mod 16]);
end;
listbox1.Refresh;
if listbox1.Items.count > strtoint(form2.edit1.text)
then listbox1.Items.Clear;
end;
function CommInitialize(CommName: string): THandle;
var
hComm: THandle;
lpDCB: TDCB;
begin
result:=0;
if Length(CommName)>4 then
CommName:='\\.\'+CommName;
hComm:=CreateFile(PChar(CommName),GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,0); // or FILE_FLAG_OVERLAPPED
if hComm=INVALID_HANDLE_VALUE then
CloseHandle(hComm)
else
begin
GetCommState(hComm,lpDCB);
lpDCB.baudrate:=9600;
lpDCB.StopBits:=ONESTOPBIT;
lpDCB.ByteSize:=8;
lpDCB.Parity:=NOPARITY; //无校验
SetCommState(hComm,lpDCB);
SetupComm(hComm,2048,2048); //设置缓冲区
SetCommMask(hComm,EV_RXCHAR); //设置串口的可监控事件为接收到字符。 PurgeComm(hComm,PURGE_TXABORT+PURGE_RXABORT+PURGE_TXCLEAR+PURGE_RXCLEAR);
result:=hComm;
end;
end;procedure FS;
begin
SendStr:='0010Play.lst+'+chr(0)+chr(0)+chr(0)+chr(0)+#13+#10+'[list]'+#13+#10+'Item_No='+IntToStr(Num)+#13+#10+SendStr;
Crc:=ComputeCRC(SendStr,Length(SendStr)); //'0000'
sCRC:=Chr(Crc div 256)+Chr(Crc mod 256);
SendStr:=SendStr+sCRC; ZY_Str(SendStr); //要发送的字符是否转意。
SendStr:=Chr(STX)+SendStr+Chr(ETX); for i:=0 to CommCount-1 do
if (DkXx[i].LX='XSB')and(DkXx[i].BH=Xsb) then
begin
if DkXx[i].DK=0 then
begin
MessageBox(Handle,'未能创建此限速标志板的串口,无法发送命令!','错误',MB_OK+MB_ICONERROR);
Break;
end
else
begin
PurgeComm(DkXx[i].DK,PURGE_TXABORT+PURGE_RXABORT+PURGE_TXCLEAR+PURGE_RXCLEAR);
WriteFile(DkXx[i].DK,Pointer(SendStr)^,Length(SendStr),Nbw,nil); Dm.CommADOQuery.Close;
DM.CommADOQuery.SQL.Text:=Format('delete FSNR where LX=''XSB'' and BH=''%s''',[Xsb]);
DM.CommADOQuery.ExecSQL;
Dm.CommADOQuery.SQL.Text:='select * from FSNR where 1=2';
DM.CommADOQuery.Open;
for j:=0 to Num-1 do
begin
Dm.CommADOQuery.Append;
Dm.CommADOQuery.FieldByName('LX').AsString:='XSB';
Dm.CommADOQuery.FieldByName('BH').AsString:=Xsb;
Dm.CommADOQuery.FieldByName('XH').AsString:=SendListView.Items[j].Caption;
Ls1:=SendListView.Items[j].SubItems.Strings[0];
Ls2:=SendListView.Items[j].SubItems.Strings[0];
Ls1:=Ls1[2]+Ls1[3];
if Ls1='文' then
Delete(Ls2,1,4)
else
Ls2:='图片';
Dm.CommADOQuery.FieldByName('NR').AsString:=Ls2;
Dm.CommADOQuery.FieldByName('isReturn').AsString:='否';
Dm.CommADOQuery.Post;
end; SendComm:=DkXx[i].DK;
QbbBh:=Xsb;
JS:=0; SetTimer(Handle,1,1000,nil);
SetTimer(Handle,2,100,nil);
Image1.Visible:=True;
Image2.Visible:=True;
animateJS:=0;
SendListView.Clear;
Xsb_XsBhComboBox.ItemIndex:=-1; EnableWindow(Handle,False);
Break;
end;
end;
end;