走过路过朋友请进,帮个忙,急!急!300分(300分)

L

lylyly

Unregistered / Unconfirmed
GUEST, unregistred user!
调用ltm_read_id函数成功后怎样取得idbuf的值

LTM8000D 动态连接库 V1.0 使用说明
-------------------------------------------------------------------------

2.结构说明:
typedef struct tagconfig{
unsigned char oldaddr; //--模块当前地址(有效值: 00h -- FFh);
unsigned char newaddr; //--模块新地址(有效值: 00h -- FFh);
unsigned char type; //--模块类型(有效值: 80h);
unsigned char baud; //--模块波特率(有效值: 0 -- 5);
unsigned char setbaud; //--模块的新波特率(设置模块参数时使用)
//--(有效值: 0 -- 5);
unsigned char form; //--模块数据格式(有效值: 02h);
int total_num; //--模块所接传感器总数目(由DLL库函数
//--设定,有效值: 0-512);
unsigned char ch_status; //--模块的通道状态(由DLL库函数设定,有
//--效值: 00h-FFh);
unsigned char ch_num[8]; //--模块每个通道的传感器数目(由DLL库函
//--数设定,有效值: 0-64);
unsigned char name[8]; //--模块名称(字符串);
unsigned char version[8]; //--模块软件版本(字符串);
}ltmcfg, *lpltmcfg;

3. 错误代码说明:
ERR_OK -1 //--无错误;
ERR_MEMORY -2 //--内存分配错误(DLL内部错误);
ERR_COF -3 //--函数参数错误;
ERR_PORT -4 //--无此COM口,或此口正被其他程序使用;
ERR_INIT -5 //--COM口初始化错误;
ERR_SETUP -6 //--COM口设置错误;
ERR_PORT_NUM -7 //--COM口号与打开的COM口号不匹配;
ERR_NORESPONSE -8 //--模块无响应或此地址的模块不存在;
ERR_RECEIVELESS -9 //--实际收到的数据长度少于应收到的数据长度;
ERR_INVALIDDATA -10 //--收到的数据中有非法数据;

4.函数说明:
(1) --- int WINAPI ltm_com_open(int port, int baud, int rtsdtr);
------------------------------------------------------------------------
说明:
此函数用于打开串行口(此串行口须支持485模式). 此函数必须在其他函数
调用前调用.目前的DLL版本只支持同时打开一个串行口.
参数: (int ----- 32位整数)
port ------- 串行口号:1-8 对应于:COM1--COM8 ;
baud ------- 串行口波特率设置:
0 ----- 1200 BPS
1 ----- 2400 BPS
2 ----- 4800 BPS
3 ----- 9600 BPS
4 ----- 19200 BPS
5 ----- 38400 BPS
rtsdtr ------- 串行口485方向控制设置:
0 ----- 无方向控制(适用于自动判向的232-485转换器);
1 ----- RTS作方向控制,DTR = 1;
2 ----- DTR作方向控制,RTS = 1;
返回值:
ERR_OK -1 //--无错误;
ERR_MEMORY -2 //--内存分配错误(DLL内部错误);
ERR_COF -3 //--函数参数错误;
ERR_PORT -4 //--无此COM口,或此口正被其他程序使用;
ERR_INIT -5 //--COM口初始化错误;
ERR_SETUP -6 //--COM口设置错误;

(2) --- int WINAPI ltm_com_close(int port);
-------------------------------------------------------------------------
说明:
此函数用于关闭已打开的串行口. 应用程序退出前务必要调用此函数.
参数: (int ----- 32位整数)
port ------- 已打开的串行口号:1-8 对应于:COM1--COM8 ;
返回值:
ERR_OK -1 //--无错误;
ERR_MEMORY -2 //--内存分配错误(DLL内部错误);
ERR_COF -3 //--函数参数错误;
ERR_PORT_NUM -7 //--COM口号与打开的COM口号不匹配;
(3) --- int WINAPI ltm_set_config(int port, ltmcfg *cfg);
-------------------------------------------------------------------------
说明:
此函数用于设定模块参数.如:模块地址,波特率等.调用前须先设定好结构cfg
的成员参数.
参数: (int ----- 32位整数;
ltmcfg ---- ltmcfg结构类型,参见说明2)
port ------- 已打开的串行口号:1-8 对应于:COM1--COM8 ;
*cfg ------- 指向ltmcfg类型的指针;
返回值:
ERR_OK -1 //--无错误;
ERR_MEMORY -2 //--内存分配错误(DLL内部错误);
ERR_COF -3 //--函数参数错误;
ERR_PORT_NUM -7 //--COM口号与打开的COM口号不匹配;
ERR_NORESPONSE -8 //--模块无响应或此地址的模块不存在;
ERR_RECEIVELESS -9 //--实际收到的数据长度少于应收到的数据长度;
ERR_INVALIDDATA -10 //--收到的数据中有非法数据;
(4) --- int WINAPI ltm_read_config(int port, unsigned char addr, ltmcfg *cfg);
-------------------------------------------------------------------------
说明:
此函数用于读取指定地址的模块参数.函数正确返回后,将把参数写入结构cfg中.
参数: (int ----- 32位整数;
unsigned char-- 8位无符号整数;
ltmcfg ---- ltmcfg结构类型,参见说明2)
port ------- 已打开的串行口号:1-8 对应于:COM1--COM8 ;
addr ------- 要读取参数的模块地址(有效值: 00h -- FFh);
*cfg ------- 指向ltmcfg类型的指针;
返回值:
ERR_OK -1 //--无错误;
ERR_MEMORY -2 //--内存分配错误(DLL内部错误);
ERR_COF -3 //--函数参数错误;
ERR_PORT_NUM -7 //--COM口号与打开的COM口号不匹配;
ERR_NORESPONSE -8 //--模块无响应或此地址的模块不存在;
ERR_RECEIVELESS -9 //--实际收到的数据长度少于应收到的数据长度;
ERR_INVALIDDATA -10 //--收到的数据中有非法数据;

(5) --- int WINAPI ltm_read_temp(int port, unsigned char addr,
int channel, unsigned char *databuf);
-------------------------------------------------------------------------
说明:
此函数用于读取指定地址的模块温度值.调用次函数前,请先申请好databuf.
函数正确返回后,将把数据写入databuf中.
参数: (int ----- 32位整数;
unsigned char-- 8位无符号整数)
port ------- 已打开的串行口号:1-8 对应于:COM1--COM8 ;
addr ------- 要读取温度的模块地址(有效值: 00h -- FFh);
channel ------- 要读取温度的通道号(有效值: 0 -- 7,8--所有通道);
*databuf------- 指向存储温度值缓冲区的指针;
注:
每个温度点占用 4 个字节, 缓冲区应足够大,能容纳模块最多的温度点.
建议此缓冲区应为: 2100 字节.关于温度值换算方法,请参阅LTM8001模块
说明书.
返回值:
0 到 512的正整数 //--函数调用成功,所读取的温度点数目;
ERR_MEMORY -2 //--内存分配错误(DLL内部错误);
ERR_COF -3 //--函数参数错误;
ERR_PORT_NUM -7 //--COM口号与打开的COM口号不匹配;
ERR_NORESPONSE -8 //--模块无响应或此地址的模块不存在;
ERR_RECEIVELESS -9 //--实际收到的数据长度少于应收到的数据长度;
ERR_INVALIDDATA -10 //--收到的数据中有非法数据;

(6) --- int WINAPI ltm_read_id(int port, unsigned char addr,
int channel,unsigned char *idbuf);
-------------------------------------------------------------------------
说明:
此函数用于读取指定地址的模块所接传感器的序号.调用次函数前,请先申请好idbuf.
函数正确返回后,将把数据写入idbuf中.
参数: (int ----- 32位整数;
unsigned char-- 8位无符号整数)
port ------- 已打开的串行口号:1-8 对应于:COM1--COM8 ;
addr ------- 要读取序号的模块地址(有效值: 00h -- FFh);
channel ------- 要读取序号的通道号(有效值: 0 -- 7,8--所有通道);
*idbuf ------- 指向存储序号值缓冲区的指针;
注:
每个序号占用 8 个字节, 缓冲区应足够大,能容纳模块最多的序号值.
建议此缓冲区应为: 4200 字节.关于序号的详细内容,请参阅LTM8001模块
说明书及DS1820资料.
返回值:
0 到 512的正整数 //--函数调用成功,所读取的序号数目;
ERR_MEMORY -2 //--内存分配错误(DLL内部错误);
ERR_COF -3 //--函数参数错误;
ERR_PORT_NUM -7 //--COM口号与打开的COM口号不匹配;
ERR_NORESPONSE -8 //--模块无响应或此地址的模块不存在;
ERR_RECEIVELESS -9 //--实际收到的数据长度少于应收到的数据长度;
ERR_INVALIDDATA -10 //--收到的数据中有非法数据;

(7) --- int WINAPI ltm_soft_reset(int port, unsigned char addr);
-------------------------------------------------------------------------
说明:
此函数用于软复位指定地址的模块.模块会重新查找传感器数目,根据传感器数目
不同,模块会有5-15秒的时间不响应上位机命令,上位机应等待相应时间后,再发送
命令.
参数: (int ----- 32位整数;
unsigned char-- 8位无符号整数)
port ------- 已打开的串行口号:1-8 对应于:COM1--COM8 ;
addr ------- 要复位模块地址(有效值: 00h -- FFh);
返回值:
ERR_OK -1 //--无错误;
ERR_MEMORY -2 //--内存分配错误(DLL内部错误);
ERR_COF -3 //--函数参数错误;
ERR_PORT_NUM -7 //--COM口号与打开的COM口号不匹配;
ERR_NORESPONSE -8 //--模块无响应或此地址的模块不存在;
ERR_RECEIVELESS -9 //--实际收到的数据长度少于应收到的数据长度;
ERR_INVALIDDATA -10 //--收到的数据中有非法数据;
5. 在VB6.0中使用DLL
1)说明:
Rem 变量声明

Public Type Cfg
oldaddr As Byte
newaddr As Byte
type As Byte
baud As Byte
setbaud As Byte
dataform As Byte
total_num As Long
ch_status As Byte
ch_num(7) As Byte
mname As String * 8
version As String * 8
End Type --------配置结构定义
Public mcfg As Cfg
Public databuf(2100) As Byte
Public idbuf(4200) As Byte
Public port As Long
Public baud As Long
Public channo As Long
Public senNo As Integer
Public freshtime As Long
Public maddress As Long
Public errcode As Long
Rem 动态连接库函数声明
Rem Public Declare Function ltm_com_close Lib "d:/ltm8001/dll/ltm8000d.dll" (ByVal port As Long) As Long
Public Declare Function ltm_com_open Lib "ltm8000d.dll" (ByVal port As Long, ByVal baud As Long, ByVal rtsdtr As Long) As Long
Public Declare Function ltm_com_close Lib "ltm8000d.dll" (ByVal port As Long) As Long
Public Declare Function ltm_read_config Lib "ltm8000d.dll" (ByVal port As Long, ByVal addr As Byte, mcfg As Cfg) As Long
Public Declare Function ltm_read_temp Lib "ltm8000d.dll" (ByVal port As Long, ByVal addr As Byte, ByVal channel As Long, databuf As Any) As Long
Public Declare Function ltm_read_id Lib "ltm8000d.dll" (ByVal port As Long, ByVal addr As Byte, ByVal channel As Long, idbuf As Any) As Long
Public Declare Function ltm_soft_reset Lib "ltm8000d.dll" (ByVal port As Long, ByVal addr As Byte) As Long
Public Declare Function ltm_set_config Lib "ltm8000d.dll" (ByVal port As Long, ByRef mcfg As Cfg) As Long
Public Const ERR_OK As Long = -1, ERR_MEMORY As Long = -2, ERR_COF As Long = -3, ERR_PORT As Long = -4
Public Const ERR_INIT As Long = -5, ERR_SETUP As Long = -6, ERR_PORT_NUM As Long = -7, ERR_NORESPONSE As Long = -8
Public Const ERR_RECEIVELESS As Long = -9, ERR_INVALIDDATA As Long = -10
Public startid As Byte
Public stopid As Byte
2)库函数调用与标准方式相同:
如: errcode = ltm_read_config(port, maddress, mcfg)


原代码:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
Const {databuf^ = 2100;
idbuf^ = 4200;
{databuf = 2100;
idbuf = 4200;}
ERR_OK = -1;
//--无错误;
ERR_MEMORY = -2; //--内存分配错误(DLL内部错误);
ERR_COF = -3; //--函数参数错误;
ERR_PORT = -4;
//--无此COM口,或此口正被其他程序使用;
ERR_INIT = -5; //--COM口初始化错误;
ERR_SETUP = -6; //--COM口设置错误;
ERR_PORT_NUM = -7; //--COM口号与打开的COM口号不匹配;
ERR_NORESPONSE = -8; //--模块无响应或此地址的模块不存在;
ERR_RECEIVELESS = -9; //--实际收到的数据长度少于应收到的数据长度;
ERR_INVALIDDATA = -10; //--收到的数据中有非法数据;
type Tcfg = record
oldaddr: Byte;
newaddr: Byte;
type1: 128..128;//byte
baud: 0..5;//byte
setbaud: 0..5;//byte
form: 2..2;//byte
total_num: LongInt;
ch_status: Byte;
ch_num: array [0..7] of 0..64;//byte
mname: String;
version: String;
end;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Edit2: TEdit;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
port, baud, stsdtr,channo,freshtime,maddress,errcode :LongInt;
senNo:Integer;
cfg:Tcfg;
// lpltmcfg:^Tcfg;
{ Public declarations }
end;

var
Form1: TForm1;
function ltm_com_open(port:LongInt;baud:LongInt;rtsdtr:LongInt):LongInt;stdcall;external 'ltm8000d';//打开串行口
function ltm_com_close(port:LongInt):LongInt;stdcall;external 'ltm8000d';//关闭串行口
function ltm_set_config(port:LongInt;cfg:Tcfg):LongInt;stdcall;external 'ltm8000d';//设定模块参数
function ltm_read_config(port:LongInt;addr:Byte;cfg:Tcfg):LongInt;stdcall;external 'ltm8000d';//读取指定地址模块参数
// function ltm_read_temp(port:LongInt;addr:Byte;channel:LongInt;databuf:Integer):LongInt;stdcall;external 'ltm8000d';//读取指定地址模块传感器温度
// function ltm_read_id(port:LongInt;addr:Byte;channel:LongInt;idbuf:Integer):LongInt;stdcall;external 'ltm8000d';//读取指定地址模块传感器序号
function ltm_read_temp(port:LongInt;addr:Byte;channel:LongInt;databuf:pointer):LongInt;stdcall;external 'ltm8000d';//读取指定地址模块传感器温度
function ltm_read_id(port:LongInt;addr:Byte;channel:LongInt;idbuf:pointer):LongInt;stdcall;external 'ltm8000d';//读取指定地址模块传感器序号
function ltm_soft_reset(port:LongInt;addr:Byte):LongInt;stdcall;external 'ltm8000d';//软复位地址模块

implementation
{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
port := StrToInt(Edit1.Text);
baud :=3;
stsdtr := 1;
{ addr := 0;//模块地址
channel := 0;//通道号}
errcode := ltm_com_open(port,baud,stsdtr);
ShowMessage(IntToStr(errcode));
errcode := ltm_soft_reset(port,0);
ShowMessage(IntToStr(errcode));
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
port := StrToInt(Edit1.Text);
ShowMessage(IntToStr(ltm_com_close(port)));
end;

procedure TForm1.Button3Click(Sender: TObject);
Var databufh,idbufh:^Integer;
ss:String;
begin
errcode := ltm_com_open(2,3,1);

errcode := ltm_read_temp(2,0,0,databufh);
ShowMessage(IntToStr(errcode));
errcode := ltm_read_id(2,0,0,idbufh);//怎样取得idbufh的值
{ SetLength(ss,4200);
Move(idbufh^,Pchar(ss)^,4200);}
ShowMessage(IntToStr(errcode));
end;

end.
 
试试这样
var
idbufh: array[0..4199] of Byte;
begin
...
errcode := ltm_read_id(2,0,0,Pointer(@idbufh));
...
end;
 
太复杂了!
 
简练些好
 
wangxd,这是最简的了.
调用ltm_read_id函数成功后怎样取得idbuf的值

LTM8000D 动态连接库 V1.0 使用说明
-------------------------------------------------------------------------

2.结构说明:
typedef struct tagconfig{
unsigned char oldaddr; //--模块当前地址(有效值: 00h -- FFh);
unsigned char newaddr; //--模块新地址(有效值: 00h -- FFh);
unsigned char type; //--模块类型(有效值: 80h);
unsigned char baud; //--模块波特率(有效值: 0 -- 5);
unsigned char setbaud; //--模块的新波特率(设置模块参数时使用)
//--(有效值: 0 -- 5);
unsigned char form; //--模块数据格式(有效值: 02h);
int total_num; //--模块所接传感器总数目(由DLL库函数
//--设定,有效值: 0-512);
unsigned char ch_status; //--模块的通道状态(由DLL库函数设定,有
//--效值: 00h-FFh);
unsigned char ch_num[8]; //--模块每个通道的传感器数目(由DLL库函
//--数设定,有效值: 0-64);
unsigned char name[8]; //--模块名称(字符串);
unsigned char version[8]; //--模块软件版本(字符串);
}ltmcfg, *lpltmcfg;

3. 错误代码说明:
ERR_OK -1 //--无错误;
ERR_MEMORY -2 //--内存分配错误(DLL内部错误);
ERR_COF -3 //--函数参数错误;
ERR_PORT -4 //--无此COM口,或此口正被其他程序使用;
ERR_INIT -5 //--COM口初始化错误;
ERR_SETUP -6 //--COM口设置错误;
ERR_PORT_NUM -7 //--COM口号与打开的COM口号不匹配;
ERR_NORESPONSE -8 //--模块无响应或此地址的模块不存在;
ERR_RECEIVELESS -9 //--实际收到的数据长度少于应收到的数据长度;
ERR_INVALIDDATA -10 //--收到的数据中有非法数据;

4.函数说明:
(1) --- int WINAPI ltm_com_open(int port, int baud, int rtsdtr);
------------------------------------------------------------------------
说明:
此函数用于打开串行口(此串行口须支持485模式). 此函数必须在其他函数
调用前调用.目前的DLL版本只支持同时打开一个串行口.
参数: (int ----- 32位整数)
port ------- 串行口号:1-8 对应于:COM1--COM8 ;
baud ------- 串行口波特率设置:
0 ----- 1200 BPS
1 ----- 2400 BPS
2 ----- 4800 BPS
3 ----- 9600 BPS
4 ----- 19200 BPS
5 ----- 38400 BPS
rtsdtr ------- 串行口485方向控制设置:
0 ----- 无方向控制(适用于自动判向的232-485转换器);
1 ----- RTS作方向控制,DTR = 1;
2 ----- DTR作方向控制,RTS = 1;
返回值:
ERR_OK -1 //--无错误;
ERR_MEMORY -2 //--内存分配错误(DLL内部错误);
ERR_COF -3 //--函数参数错误;
ERR_PORT -4 //--无此COM口,或此口正被其他程序使用;
ERR_INIT -5 //--COM口初始化错误;
ERR_SETUP -6 //--COM口设置错误;

(2) --- int WINAPI ltm_com_close(int port);
-------------------------------------------------------------------------
说明:
此函数用于关闭已打开的串行口. 应用程序退出前务必要调用此函数.
参数: (int ----- 32位整数)
port ------- 已打开的串行口号:1-8 对应于:COM1--COM8 ;
返回值:
ERR_OK -1 //--无错误;
ERR_MEMORY -2 //--内存分配错误(DLL内部错误);
ERR_COF -3 //--函数参数错误;
ERR_PORT_NUM -7 //--COM口号与打开的COM口号不匹配;
(3) --- int WINAPI ltm_set_config(int port, ltmcfg *cfg);
-------------------------------------------------------------------------
说明:
此函数用于设定模块参数.如:模块地址,波特率等.调用前须先设定好结构cfg
的成员参数.
参数: (int ----- 32位整数;
ltmcfg ---- ltmcfg结构类型,参见说明2)
port ------- 已打开的串行口号:1-8 对应于:COM1--COM8 ;
*cfg ------- 指向ltmcfg类型的指针;
返回值:
ERR_OK -1 //--无错误;
ERR_MEMORY -2 //--内存分配错误(DLL内部错误);
ERR_COF -3 //--函数参数错误;
ERR_PORT_NUM -7 //--COM口号与打开的COM口号不匹配;
ERR_NORESPONSE -8 //--模块无响应或此地址的模块不存在;
ERR_RECEIVELESS -9 //--实际收到的数据长度少于应收到的数据长度;
ERR_INVALIDDATA -10 //--收到的数据中有非法数据;
(4) --- int WINAPI ltm_read_config(int port, unsigned char addr, ltmcfg *cfg);
-------------------------------------------------------------------------
说明:
此函数用于读取指定地址的模块参数.函数正确返回后,将把参数写入结构cfg中.
参数: (int ----- 32位整数;
unsigned char-- 8位无符号整数;
ltmcfg ---- ltmcfg结构类型,参见说明2)
port ------- 已打开的串行口号:1-8 对应于:COM1--COM8 ;
addr ------- 要读取参数的模块地址(有效值: 00h -- FFh);
*cfg ------- 指向ltmcfg类型的指针;
返回值:
ERR_OK -1 //--无错误;
ERR_MEMORY -2 //--内存分配错误(DLL内部错误);
ERR_COF -3 //--函数参数错误;
ERR_PORT_NUM -7 //--COM口号与打开的COM口号不匹配;
ERR_NORESPONSE -8 //--模块无响应或此地址的模块不存在;
ERR_RECEIVELESS -9 //--实际收到的数据长度少于应收到的数据长度;
ERR_INVALIDDATA -10 //--收到的数据中有非法数据;

(5) --- int WINAPI ltm_read_temp(int port, unsigned char addr,
int channel, unsigned char *databuf);
-------------------------------------------------------------------------
说明:
此函数用于读取指定地址的模块温度值.调用次函数前,请先申请好databuf.
函数正确返回后,将把数据写入databuf中.
参数: (int ----- 32位整数;
unsigned char-- 8位无符号整数)
port ------- 已打开的串行口号:1-8 对应于:COM1--COM8 ;
addr ------- 要读取温度的模块地址(有效值: 00h -- FFh);
channel ------- 要读取温度的通道号(有效值: 0 -- 7,8--所有通道);
*databuf------- 指向存储温度值缓冲区的指针;
注:
每个温度点占用 4 个字节, 缓冲区应足够大,能容纳模块最多的温度点.
建议此缓冲区应为: 2100 字节.关于温度值换算方法,请参阅LTM8001模块
说明书.
返回值:
0 到 512的正整数 //--函数调用成功,所读取的温度点数目;
ERR_MEMORY -2 //--内存分配错误(DLL内部错误);
ERR_COF -3 //--函数参数错误;
ERR_PORT_NUM -7 //--COM口号与打开的COM口号不匹配;
ERR_NORESPONSE -8 //--模块无响应或此地址的模块不存在;
ERR_RECEIVELESS -9 //--实际收到的数据长度少于应收到的数据长度;
ERR_INVALIDDATA -10 //--收到的数据中有非法数据;

(6) --- int WINAPI ltm_read_id(int port, unsigned char addr,
int channel,unsigned char *idbuf);
-------------------------------------------------------------------------
说明:
此函数用于读取指定地址的模块所接传感器的序号.调用次函数前,请先申请好idbuf.
函数正确返回后,将把数据写入idbuf中.
参数: (int ----- 32位整数;
unsigned char-- 8位无符号整数)
port ------- 已打开的串行口号:1-8 对应于:COM1--COM8 ;
addr ------- 要读取序号的模块地址(有效值: 00h -- FFh);
channel ------- 要读取序号的通道号(有效值: 0 -- 7,8--所有通道);
*idbuf ------- 指向存储序号值缓冲区的指针;
注:
每个序号占用 8 个字节, 缓冲区应足够大,能容纳模块最多的序号值.
建议此缓冲区应为: 4200 字节.关于序号的详细内容,请参阅LTM8001模块
说明书及DS1820资料.
返回值:
0 到 512的正整数 //--函数调用成功,所读取的序号数目;
ERR_MEMORY -2 //--内存分配错误(DLL内部错误);
ERR_COF -3 //--函数参数错误;
ERR_PORT_NUM -7 //--COM口号与打开的COM口号不匹配;
ERR_NORESPONSE -8 //--模块无响应或此地址的模块不存在;
ERR_RECEIVELESS -9 //--实际收到的数据长度少于应收到的数据长度;
ERR_INVALIDDATA -10 //--收到的数据中有非法数据;

(7) --- int WINAPI ltm_soft_reset(int port, unsigned char addr);
-------------------------------------------------------------------------
说明:
此函数用于软复位指定地址的模块.模块会重新查找传感器数目,根据传感器数目
不同,模块会有5-15秒的时间不响应上位机命令,上位机应等待相应时间后,再发送
命令.
参数: (int ----- 32位整数;
unsigned char-- 8位无符号整数)
port ------- 已打开的串行口号:1-8 对应于:COM1--COM8 ;
addr ------- 要复位模块地址(有效值: 00h -- FFh);
返回值:
ERR_OK -1 //--无错误;
ERR_MEMORY -2 //--内存分配错误(DLL内部错误);
ERR_COF -3 //--函数参数错误;
ERR_PORT_NUM -7 //--COM口号与打开的COM口号不匹配;
ERR_NORESPONSE -8 //--模块无响应或此地址的模块不存在;
ERR_RECEIVELESS -9 //--实际收到的数据长度少于应收到的数据长度;
ERR_INVALIDDATA -10 //--收到的数据中有非法数据;

原代码:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
Const {databuf^ = 2100;
idbuf^ = 4200;
{databuf = 2100;
idbuf = 4200;}
ERR_OK = -1;
//--无错误;
ERR_MEMORY = -2; //--内存分配错误(DLL内部错误);
ERR_COF = -3; //--函数参数错误;
ERR_PORT = -4;
//--无此COM口,或此口正被其他程序使用;
ERR_INIT = -5; //--COM口初始化错误;
ERR_SETUP = -6; //--COM口设置错误;
ERR_PORT_NUM = -7; //--COM口号与打开的COM口号不匹配;
ERR_NORESPONSE = -8; //--模块无响应或此地址的模块不存在;
ERR_RECEIVELESS = -9; //--实际收到的数据长度少于应收到的数据长度;
ERR_INVALIDDATA = -10; //--收到的数据中有非法数据;
type Tcfg = record
oldaddr: Byte;
newaddr: Byte;
type1: 128..128;//byte
baud: 0..5;//byte
setbaud: 0..5;//byte
form: 2..2;//byte
total_num: LongInt;
ch_status: Byte;
ch_num: array [0..7] of 0..64;//byte
mname: String;
version: String;
end;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Edit2: TEdit;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
port, baud, stsdtr,channo,freshtime,maddress,errcode :LongInt;
senNo:Integer;
cfg:Tcfg;
// lpltmcfg:^Tcfg;
{ Public declarations }
end;

var
Form1: TForm1;
function ltm_com_open(port:LongInt;baud:LongInt;rtsdtr:LongInt):LongInt;stdcall;external 'ltm8000d';//打开串行口
function ltm_com_close(port:LongInt):LongInt;stdcall;external 'ltm8000d';//关闭串行口
function ltm_set_config(port:LongInt;cfg:Tcfg):LongInt;stdcall;external 'ltm8000d';//设定模块参数
function ltm_read_config(port:LongInt;addr:Byte;cfg:Tcfg):LongInt;stdcall;external 'ltm8000d';//读取指定地址模块参数
// function ltm_read_temp(port:LongInt;addr:Byte;channel:LongInt;databuf:Integer):LongInt;stdcall;external 'ltm8000d';//读取指定地址模块传感器温度
// function ltm_read_id(port:LongInt;addr:Byte;channel:LongInt;idbuf:Integer):LongInt;stdcall;external 'ltm8000d';//读取指定地址模块传感器序号
function ltm_read_temp(port:LongInt;addr:Byte;channel:LongInt;databuf:pointer):LongInt;stdcall;external 'ltm8000d';//读取指定地址模块传感器温度
function ltm_read_id(port:LongInt;addr:Byte;channel:LongInt;idbuf:pointer):LongInt;stdcall;external 'ltm8000d';//读取指定地址模块传感器序号
function ltm_soft_reset(port:LongInt;addr:Byte):LongInt;stdcall;external 'ltm8000d';//软复位地址模块

implementation
{$R *.DFM}

procedure TForm1.Button3Click(Sender: TObject);
Var databufh,idbufh:^Integer;
ss:String;
begin
errcode := ltm_com_open(2,3,1);
errcode := ltm_read_id(2,0,0,idbufh);//怎样取得idbufh的值
errcode := ltm_read_config(2,0,cfg);//这样调用是否正确,我没有成功
end;

end.
 
没试我的方法?
试试就成了,要不这样:
type
Pidbufh=^Tidbufh;
Tidbufh=array[0..4199]of byte;
PCfg=^TCfg;
Tcfg=...;
...
...
var
idbufh: Pidbufh;
cfg: pcfg;
...
begin
...
errcode := ltm_read_id(2,0,0,idbufh);//idbufh是个数组,怎么取不用说了吧
errcode := ltm_read_config(2,0,cfg);
//cfg是指向记录的指针
...
end;
 
DoubleWood 不知是ltm_read_config函数定义错误还是cfg这个记录指针的结构定义错误。
调用以后返回值是-1,很正确,但最后会显示访问违返地址错误。请再帮看一下cfg结构和
ltm_read_config函数的定义是否正确。非常感激!
 
cfg 结构有错,
type Tcfg = record
oldaddr: Byte;
newaddr: Byte;
type1: 128..128;//byte
baud: 0..5;//byte
setbaud: 0..5;//byte
form: 2..2;//byte
total_num: LongInt;
ch_status: Byte;
ch_num: array [0..7] of 0..64;//byte
mname: String;
//这里错了!!!
version: String;
//这里错了!!!
end
改为:
...
mname: array[0..7] of char;
version: array[0..7] of char;
...
 
DoubleWood 我重新定义了Tcfg的结构,但是还不行。
 
读哪个成员出错?
是原来定义为string的两个吗?
可能要这样:
type
Pcfgstr=^Tcfgstr;
Tcfgstr=array[0..7] of char;
...
mname: Pcfgstr;
version: Pcfgstr;
...
另:太长了,刷新要很久:(
 
DoubleWodd非常感谢,搞定了,把Tcfg当无类型指针就行了.
 

Similar threads

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