本人笔记本电脑用的是虚拟串口软件虚拟的串口 1端口发送 2端口接收 数据接收不了 但能发送 接收程序如下
procedure TMain_form.MSComm1Comm(Sender: TObject);
begin
if MSComm1.CommEvent=2 then
begin
recstr:=MSComm1.Input;
for Tempindex:=0 to (Linecount-1) do
begin
Line[Tempindex].Line_tab_id :=strtoint(copy(Recstr,Tempindex*8+1,3));
line[Tempindex].Line_DY := strtoint(copy(Recstr,Tempindex*8+5,3));
if line[Tempindex].Line_DY>=245 then
begin
data_form.AddBj_tab.Active :=false;
data_form.AddBj_tab.SQL.Text :='insert into BJ_tab(sj,XL_Tab_ID,DY,BJXX)values('+#39+formatdatetime('yyyy-mm-dd hh:mm:ss',TempDatetime)+#39+','+inttostr(line[Tempindex].Line_tab_id)+','+inttostr(line[Tempindex].Line_DY)+','+#39+'电压越上限'+#39+')';
data_form.AddBj_tab.ExecSQL;
end
else
if line[Tempindex].Line_DY<=190 then
begin
data_form.AddBj_tab.Active :=false;
data_form.AddBj_tab.SQL.Text :='insert into BJ_tab(sj,XL_Tab_ID,DY,BJXX)values('+#39+formatdatetime('yyyy-mm-dd hh:mm:ss',TempDatetime)+#39+','+inttostr(line[Tempindex].Line_tab_id)+','+inttostr(line[Tempindex].Line_DY)+','+#39+'电压越下限'+#39+')';
data_form.AddBj_tab.ExecSQL;
end;
end;
Memo1.Lines.Add('接收数据:'+copy(recstr,1,length(recstr)-1));
end;
end;procedure TMain_form.N1com11Click(Sender: TObject);
begin
if MSComm1.PortOpen then MSComm1.PortOpen := false;//关闭端口
MSComm1.CommPort := 2;//设置端口2
MSComm1.InBufferSize := 256;//设置接收缓冲区为256个字节
MSComm1.OutBufferSize := 256;//设置发送缓冲区为256个字节
MSComm1.Settings := '9600,n,8,1';//9600波特率,无校验,8位数据位,1位停止位
MSComm1.InputLen := 0;//读取缓冲区全部内容(32个字节)
MSComm1.InBufferCount := 0;// 清除接收缓冲区
MSComm1.OutBufferCount:=0;// 清除发送缓冲区
MSComm1.RThreshold := 64;//设置接收32个字节产生OnComm 事件
MSComm1.InputMode := comInputModeText;//文本方式
N1com11.Checked :=true;
comstr:='COM2';
end;
procedure TMain_form.MSComm1Comm(Sender: TObject);
begin
if MSComm1.CommEvent=2 then
begin
recstr:=MSComm1.Input;
for Tempindex:=0 to (Linecount-1) do
begin
Line[Tempindex].Line_tab_id :=strtoint(copy(Recstr,Tempindex*8+1,3));
line[Tempindex].Line_DY := strtoint(copy(Recstr,Tempindex*8+5,3));
if line[Tempindex].Line_DY>=245 then
begin
data_form.AddBj_tab.Active :=false;
data_form.AddBj_tab.SQL.Text :='insert into BJ_tab(sj,XL_Tab_ID,DY,BJXX)values('+#39+formatdatetime('yyyy-mm-dd hh:mm:ss',TempDatetime)+#39+','+inttostr(line[Tempindex].Line_tab_id)+','+inttostr(line[Tempindex].Line_DY)+','+#39+'电压越上限'+#39+')';
data_form.AddBj_tab.ExecSQL;
end
else
if line[Tempindex].Line_DY<=190 then
begin
data_form.AddBj_tab.Active :=false;
data_form.AddBj_tab.SQL.Text :='insert into BJ_tab(sj,XL_Tab_ID,DY,BJXX)values('+#39+formatdatetime('yyyy-mm-dd hh:mm:ss',TempDatetime)+#39+','+inttostr(line[Tempindex].Line_tab_id)+','+inttostr(line[Tempindex].Line_DY)+','+#39+'电压越下限'+#39+')';
data_form.AddBj_tab.ExecSQL;
end;
end;
Memo1.Lines.Add('接收数据:'+copy(recstr,1,length(recstr)-1));
end;
end;procedure TMain_form.N1com11Click(Sender: TObject);
begin
if MSComm1.PortOpen then MSComm1.PortOpen := false;//关闭端口
MSComm1.CommPort := 2;//设置端口2
MSComm1.InBufferSize := 256;//设置接收缓冲区为256个字节
MSComm1.OutBufferSize := 256;//设置发送缓冲区为256个字节
MSComm1.Settings := '9600,n,8,1';//9600波特率,无校验,8位数据位,1位停止位
MSComm1.InputLen := 0;//读取缓冲区全部内容(32个字节)
MSComm1.InBufferCount := 0;// 清除接收缓冲区
MSComm1.OutBufferCount:=0;// 清除发送缓冲区
MSComm1.RThreshold := 64;//设置接收32个字节产生OnComm 事件
MSComm1.InputMode := comInputModeText;//文本方式
N1com11.Checked :=true;
comstr:='COM2';
end;
我的程序包括两部分 一个串口发送部分 一个接收并显示分析部分。 串口发送部分运行正常 ,用com1 发送 的时候 ,下载的一个串口调试软件用com2能接收到数据。但一用自己写的程序接收时就出现错误了,是不是代码写的有问题? 可是编译了 也没提示错误啊。
语法不对也就算了。下面也没打开串口,在下面加上试下
MSComm1.PortOpen then MSComm1.PortOpen := Open
[/Quote]这个语法不对吧? 上面那段程序使用Memo显示接收到的数据 并将异常数据存入数据库报警
我用MSCOMM也是碰到这个错误,但用API写的一个测试程序就没问题.