iie:快来救我,串口通信(100分)

  • 主题发起人 主题发起人 yan11
  • 开始时间 开始时间
Y

yan11

Unregistered / Unconfirmed
GUEST, unregistred user!
iie:我用你的串口大师,调试成功,当我选2进制显示按钮时,便接受到了数据,你能否把你
接受和发送格式给我,即:按什么方式发送?太谢谢你了。如有这方面的经验,能帮我一下
就感谢您了。
 
我的格式?天哪,那不是我的,是你的。
之所以2进制能显示,是因为您收到数据是不可打印字符,通常chr > #128 or chr < #20
而选择2进则直接显示其acsii码序

问题是,显示的东西是您需要的吗?是否与厂家提供的通信协议一致。
 
iie:通信协议没有问题,只是现在接受到我缓冲区的数据我不能正确的读出,而用你的
串口大师却能读出,且是正确的,所以现在已经不是通信的问题,而是数据转换的问题,
能否把你的接受与发送的程序的原代码发给我。太谢谢了,你不知道,为了此问题,领导
叫我加班了。
 
唉,你真幸福,直到今天才知道加班的痛苦,我可是在没有双休日的那个年代就
一直没有完整的休息日呵。
你发送和接收没错的话,就没问题了,并不是我的程序那点高明,应该是后面处理的问题
你可以把从接收开始到显示的代码mail给我,我帮你看看
 
iie:我把我的原代码发给你的E—mail:iie@163.net
你把你qq给我
 
我现在不能开qq,你贴代码更快一些
 
你说的没错,我后台操作的错误,前天由于一些原因没有上网,不知你今天在网上吗?
我已经把程序发到你的邮箱里了,我现在用2进制收已经正常了,只是发不正常,
请问我要发一串16进制数怎样发?谢谢了!
 
我对接收部分的代码改了一下,已经发给你了,其实发送部分也类似的,
你先自己改一下好了
 
谢谢!我受到数据至少不是乱码了,可是接受到的数据不正确,用你的串口大师就可以接受正常。
我用mscomm已经可以正确接受,发送有问题,也许与我的通讯协议或别的属性设置有关,
应受到到/126//204//9//197//231/,用你的代码接受为:/248//24//30//102//6//152//6//230//248//254/
 
肯定是波特率没对准,如果我没猜错,
你用我的程序设的是4800,而你自己用mscomm设的是9600
 
iie:你简直太棒了,你说的没错,我是设置成了9600,我把它变成了4800,接受一切正常
,现在就是发送了,我试了如下:
ar
s: array[1..5] of byte;//string;
begin
s[1]:=$7e;
s[2]:=$cc;
s[3]:=$01;
s[4]:=$cd;
s[5]:=$e7;
comm1.WriteCommData(s, Length(s));
运行时提醒我pchar与array不相符,我
 
我还没说完,我知道应为comm1.WriteCommData中应用pchar类型,我不知怎样把数组类型转化为
pchar类型,因为我要取数据必须发一串16进制数据即为:$7e$cc$01$cd$e7
 
也许是这样的;
var
s: array[1..5] of byte;
begin
s[1]:=byte($7e);
s[2]:=byte($cc);
s[3]:=byte($01);
s[4]:=byte($cd);
s[5]:=byte($e7);
comm1.WriteCommData(@s[1],5);
可我接受的还是错误信息,当然错误信息是正确的接受了,
我的通信协议是这样的:
如果单片机认为我发送的错误就发给我:126 204 9 197 231,16进制为:7e cc 01 cd e7
空格是我自己加的。当然这个错误有可能是控件属性、通信协议、发错数据等等,
如果单片机认为我正确就会发给我:7e cc 10 dc e7 7e ee ac 00 00 00 dd dd 42 e7
发送应以16进制发送。
你很忙是吧!不好意思了!
 
这程序应该没问题了呵,根本不用转换,s[1] := $7e就行
ps:你在我的串口大师里是这么发的吗:

/$7e//$cc//$01//$cd//$e7/

 
{ TreadThread }
TreadThread = class(TThread)
private
Fport: integer;
Fcomhandle: Integer;
protected
procedure Execute; override;
public
constructor Create(port:integer;comhandle:thandle);

end;


constructor TreadThread.Create(port:integer;comhandle:thandle);
begin
Fport:=port;
Fcomhandle:=comhandle;
FreeOnTerminate := True;
inherited Create(true);
end;

procedure TreadThread.Execute;
begin
read_commdata(fcomhandle,fport);
end;
procedure read_commdata(comhandle:thandle;port:integer);
var
eventmask:dword;
Clear:Boolean;
Coms:Tcomstat;
cbNum,ReadNumber:cardinal;
lpErrors:cardinal;
Read_Buffer:array[1..200] of byte;
i:integer;
begin
eventmask:=0;
while true do
if (waitcommevent(comhandle,eventmask,overlapped)) then
if (eventmask=ev_rxchar) then
begin
Clear:=Clearcommerror(comhandle,lpErrors,@Coms);
if Clear Then
Begin
cbNum:=Coms.cbInQue;
if ReadFile(comhandle,Read_Buffer,cbNum,ReadNumber,overlapped) then
for i:=1 to cbnum do
begin
add_onereceivedata(port,read_buffer)
end;
end;
end;
end;

procedure send_data(comhandle:thandle;datacount:integer;dataarray:array of byte);
var
i:integer;
tempstring:string;
begin
tempstring:='';
for i:=0 to datacount-1 do
tempstring:=tempstring+inttohex(dataarray,0)+' ';
sendstring.Add(tempstring);
comwrite(comhandle,datacount,dataarray);
end;


//通讯口初始化
function init_comport(port:string;var comhandle:thandle;sbaud,sstop,sbyte,sparity:integer):boolean;
var
lpdcb:Tdcb;
begin
fillchar(overlapped,sizeof(toverlapped),0);
Comhandle:=CreateFile(PChar(Port),generic_read or generic_write,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if comhandle = INVALID_HANDLE_VALUE then
result:=false
else
begin
if not setupcomm(comhandle,100,100) then
begin
result:=false;
exit;
end;
getcommstate(comhandle,lpdcb);
lpdcb.baudrate:=sbaud;
lpdcb.StopBits:=sstop;
lpdcb.ByteSize:=sbyte;
lpdcb.Parity:=sparity;
if not Setcommstate(comhandle,lpdcb) then
begin
result:=false;
exit;
end;
if not setcommMask(comhandle,ev_rxchar) then
begin
result:=false;
exit;
end;
result:=true;
end;
end;

//通讯口发送数据
procedure comwrite(comhandle:integer;num:longint;buf:array of byte);
var
i:integer;
number:cardinal;
begin
number:=0;
for i:=0 to num-1 do
begin
writefile(comhandle,buf,1,number,overlapped);
end;
end;

在:add_onereceivedata 过程中处理收到的数据。

readthread 用于收数据。
有其他问题可EMAIL 给我:zhang6@public.xm.fj.cn

 
iie:我刚才发/$7e//$cc//$01//$cd//$e7/ ,结果还是收到/126//204//9//197//231/
你下班了吧?

jackyzhang:我先看一下你的程序,以后我和你联系,谢谢你帮忙
 
你误解了,我问的是你说过用我的程序发应答正确,我想确认一下你用我的程序
都发了什么东西,请把发送行的内容贴出来
 
我用你的程序也是只能得到正确的错误信息,即/126//204//9//197//231/
也没有受到7e cc 10 dc e7 7e ee ac 00 00 00 dd dd 42 e7
我说的正常,是指接受正常。
 
谢谢!我受到数据至少不是乱码了,可是接受到的数据不正确,用你的串口大师就可以接受正常。
我用mscomm已经可以正确接受,发送有问题,也许与我的通讯协议或别的属性设置有关,
应受到到/126//204//9//197//231/,用你的代码接受为:/248//24//30//102//6//152//6//230//248//254/

这段话什么意思
 
现在是这样的:用我的程序和你的串口大师,接受数据已经没有问题了,但发送数据有问题,所以
接受的数据是正确的错误信息,这句话有一点难懂,就是我能正确接受,发送有错误,
用你串口大师也不好用,请问我该怎样发送一串16进制数?
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
880
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部