大佬们跪求帮看一下,为什么我的串口只有在使用过串口调试助手才
delphi吧
全部回复
仅看楼主
level 3
大佬们跪求帮看一下,为什么我的串口只有在使用过串口调试助手才可以往下位机发送数据,然后从下位机读取数据?不能直接运行就正常发送?[泪][泪][泪]代码如下,大佬们不要抛弃小弟啊[乖][乖]
unit Unit2;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls,DateUtils ;type TByteArr = array of byte; TForm2 = class(TForm) Button1: TButton; Label1: TLabel; Label3: TLabel; Memo2: TMemo; Button2: TButton; RadioGroup1: TRadioGroup; Timer1: TTimer; Button4: TButton; Button5: TButton; Edit1: TEdit; GroupBox1: TGroupBox; ComboBox1: TComboBox; ComboBox2: TComboBox; ComboBox3: TComboBox; ComboBox4: TComboBox; Label2: TLabel; Label4: TLabel; procedure sendstr(ss:TByteArr); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form2: TForm2; k,nn,sendtimes:integer;
2018年09月13日 09点09分 1
level 3
手动顶一下[泪]
2018年09月13日 09点09分 2
level 3
不要沉啊[惊哭]
2018年09月13日 09点09分 3
level 3
comf1:integer; //定义串口句柄 Dcb1:DCB; //定义设备控制结构体 COMMTIMEOUTS1:COMMTIMEOUTS; //定义超时结构体 Readbuf1,Writebuf1:array [1..256] of byte; //定义读写缓冲区implementation{$R *.dfm}{字符串转换成16进制字符串}function StrToHexStr1(const S:string):string;//字符串转换成16进制字符串var I:Integer;begin for I:=1 to Length(S) do begin if I=1 then Result:=IntToHex(Ord(S[1]),2) else Result:=Result+' '+IntToHex(Ord(S[I]),2); end;end;procedure TForm2.sendstr(ss:TByteArr); //定义发送文本的方法var i:integer; //临时变量 NumberOfBytesWritten:Cardinal; //实际发送的字节数begin for i:=1 to length(ss) do writebuf1[i]:=ss[i]; //将文本字符导入输出缓冲区 if WriteFile(comf1,writebuf1,length(ss),NumberOfBytesWritten ,0) then //调用API函数发送 begin inc(sendtimes); //成功后计数 end;end;procedure TForm2.Butt
2018年09月13日 09点09分 4
level 3
procedure TForm2.Button2Click(Sender: TObject);var buf: TByteArr ; str:string;begin setlength(buf,16) ; buf[1]:=254 ; buf[2]:=254 ; buf[3]:=104 ; buf[4]:=1 ; buf[5]:=2; buf[6]:=0; buf[7]:=8; buf[8]:=128; buf[9]:=19; buf[10]:=104; buf[11]:=1; buf[12]:=2; buf[13]:=67; buf[14]:=195; buf[15]:=119; buf[16]:=22; sendstr(buf);end;procedure TForm2.Timer1Timer(Sender: TObject);var i:integer; //临时变量 NumberOfBytesRead:Cardinal; //实际读到的字节数 ss,sss:string;sYear,sMonth,sDay,sWeek,sTime: string; //临时字符串begin if ReadFile(comf1,readbuf1,60, NumberOfBytesRead,0)then //读60个字节到readbuf1 if NumberOfBytesRead>0 then //如果实际读到字节数>0 begin inc(k); //计读次数 nn:=nn+NumberOfBytesRead; //计字节数 label3.caption:='第'+inttostr(k)+ '次收到'+ inttostr(NumberOfBytesRead)+'字节 共:'+inttostr(nn)+'字节';
2018年09月13日 09点09分 5
level 3
// 显示收到的情况 ss:=''; sss:=''; for i:=1 to NumberOfBytesRead do ss:=ss+chr(readbuf1[i]); //由二进制区到字符串 Edit1.Text:=IntToHex(readbuf1[18]-51,2)+IntToHex(readbuf1[17]-51,2) +' '+IntToHex((readbuf1[16]-51),2)+'.'+IntToHex(readbuf1[15]-51,2)+'kwh'; memo2.Lines.add(StrToHexStr1(ss)); //放入memo2 sYear := FormatDateTime('yyyy',Now)+'年';//年 sMonth := FormatDateTime('mmm',Now);//月 sDay := FormatDateTime('d',Now)+'日 ';//日 sWeek := FormatDateTime('ddd',Now);//周 sTime := FormatDateTime(' hh:mm:ss',Now);//时间 label4.Caption:='现在是:' + sYear + sMonth + sDay + sWeek + sTime; end;end;procedure TForm2.Button4Click(Sender: TObject);begin memo2.Lines.Clear; //清除接收的文本end;procedure TForm2.Button5Click(Sender: TObject);beginClose;end;procedure TForm2.FormCreate(Sender: TObject);beginLabel1.Caption:='串口句柄' ;Label3.Caption:='接收情况' ;RadioGroup1.ItemIndex:=0;end;end.
2018年09月13日 09点09分 6
level 3
有人吗
2018年09月13日 10点09分 7
level 3
解决不了啊
2018年09月13日 10点09分 8
level 3
有人吗
2018年09月13日 13点09分 9
level 14
没打开串口?
2018年09月13日 15点09分 10
打开了,creatfile成功了,返回值不为0
2018年09月13日 15点09分
@无言落叶伤的忧 我加上getcomstate后,发现getcomstate和setcomstate返回值为0,串口配置失败了好像
2018年09月13日 15点09分
level 14
这种问题一般是串口没打开或者打开串口时出现了错误。这个你用控件来做容易些。
2018年09月13日 15点09分 11
这个我用控件成功了,但是老师要求用API函数写
2018年09月13日 15点09分
串口配种失败了应该是,但不知道怎么解决
2018年09月13日 15点09分
level 3
接着顶
2018年09月13日 15点09分 12
level 14
那你就抄控件的代码控件也是用API的
2018年09月13日 16点09分 13
level 9
贴得一手好代码。
其实就是CreateFile/SetCommStatus之后,WriteFile就好了,要注意Write File的返回值,另外就是缓冲区看看对不对,一般的缓冲区是ansichar,不是char,或者用byte也行
2018年09月14日 00点09分 14
这个缓冲区是定义的字节数组,只需要在createfile之前加上那个语句就行了吗?[呵呵][呵呵]
2018年09月14日 01点09分
Writefile没有问题,那个setcommstatus我没找到这个函数啊
2018年09月14日 01点09分
@无言落叶伤的忧 建议重新贴下代码,这么乱谁看啊。打开串口后,要设置通讯参数(例如9600,N,8,1之类),没看到你的代码里面有。
2018年09月14日 14点09分
level 3
Dd
2018年09月14日 04点09分 15
1