使用Spcomm的Comm1.WriteCommByte,接受时怎么样才能转换为byte?程序(有关图象传送)贴出,帮忙解决问题的再加50分!!! (50分)

基本可以这么理解,但是我建议你找本书再深入研究一下
 
还有,Move会把变量自动取地址,那么就是说她一开始是存放变量的指针的地址,或者说给指针一个地址。是吗?
而她再取一次地址那么就是取到指针指向的那个地址,也就是存放变量的地址,对吗?
那么最后取到的这个变量再从pchar得到真正存放字符串,是吧?
 
我看那本delphi开发人员指南吗?那里面没怎么说啊。还是你推荐本书我看看吧!:) 3X
 
对,SS200给我们推荐一本深入研究delphi的书吧,最好有电子版,买书太贵了!
[:D]
 
rockjie,lmcui:
楼主没有吭声,你们哥俩倒说得挺欢,呵呵
 
<<Delphi 5开发人员指南>>2.6.3章专门讲字符串问题
 
SS2000:
谢谢你的帮助,看来大家讨论的蛮开心的,我就先不留着,等问题解决了一定把分给您送上!
现在我就按你说的改改看:)
 
为什么我接受断只接受到三个字符:BM6
但是用别人的接受可以接受到很多字符???!
我接受是把接受来的数据显示于Memo
另:我按照SS2000大侠的指导改程序如下!小生笨拙,未能完成!希望SS2000千万不要对小生灰心[:D]
///////////////////////////////////////////////
发送部分:
procedure TForm1.Button1Click(Sender: TObject);
var
Stream1:TFileStream;
J:Integer;
B:Byte;
begin
//将图形数据放于stream中,然后再按字节读出,发送
Stream1:=TFileStream.Create('C:/My Documents/My Pictures/3.bmp', fmOpenRead);
try
for J:=0 to Stream1.Size do
begin
Stream1.Read(B,1);
if chr(B)=#13 then //遇到回车边发送两个回车
Comm1.WriteCommData(#13,1); //
if chr(B)='#' then //遇到#,发送#13加#
Comm1.WriteCommData(#13,1);
if not Comm1.WriteCommByte(B) then
begin
Messagedlg('通讯错误!',mtWarning,[mbOk],0);
exit;
end;
end;
//以#为结束标志
Comm1.WriteCommData('#',1);
finally
Stream1.Free;
end;
end;

接受部分:
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
S:String;
I:Integer;
Flg:Boolean;
begin
Flg:=False;
SetLength(S,BufferLength);
Move(Buffer^,Pchar(S)^,BufferLength);
//判断是否结束
//////////////////////////
Memo1.Lines.Add(S);
Memo1.Invalidate;
//////////////////////////
for I:=0 to Length(S) do
begin
if Flg then Break; //前面也是回车符,只要一个

if S=#13 then //遇到转义符,一#13回车为转义符
if S[I+1]=#13 then Flg:=True // 转义符后面的字符只有两种可能
else Break; // 要么是#13要么是#,对两种情况分别判断

if ((S='#') and (S[I-1]<>#13)) then //只有#,前面没有#13,结束
begin
//将接受到的图片存放文件中,并显示在image中
Stream2.Position:=0;
Bitmap1.LoadFromStream(Stream2);
Image1.Picture:=TPicture(Bitmap1);
end
else
begin
Stream2.Write(S,1);
end;
end;
end;
//////////////////////////////////////////
用一个Memo我是想看看我发送的数据到底有什么问题,哪知只接受到三个字符?!后来改用别人的程序,却可以
接受到一串?!是不是我的Spcomm设置有问题?SS2000,不好意思,又烦您了!
 
if S=#13 then //遇到转义符,一#13回车为转义符
if S[I+1]=#13 then Flg:=True // 转义符后面的字符只有两种可能
else Break; // 要么是#13要么是#,对两种情况分别判断
这样岂不是一定结束循环了吗?
 
>>SS2000,不好意思,又烦您了!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
:(,我没有欠你什么吧?哎
你这里有两个问题。
第一:你用SPCOMM传输的是图像数据,实际上是二进制数据,而非普通的可见ASCII,
所以SPCOMM的两个参数你需要改变缺省参数从True变为False,Inx_XonXoffFlow和
Out_XonXoffFlow两个属性
第二:其实并不是你只收到3个字符,而是你只显示了三个字符!!!!(想想为什么)
你从第一个问题应该能想到这个问题的所在。
 
for I:=0 to Length(S) do
begin
if Flg then Break; //前面也是回车符,只要一个

if S=#13 then //遇到转义符,一#13回车为转义符
if S[I+1]=#13 then Flg:=True // 转义符后面的字符只有两种可能
else Break; // 要么是#13要么是#,对两种情况分别判断

if ((S='#') and (S[I-1]<>#13)) then //只有#,前面没有#13,结束
begin
//将接受到的图片存放文件中,并显示在image中
Stream2.Position:=0;
Bitmap1.LoadFromStream(Stream2);
Image1.Picture:=TPicture(Bitmap1);
end
else
begin
Stream2.Write(S,1);
end;
end;

这段代码还有严重的逻辑错误!!
 
试一下这个写法:
在你的For循环内部,不需要Flg了

if S=#13 then //遇到转义符,#13回车为转义符
i := i + 1; //转义符不需处理
if S='#' then //转义符后面是'#',结束
begin
//将接受到的图片存放文件中,并显示在image中
........
Break;
end
else
Stream2.Write(S,1);
 
if S=#13 then //遇到转义符,#13回车为转义符
i := i + 1; //转义符不需处理
if S='#' then //转义符后面是'#',结束
begin
//将接受到的图片存放文件中,并显示在image中
........
Break;
end
else
Stream2.Write(S,1);
这段代码忽略了转义符,实际上就是不需要转义符,和cjh_xf最初的设计的
一样,但这是错误的,我前面已经分析得很明白了

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
首先,你在设计传输协议上是错误的,或者说你根本没有作过
这方面的东西,所以想出了个用'#'作结束符的主意。难道图形数据中
你能保证没有'#'这个数据?那么接收端收到'#'后,怎么判断是结束还
是图形中的数据?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
明白,我这样改一下:
Const
EscapeChar = #13; //转义符
EndChar = '#'; //结束符,当然需要用其他字符来代替这两个字符,这两个字符太常见了

for循环内部改成
if S=EscapeChar then //遇到转义符,#13回车为转义符
begin
if S[i+1]=EscapeChar then //处理的数据是转义符
begin
i := i + 1;
Stream2.Write(S,1); //转义符作为数据写入
end
else
if S[i+1]=EndChar then //碰到结束符
begin
//将接受到的图片存放文件中,并显示在image中
........
Break;
end;
else
Stream2.Write(S,1); //其他字符

这样可以了吧

 
lmcui,你这段代码有两个错误
第一:你把数据'#'和结束符'#'弄反了。
第二:你会得到一个编译错误,“在循环体内不允许改变循环变量的值”,这点和
C语言不同(i := i + 1;在循环体中不允许)

再该该就差不多了
 
我以前遇到的那个SPComm问题不是通过收到结束符来判断传输是否结束的,
而是在最初收到的4字节数据是对方发送数据的长度,
对方根本没给我转义符,对方也不能改变传感器的硬件设计,
接收时只要收足够数量的数据就可以了,因为那个数据传输的设计是绝对安全的,
就是说不会出现丢数据的情况,我觉得比定义转义符简单多了,
只是不适合复杂环境,还需改进。
 
转义符为什么不用“`”这个呢?就是Tab键的上面那个键:)
看来下次我写串口通讯的话要好好把你们的研究过程好好看一下:D
 
To SS2000:
不好意思,国庆放假出门在外,没能好好听您老讲课,还望见谅!回去后一定好好补上(现在还在
外面,抽空来看看),其实我最初也是想到这个问题的,因为用其他人的软件可以受到,当时就估计是
spcomm的设置有问题,果然不错:)!
其实,我也想利用Esc(0x1B),作为转义符,可是在赋值是完成不了,我是这样子做的:
EscapeChar = #0x1B;
总是提示错误,其实我也知道是错的,但不知怎样改正:( 大侠,千万别骂我~~~~~~~~~~我也很认真的
在学习!
最后,祝您和在座的各位兄弟节日快乐!
 
>>EscapeChar = #0x1B;
兄弟,看来你以前是编C语言出生呀,呵呵,那可是C的写法,Delphi的写法是
EscapeChar = #$1B;
0x用$替换,代表的意思一样
 
SS2000:
我确实是学c语言出生的,不过也只是菜鸟级而已:),厉害呀,让我对您的敬佩之情如滔滔江水绵绵不绝呀!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
828
SUNSTONE的Delphi笔记
S
顶部