关于串口连接的问题..... RT,可以通过注册表获取所有的串口,有什么办法可以知道哪些串口已经连接到设备上了?比如短信猫之类的设备 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用 CreateFile('COMx', ...) ,能返回正常句柄的,就是有设备。 至于具体的设备类型,就不太好判断了。 如果只是将设备接到COM口上,用CREATEFILE的方式返回是正常的句柄.... 遍历存在的各串口,发送测试数据;或者用CreateFile打开各串口,返回异常时用GetLastError捕获判读,不过我查了下MSDN,似乎没有单独的串口打开值,只有1119接近,楼主再仔细看看。 我用spcomm控件,历遍每个串口,然后发送AT指令,看其返回值,进行判断接的是否为短信猫,可指令发送出去后,收到的数据是乱码,贴上代码,各位帮忙看下procedure TForm1.SendData;var i:integer; commflg:boolean; SendStr : string;begin viewstring:='' ; commflg:=true; SendStr:=PChar('ATZ' + chr($0d)+chr($0a) ); with cm1 do begin CommName := lst1.Items[lst1.ItemIndex];//COM3 BaudRate := 9600; ByteSize := _8; Parity := None; StartComm; SendData; end; if not cm1.WriteCommData(PChar(SendStr),Length(SendStr)) then Exit; viewstring:='发送:'+ SendStr; mmo1.lines.add(viewstring); mmo1.lines.add('' );end;procedure TForm1.cm1ReceiveData(Sender: TObject; Buffer: Pointer; BufferLength: Word);var i:integer; s : string;begin viewstring:='' ; SetLength(S, BufferLength); move(buffer,pchar(s)^,bufferlength) ; mmo1.lines.add('接收:' +s);end; MSCOMM和SPCOMM 这两个控件都可以很好的解决串口通讯问题。网上的相关帮助资料也不少,楼主的问题应该自己可以搞定,浪费了100分。 就用SPCOMM控件,打开,写AT指令,再读取,判断返回的是否为Ok....关键是这里procedure TForm1.cm1ReceiveData(Sender: TObject; Buffer: Pointer; BufferLength: Word); var i:integer; s : pchar; begin getmem(s,bufferlength); fillchar(s,bufferlength,0); move(buffer,s,bufferlength) ; mmo1.lines.add('接收:' +s); 不知道为什么加上这句会报错,无效指针错误 freemem(s,bufferlength); end; 你的问题虽然解决,但不是最佳解决方法。你可以直接将S定义为:s:array[0..100] of char然后把getmem(s,bufferlength); fillchar(s,bufferlength,0); 这两句删掉就可以了。不过你发送过程里面的代码定义S的时候也要一致。 晕,原来你是“稻草人”老兄,你研究的东西确实很多,佩服,现在怎么想起来研究串口通讯了?我还记得你下面的贴子:http://topic.csdn.net/u/20090303/10/b4af3589-90a3-447f-8bad-439ebdb20282.html我知道你在GDI+方法也十分了得,前段时间我花了半个月时间研究GDI+如今也算小有心得! to : mwy654321呵呵,项目要求,没办法老是有些硬件方面的东西要做,不过还好要求都比较简单,谈不上研究了我平时主要是搞图形图像处理,但是水平太差了,希望有机会能跟你交流交流 我也是用spcomm控件进行串口通讯,小有心得,我QQ:5555044 DataSnap保存图片 为什么这些人总能发现 bug? 请问 windows 优化大师 左边儿的那个导航条是用什么控件怎么做出来的呀? 关于频繁的访问数据库,而造成程序占用CPU时间过大的问题?在线等!!! 用adoquery对时间字段的处理(sqlserver数据库) 关于系统剪贴版的问题 送分,dbGrid和dxDbGrid的问题? DELPHI中的STRTOFLOAT是不是有BUG delphi 中指针怎么用? 高分求助!!200分!如何将一个图片存入*.db或*.dbf数据库表格中的图像字段!!! 100分求一个BCB的多媒体Filter的例子 jhhh
var
i:integer;
commflg:boolean;
SendStr : string;
begin
viewstring:='' ;
commflg:=true;
SendStr:=PChar('ATZ' + chr($0d)+chr($0a) );
with cm1 do
begin
CommName := lst1.Items[lst1.ItemIndex];//COM3
BaudRate := 9600;
ByteSize := _8;
Parity := None;
StartComm;
SendData;
end;
if not cm1.WriteCommData(PChar(SendStr),Length(SendStr)) then Exit;
viewstring:='发送:'+ SendStr;
mmo1.lines.add(viewstring);
mmo1.lines.add('' );
end;procedure TForm1.cm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
i:integer;
s : string;
begin
viewstring:='' ;
SetLength(S, BufferLength);
move(buffer,pchar(s)^,bufferlength) ;
mmo1.lines.add('接收:' +s);
end;
procedure TForm1.cm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
i:integer;
s : pchar;
begin
getmem(s,bufferlength);
fillchar(s,bufferlength,0);
move(buffer,s,bufferlength) ;
mmo1.lines.add('接收:' +s);
不知道为什么加上这句会报错,无效指针错误
freemem(s,bufferlength);
end;
你可以直接将S定义为:s:array[0..100] of char
然后把
getmem(s,bufferlength);
fillchar(s,bufferlength,0);
这两句删掉就可以了。不过你发送过程里面的代码定义S的时候也要一致。
呵呵,项目要求,没办法老是有些硬件方面的东西要做,不过还好要求都比较简单,谈不上研究了
我平时主要是搞图形图像处理,但是水平太差了,
希望有机会能跟你交流交流