之前没用过C#,目前也是边学边开发,网上关于联迪读卡器、Pos的资料少之又少,研究了好几天还是没有调通,希望有调过联迪dll的大神指点一下!
1、dll函数说明:
int __stdcall BankTrans(char * InputData, char* OutPutData)
输入参数InputData:
typedef struct
{
char trans[2]; /*交易类型:( '10'-获取卡号 '00'-签到 '01'-消费 '02'-消费撤销 '03'- 隔日退货 '04'-查询 '05-重打印 '06-结算 '07'-批量退货 )*/
char CardType[2]; /*卡类型*/
char amount[12]; /* 金额(12字节,无小数点,左补0,单位:分)*/
char card_no[20]; /*卡号 (20字节,左对齐,不足部分补空格)*/
char old_reference[12]; /*原交易参考号*/
char old_trace[6]; /*原交易流水号*/
char UserNO[15]; /*原交易商户号*/
char TerNO[15]; /*原交易终端号*/
char Date[8]; /*原交易日期yyyymmdd*/
char VerifyInfo[300]; // 认证数据
} InputData;
输出 OutPutData,结构体如下
typedef struct
{
char resp_code[2];/*0~1位 返回码 ( 2字节, "00"成功)*/
char card_no[20];/*卡号 (20字节,左对齐,不足部分补空格)*/
char amount[12];/* 金额(12字节,无小数点,左补0,单位:分)*/
char reference[12]; /*交易参考号*/
char trace[6]; /*流水号 (6字节,左对齐)*/
char UserNO[15]; /*商户号*/
char TerNO[15]; /*终端号*/
char CardType[2]; /*卡类型*/
char expr[4];/*有效期 (4字节) */
char BatchNo[10];/*批次号*/
char Date[8]; /*交易日期yyyymmdd*/
char Time[6]; /*交易时间hhmmss*/
char CardName[20]; /*发卡行中文名*/
char old_amount[12];/* 原交易金额(12字节,无小数点,左补0,单位:分)*/
char old_reference[12]; /*原交易参考号 */
char old_trace[6]; /*原交易流水号*/
char old_UserNO[15]; /*原交易商户号*/
char old_TerNO[15]; /*原交易终端号*/
char old_Date[8]; /*原交易日期yyyymmdd*/
char resp_chin[100];/*86~185位 错误说明(40字节,左对齐,不足部分补空格)*/
} OutPutData;
2、我在c#里引用dll方法里是这么定义的
[DllImport("MisPos.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int BankTrans(INPUT_MIS request, StringBuilder response);
[StructLayout(LayoutKind.Sequential)]
public struct INPUT_MIS
{
/*交易类型:('10'-获取卡号 '00'-签到 '01'-消费 '02'-消费撤销 '03'- 隔日退货 '04'-查询 '05-重打印 '06-结算 '07'-批量退货 )*/
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 2)]
public string trans;
}
[StructLayout(LayoutKind.Sequential)]
public struct OUTPUT_MIS
{
/*0~1位 返回码 ( 2字节, "00"成功)*/
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 2)] //这里的2就是数组长度
public string resp_code;
/*卡号 (20字节,左对齐,不足部分补空格)*/
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string card_no;
/*卡类型*/
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 2)]
public string CardType;
/*错误说明*/
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
public string resp_chin;
}
输入输出类型定义为 结构体、StringBuilder还是 IntPtr ?? 我都试了一遍
3、具体调用:
INPUT_MIS input = new INPUT_MIS();
StringBuilder output = new StringBuilder(2000);
input.trans = "10";
//调用
int result = LDE820D.LDE820D.BankTrans(input, output);
MessageBox.Show("result:" + result + "----" + output);
4、返回结果为:
5、联迪设备是串口设备,测试demo需要根据自己电脑设备管理器修改串口号,这种设备是可以直接调dll还是通过打开串口那种模式开发。
像神思的设备直接调dll就可以驱动读卡器读卡,扫码墩切成串口模式就需要通过打开串口来接收数据,联迪的这种应该怎么弄呢????